[NEW_FEATURE] Add NPPN_FILESAVED and NPPN_FILEBEFORESAVE notifications.
Enhance the File save Dialog (add ext). git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository@50 f5eea248-9336-0410-98b8-ebc06183d4e3
This commit is contained in:
parent
5b4eae3332
commit
a088bf7f0f
@ -211,7 +211,7 @@ enum winVer{WV_UNKNOWN, WV_WIN32S, WV_95, WV_98, WV_ME, WV_NT, WV_W2K, WV_XP, WV
|
|||||||
//scnNotification->nmhdr.hwndFrom = hwndNpp;
|
//scnNotification->nmhdr.hwndFrom = hwndNpp;
|
||||||
//scnNotification->nmhdr.idFrom = 0;
|
//scnNotification->nmhdr.idFrom = 0;
|
||||||
|
|
||||||
#define NPPN_FILECLOSED (NPPN_FIRST + 5) // To notify plugins that the current file is about to be closed
|
#define NPPN_FILECLOSED (NPPN_FIRST + 5) // To notify plugins that the current file is just closed
|
||||||
//scnNotification->nmhdr.code = NPPN_FILECLOSED;
|
//scnNotification->nmhdr.code = NPPN_FILECLOSED;
|
||||||
//scnNotification->nmhdr.hwndFrom = hwndNpp;
|
//scnNotification->nmhdr.hwndFrom = hwndNpp;
|
||||||
//scnNotification->nmhdr.idFrom = 0;
|
//scnNotification->nmhdr.idFrom = 0;
|
||||||
@ -221,4 +221,14 @@ enum winVer{WV_UNKNOWN, WV_WIN32S, WV_95, WV_98, WV_ME, WV_NT, WV_W2K, WV_XP, WV
|
|||||||
//scnNotification->nmhdr.hwndFrom = hwndNpp;
|
//scnNotification->nmhdr.hwndFrom = hwndNpp;
|
||||||
//scnNotification->nmhdr.idFrom = 0;
|
//scnNotification->nmhdr.idFrom = 0;
|
||||||
|
|
||||||
|
#define NPPN_FILEBEFORESAVE (NPPN_FIRST + 7) // To notify plugins that the current file is about to be saved
|
||||||
|
//scnNotification->nmhdr.code = NPPN_FILEBEFOREOPEN;
|
||||||
|
//scnNotification->nmhdr.hwndFrom = hwndNpp;
|
||||||
|
//scnNotification->nmhdr.idFrom = 0;
|
||||||
|
|
||||||
|
#define NPPN_FILESAVED (NPPN_FIRST + 8) // To notify plugins that the current file is just saved
|
||||||
|
//scnNotification->nmhdr.code = NPPN_FILECLOSED;
|
||||||
|
//scnNotification->nmhdr.hwndFrom = hwndNpp;
|
||||||
|
//scnNotification->nmhdr.idFrom = 0;
|
||||||
|
|
||||||
#endif //NOTEPAD_PLUS_MSGS_H
|
#endif //NOTEPAD_PLUS_MSGS_H
|
||||||
|
@ -524,12 +524,8 @@ string exts2Filters(string exts) {
|
|||||||
return filters;
|
return filters;
|
||||||
};
|
};
|
||||||
|
|
||||||
void Notepad_plus::fileOpen()
|
void Notepad_plus::setFileOpenSaveDlgFilters(FileDialog & fDlg)
|
||||||
{
|
{
|
||||||
FileDialog fDlg(_hSelf, _hInst);
|
|
||||||
fDlg.setExtFilter("All types", ".*", NULL);
|
|
||||||
|
|
||||||
|
|
||||||
NppParameters *pNppParam = NppParameters::getInstance();
|
NppParameters *pNppParam = NppParameters::getInstance();
|
||||||
NppGUI & nppGUI = (NppGUI & )pNppParam->getNppGUI();
|
NppGUI & nppGUI = (NppGUI & )pNppParam->getNppGUI();
|
||||||
|
|
||||||
@ -578,6 +574,14 @@ void Notepad_plus::fileOpen()
|
|||||||
}
|
}
|
||||||
l = (NppParameters::getInstance())->getLangFromIndex(i++);
|
l = (NppParameters::getInstance())->getLangFromIndex(i++);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Notepad_plus::fileOpen()
|
||||||
|
{
|
||||||
|
FileDialog fDlg(_hSelf, _hInst);
|
||||||
|
fDlg.setExtFilter("All types", ".*", NULL);
|
||||||
|
|
||||||
|
setFileOpenSaveDlgFilters(fDlg);
|
||||||
|
|
||||||
if (stringVector *pfns = fDlg.doOpenMultiFilesDlg())
|
if (stringVector *pfns = fDlg.doOpenMultiFilesDlg())
|
||||||
{
|
{
|
||||||
@ -645,6 +649,13 @@ bool Notepad_plus::doSave(const char *filename, UniMode mode)
|
|||||||
|
|
||||||
if (fp)
|
if (fp)
|
||||||
{
|
{
|
||||||
|
// Notify plugins that current file is about to be saved
|
||||||
|
SCNotification scnN;
|
||||||
|
scnN.nmhdr.code = NPPN_FILEBEFORESAVE;
|
||||||
|
scnN.nmhdr.hwndFrom = _hSelf;
|
||||||
|
scnN.nmhdr.idFrom = 0;
|
||||||
|
_pluginsManager.notify(&scnN);
|
||||||
|
|
||||||
char data[blockSize + 1];
|
char data[blockSize + 1];
|
||||||
int lengthDoc = _pEditView->getCurrentDocLen();
|
int lengthDoc = _pEditView->getCurrentDocLen();
|
||||||
for (int i = 0; i < lengthDoc; i += blockSize)
|
for (int i = 0; i < lengthDoc; i += blockSize)
|
||||||
@ -666,6 +677,9 @@ bool Notepad_plus::doSave(const char *filename, UniMode mode)
|
|||||||
|
|
||||||
if (isSys)
|
if (isSys)
|
||||||
::SetFileAttributes(filename, attrib | FILE_ATTRIBUTE_SYSTEM);
|
::SetFileAttributes(filename, attrib | FILE_ATTRIBUTE_SYSTEM);
|
||||||
|
|
||||||
|
scnN.nmhdr.code = NPPN_FILESAVED;
|
||||||
|
_pluginsManager.notify(&scnN);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
::MessageBox(_hSelf, "Please check whether if this file is opened in another program", "Save failed", MB_OK);
|
::MessageBox(_hSelf, "Please check whether if this file is opened in another program", "Save failed", MB_OK);
|
||||||
@ -1010,18 +1024,8 @@ bool Notepad_plus::fileSaveAs()
|
|||||||
FileDialog fDlg(_hSelf, _hInst);
|
FileDialog fDlg(_hSelf, _hInst);
|
||||||
|
|
||||||
fDlg.setExtFilter("All types", ".*", NULL);
|
fDlg.setExtFilter("All types", ".*", NULL);
|
||||||
|
setFileOpenSaveDlgFilters(fDlg);
|
||||||
|
|
||||||
fDlg.setExtFilter("c src file", ".c", NULL);
|
|
||||||
fDlg.setExtFilter("c++ src file", ".cpp", NULL);
|
|
||||||
fDlg.setExtFilter("Window Resource File", ".rc", NULL);
|
|
||||||
fDlg.setExtFilter("c/c++ header file", ".h", NULL);
|
|
||||||
fDlg.setExtFilter("Java src file", ".java", NULL);
|
|
||||||
fDlg.setExtFilter("HTML file", ".html", NULL);
|
|
||||||
fDlg.setExtFilter("XML file", ".xml", NULL);
|
|
||||||
fDlg.setExtFilter("php file", ".php",NULL);
|
|
||||||
fDlg.setExtFilter("ini file", ".ini", NULL);
|
|
||||||
fDlg.setExtFilter("bat file", ".bat", NULL);
|
|
||||||
fDlg.setExtFilter("Normal text file", ".txt", NULL);
|
|
||||||
char str[MAX_PATH];
|
char str[MAX_PATH];
|
||||||
strcpy(str, _pEditView->getCurrentTitle());
|
strcpy(str, _pEditView->getCurrentTitle());
|
||||||
|
|
||||||
|
@ -74,6 +74,8 @@ struct iconLocator {
|
|||||||
: listIndex(iList), iconIndex(iIcon), iconLocation(iconLoc){};
|
: listIndex(iList), iconIndex(iIcon), iconLocation(iconLoc){};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class FileDialog;
|
||||||
|
|
||||||
class Notepad_plus : public Window {
|
class Notepad_plus : public Window {
|
||||||
public:
|
public:
|
||||||
Notepad_plus();
|
Notepad_plus();
|
||||||
@ -926,6 +928,8 @@ private:
|
|||||||
hideLinesMarkDelete(_hideLinesMarks[i].second, MARK_HIDELINESEND);
|
hideLinesMarkDelete(_hideLinesMarks[i].second, MARK_HIDELINESEND);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void setFileOpenSaveDlgFilters(FileDialog & fDlg);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //NOTEPAD_PLUS_H
|
#endif //NOTEPAD_PLUS_H
|
||||||
|
@ -376,13 +376,14 @@ BEGIN
|
|||||||
END
|
END
|
||||||
MENUITEM "Unfold all\tAlt+Shift+0", IDM_VIEW_TOGGLE_UNFOLDALL
|
MENUITEM "Unfold all\tAlt+Shift+0", IDM_VIEW_TOGGLE_UNFOLDALL
|
||||||
MENUITEM SEPARATOR
|
MENUITEM SEPARATOR
|
||||||
MENUITEM "Hide lines", IDM_VIEW_HIDELINES
|
MENUITEM "Hide lines\tAlt+H", IDM_VIEW_HIDELINES
|
||||||
MENUITEM SEPARATOR
|
MENUITEM SEPARATOR
|
||||||
MENUITEM "Go to another view", IDM_VIEW_GOTO_ANOTHER_VIEW
|
MENUITEM "Go to another view", IDM_VIEW_GOTO_ANOTHER_VIEW
|
||||||
MENUITEM "Clone to another view", IDM_VIEW_CLONE_TO_ANOTHER_VIEW
|
MENUITEM "Clone to another view", IDM_VIEW_CLONE_TO_ANOTHER_VIEW
|
||||||
MENUITEM "Synchronize Vertical Scrolling", IDM_VIEW_SYNSCROLLV
|
MENUITEM "Synchronize Vertical Scrolling", IDM_VIEW_SYNSCROLLV
|
||||||
MENUITEM "Synchronize Horizontal Scrolling", IDM_VIEW_SYNSCROLLH
|
MENUITEM "Synchronize Horizontal Scrolling", IDM_VIEW_SYNSCROLLH
|
||||||
END
|
END
|
||||||
|
|
||||||
POPUP "For&mat"
|
POPUP "For&mat"
|
||||||
BEGIN
|
BEGIN
|
||||||
MENUITEM "Convert to Windows Format", IDM_FORMAT_TODOS
|
MENUITEM "Convert to Windows Format", IDM_FORMAT_TODOS
|
||||||
@ -604,6 +605,7 @@ BEGIN
|
|||||||
"L", IDM_EDIT_LTR, VIRTKEY, CONTROL, ALT
|
"L", IDM_EDIT_LTR, VIRTKEY, CONTROL, ALT
|
||||||
"R", IDM_EDIT_RTL, VIRTKEY, CONTROL, ALT
|
"R", IDM_EDIT_RTL, VIRTKEY, CONTROL, ALT
|
||||||
"C", IDM_EDIT_COLUMNMODE, VIRTKEY, ALT
|
"C", IDM_EDIT_COLUMNMODE, VIRTKEY, ALT
|
||||||
|
"H", IDM_VIEW_HIDELINES, VIRTKEY, ALT
|
||||||
|
|
||||||
VK_HOME, IDC_KEY_HOME, VIRTKEY
|
VK_HOME, IDC_KEY_HOME, VIRTKEY
|
||||||
VK_END, IDC_KEY_END, VIRTKEY
|
VK_END, IDC_KEY_END, VIRTKEY
|
||||||
|
@ -17,11 +17,11 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include "FileDialog.h"
|
#include "FileDialog.h"
|
||||||
|
|
||||||
//FileDialog *FileDialog::staticThis = NULL;
|
FileDialog *FileDialog::staticThis = NULL;
|
||||||
|
|
||||||
FileDialog::FileDialog(HWND hwnd, HINSTANCE hInst)
|
FileDialog::FileDialog(HWND hwnd, HINSTANCE hInst)
|
||||||
: _nbCharFileExt(0), _nbExt(0)
|
: _nbCharFileExt(0), _nbExt(0)
|
||||||
{//staticThis = this;
|
{staticThis = this;
|
||||||
for (int i = 0 ; i < nbExtMax ; i++)
|
for (int i = 0 ; i < nbExtMax ; i++)
|
||||||
_extArray[i][0] = '\0';
|
_extArray[i][0] = '\0';
|
||||||
|
|
||||||
@ -43,6 +43,7 @@ FileDialog::FileDialog(HWND hwnd, HINSTANCE hInst)
|
|||||||
_ofn.lpstrTitle = NULL;
|
_ofn.lpstrTitle = NULL;
|
||||||
_ofn.nFileOffset = 0;
|
_ofn.nFileOffset = 0;
|
||||||
_ofn.nFileExtension = 0;
|
_ofn.nFileExtension = 0;
|
||||||
|
_ofn.lpfnHook = NULL;
|
||||||
_ofn.lpstrDefExt = NULL; // No default extension
|
_ofn.lpstrDefExt = NULL; // No default extension
|
||||||
_ofn.lCustData = 0;
|
_ofn.lCustData = 0;
|
||||||
_ofn.Flags = OFN_PATHMUSTEXIST | OFN_EXPLORER | OFN_LONGNAMES | DS_CENTER | OFN_HIDEREADONLY;
|
_ofn.Flags = OFN_PATHMUSTEXIST | OFN_EXPLORER | OFN_LONGNAMES | DS_CENTER | OFN_HIDEREADONLY;
|
||||||
@ -186,6 +187,9 @@ char * FileDialog::doSaveDlg()
|
|||||||
|
|
||||||
_ofn.Flags |= OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;
|
_ofn.Flags |= OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY;
|
||||||
|
|
||||||
|
_ofn.Flags |= OFN_ENABLEHOOK;
|
||||||
|
_ofn.lpfnHook = OFNHookProc;
|
||||||
|
|
||||||
char *fn = NULL;
|
char *fn = NULL;
|
||||||
try {
|
try {
|
||||||
fn = ::GetSaveFileName(&_ofn)?_fileName:NULL;
|
fn = ::GetSaveFileName(&_ofn)?_fileName:NULL;
|
||||||
@ -196,7 +200,7 @@ char * FileDialog::doSaveDlg()
|
|||||||
return (fn);
|
return (fn);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
UINT_PTR CALLBACK FileDialog::OFNHookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
UINT_PTR CALLBACK FileDialog::OFNHookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
switch(uMsg)
|
switch(uMsg)
|
||||||
@ -204,8 +208,9 @@ UINT_PTR CALLBACK FileDialog::OFNHookProc(HWND hWnd, UINT uMsg, WPARAM wParam, L
|
|||||||
case WM_INITDIALOG :
|
case WM_INITDIALOG :
|
||||||
{
|
{
|
||||||
::SetWindowLong(hWnd, GWL_USERDATA, (long)staticThis);
|
::SetWindowLong(hWnd, GWL_USERDATA, (long)staticThis);
|
||||||
|
//printStr("en train");
|
||||||
//pStaticDlg->run_dlgProc(message, wParam, lParam);
|
//pStaticDlg->run_dlgProc(message, wParam, lParam);
|
||||||
return TRUE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
default :
|
default :
|
||||||
@ -219,4 +224,4 @@ UINT_PTR CALLBACK FileDialog::OFNHookProc(HWND hWnd, UINT uMsg, WPARAM wParam, L
|
|||||||
//::OFNHookProc(hWnd, uMsg, wParam, lParam);
|
//::OFNHookProc(hWnd, uMsg, wParam, lParam);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
@ -24,11 +24,14 @@
|
|||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include "SysMsg.h"
|
||||||
|
|
||||||
const int nbExtMax = 10;
|
const int nbExtMax = 10;
|
||||||
const int extLenMax = 10;
|
const int extLenMax = 10;
|
||||||
|
|
||||||
typedef std::vector<std::string> stringVector;
|
using namespace std;
|
||||||
|
|
||||||
|
typedef vector<string> stringVector;
|
||||||
//const bool styleOpen = true;
|
//const bool styleOpen = true;
|
||||||
//const bool styleSave = false;
|
//const bool styleSave = false;
|
||||||
|
|
||||||
@ -45,7 +48,7 @@ public:
|
|||||||
stringVector * doOpenMultiFilesDlg();
|
stringVector * doOpenMultiFilesDlg();
|
||||||
char * doOpenSingleFileDlg();
|
char * doOpenSingleFileDlg();
|
||||||
bool isReadOnly() {return _ofn.Flags & OFN_READONLY;};
|
bool isReadOnly() {return _ofn.Flags & OFN_READONLY;};
|
||||||
/*
|
|
||||||
protected :
|
protected :
|
||||||
static UINT APIENTRY OFNHookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
static UINT APIENTRY OFNHookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
||||||
BOOL APIENTRY run(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
|
BOOL APIENTRY run(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
|
||||||
@ -58,13 +61,51 @@ protected :
|
|||||||
{
|
{
|
||||||
case CDN_FILEOK :
|
case CDN_FILEOK :
|
||||||
{
|
{
|
||||||
|
printStr("CDN_FILEOK");
|
||||||
if ((_fileName)&&(!strrchr(_extArray[_ofn.nFilterIndex - 1], '*'))
|
if ((_fileName)&&(!strrchr(_extArray[_ofn.nFilterIndex - 1], '*'))
|
||||||
&& (strcmp(_extArray[_ofn.nFilterIndex - 1], _fileName + _ofn.nFileExtension - 1)))
|
&& (strcmp(_extArray[_ofn.nFilterIndex - 1], _fileName + _ofn.nFileExtension - 1)))
|
||||||
{
|
{
|
||||||
strcat(_fileName, _extArray[_ofn.nFilterIndex - 1]);
|
strcat(_fileName, _extArray[_ofn.nFilterIndex - 1]);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
case CDN_TYPECHANGE :
|
||||||
|
{
|
||||||
|
HWND fnControl = ::GetDlgItem(::GetParent(hWnd), edt1);
|
||||||
|
char fn[256];
|
||||||
|
::GetWindowText(fnControl, fn, sizeof(fn));
|
||||||
|
if (*fn == '\0')
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
HWND typeControl = ::GetDlgItem(::GetParent(hWnd), cmb1);
|
||||||
|
int i = ::SendMessage(typeControl, CB_GETCURSEL, 0, 0);
|
||||||
|
char ext[256];
|
||||||
|
::SendMessage(typeControl, CB_GETLBTEXT, i, (LPARAM)ext);
|
||||||
|
//printInt(i);
|
||||||
|
//
|
||||||
|
char *pExt = get1stExt(ext);
|
||||||
|
if (*pExt == '\0')
|
||||||
|
return TRUE;
|
||||||
|
//::SendMessage(::GetParent(hWnd), CDM_SETDEFEXT, 0, (LPARAM)pExt);
|
||||||
|
|
||||||
|
string fnExt = fn;
|
||||||
|
|
||||||
|
int index = fnExt.find_last_of(".");
|
||||||
|
string extension = ".";
|
||||||
|
extension += pExt;
|
||||||
|
if (index == string::npos)
|
||||||
|
{
|
||||||
|
fnExt += extension;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int len = (extension.length() > fnExt.length() - index + 1)?extension.length():fnExt.length() - index + 1;
|
||||||
|
fnExt.replace(index, len, extension);
|
||||||
|
}
|
||||||
|
|
||||||
|
::SetWindowText(fnControl, fnExt.c_str());
|
||||||
|
break;
|
||||||
|
}
|
||||||
default :
|
default :
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -74,7 +115,7 @@ protected :
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
*/
|
|
||||||
private:
|
private:
|
||||||
char _fileName[MAX_PATH*8];
|
char _fileName[MAX_PATH*8];
|
||||||
|
|
||||||
@ -87,6 +128,16 @@ private:
|
|||||||
char _extArray[nbExtMax][extLenMax];
|
char _extArray[nbExtMax][extLenMax];
|
||||||
int _nbExt;
|
int _nbExt;
|
||||||
|
|
||||||
|
char * get1stExt(char *ext) { // precondition : ext should be under the format : Batch (*.bat;*.cmd;*.nt)
|
||||||
|
char *begin = ext;
|
||||||
|
for ( ; *begin != '.' ; begin++);
|
||||||
|
char *end = ++begin;
|
||||||
|
for ( ; *end != ';' && *end != ')' ; end++);
|
||||||
|
*end = '\0';
|
||||||
|
if (*begin == '*')
|
||||||
|
*begin = '\0';
|
||||||
|
return begin;
|
||||||
|
};
|
||||||
static FileDialog *staticThis;
|
static FileDialog *staticThis;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user