From 521c53918f3a150a543f46d281549e0b4f08baa5 Mon Sep 17 00:00:00 2001 From: harrybharry Date: Mon, 8 Sep 2008 22:22:54 +0000 Subject: [PATCH] Add hidden capability of setting default directory (with envvars). No more directory locks (can freely delete all directories). git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository@309 f5eea248-9336-0410-98b8-ebc06183d4e3 --- PowerEditor/src/Notepad_plus.cpp | 7 +-- PowerEditor/src/Notepad_plus.h | 11 ++++- PowerEditor/src/Parameters.cpp | 48 +++++++++++++++++++ PowerEditor/src/Parameters.h | 11 ++++- .../src/ScitillaComponent/FindReplaceDlg.cpp | 7 +-- .../OpenSaveFileDialog/FileDialog.cpp | 29 ++++++++--- 6 files changed, 97 insertions(+), 16 deletions(-) diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index a858698d..1ac0994f 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -6592,15 +6592,16 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa _findReplaceDlg.launchFindInFilesDlg(); const TCHAR *dir = NULL; - TCHAR currentDir[MAX_PATH]; + //TCHAR currentDir[MAX_PATH]; basic_string fltr; if (wParam) dir = (const TCHAR *)wParam; else { - ::GetCurrentDirectory(MAX_PATH, currentDir); - dir = currentDir; + //::GetCurrentDirectory(MAX_PATH, currentDir); + //dir = currentDir; + dir = NppParameters::getInstance()->getWorkingDir(); } if (lParam) diff --git a/PowerEditor/src/Notepad_plus.h b/PowerEditor/src/Notepad_plus.h index ba7658e3..29698bdd 100644 --- a/PowerEditor/src/Notepad_plus.h +++ b/PowerEditor/src/Notepad_plus.h @@ -680,22 +680,29 @@ private: void doSynScorll(HWND hW); void setWorkingDir(TCHAR *dir) { - if (NppParameters::getInstance()->getNppGUI()._saveOpenKeepInSameDir) + NppParameters * params = NppParameters::getInstance(); + if (params->getNppGUI()._saveOpenKeepInSameDir) return; if (!dir || !PathIsDirectory(dir)) { //Non existing path, usually occurs when a new 1 file is open. //Set working dir to Notepad++' directory to prevent directory lock. + params->setWorkingDir(NULL); + /* TCHAR nppDir[MAX_PATH]; //wParam set to max_path in case boundary checks will ever be made. SendMessage(_hSelf, NPPM_GETNPPDIRECTORY, (WPARAM)MAX_PATH, (LPARAM)nppDir); ::SetCurrentDirectory(nppDir); + */ return; } else - ::SetCurrentDirectory(dir); + { + //::SetCurrentDirectory(dir); + params->setWorkingDir(dir); + } } bool str2Cliboard(const TCHAR *str2cpy); bool bin2Cliboard(const UCHAR *uchar2cpy, size_t length); diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp index a438df06..a9629e29 100644 --- a/PowerEditor/src/Parameters.cpp +++ b/PowerEditor/src/Parameters.cpp @@ -435,6 +435,11 @@ NppParameters::NppParameters() : _pXmlDoc(NULL),_pXmlUserDoc(NULL), _pXmlUserSty PathRemoveFileSpec(nppPath); lstrcpy(_nppPath, nppPath); + //Initialize current directory to startup directory + ::GetCurrentDirectory(MAX_PATH, _currentDirectory); + //lstrcpy(_currentDirectory, nppPath); + ::SetCurrentDirectory(_nppPath); //force working directory to path of module, preventing lock + _appdataNppDir[0] = '\0'; TCHAR notepadStylePath[MAX_PATH]; lstrcpy(notepadStylePath, _nppPath); @@ -1113,6 +1118,19 @@ bool NppParameters::getContextMenuFromXmlTree(HMENU mainMenuHadle) return true; } +void NppParameters::setWorkingDir(const TCHAR * newPath) +{ + if (newPath && newPath[0]) { + lstrcpyn(_currentDirectory, newPath, MAX_PATH); //dont use sizeof + } else { + if (_nppGUI._defaultDirValid) { + lstrcpyn(_currentDirectory, _nppGUI._defaultDirExp, MAX_PATH); + } else { + lstrcpyn(_currentDirectory, _nppPath, MAX_PATH); + } + } +} + bool NppParameters::loadSession(Session & session, const TCHAR *sessionFileName) { TiXmlDocument *pXmlSessionDocument = new TiXmlDocument(sessionFileName); @@ -2903,6 +2921,23 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) } } } + else if (!lstrcmp(nm, TEXT("defaultDir"))) + { + const TCHAR * path = element->Attribute(TEXT("path")); + if (path && path[0]) + { + lstrcpyn(_nppGUI._defaultDir, path, MAX_PATH); + lstrcpyn(_nppGUI._defaultDirExp, path, MAX_PATH); + DWORD res = DoEnvironmentSubst(_nppGUI._defaultDirExp, MAX_PATH); + if (LOWORD(res) == FALSE) { + _nppGUI._defaultDirValid = false; //unable to expand, cannot be used + } else if (!PathFileExists(_nppGUI._defaultDirExp)) { + _nppGUI._defaultDirValid = false; //invalid path, cannot be used + } else { + _nppGUI._defaultDirValid = true; //can use default path as override + } + } + } } } @@ -3188,6 +3223,7 @@ bool NppParameters::writeGUIParams() bool smartHighLightExist = false; bool tagsMatchHighLightExist = false; bool caretExist = false; + bool defaultDirExist = false; TiXmlNode *dockingParamNode = NULL; @@ -3521,6 +3557,11 @@ bool NppParameters::writeGUIParams() else childNode->InsertEndChild(TiXmlText(pStr)); } + else if (!lstrcmp(nm, TEXT("defaultDir"))) + { + defaultDirExist = true; + element->SetAttribute(TEXT("path"), _nppGUI._defaultDir); + } } if (!noUpdateExist) @@ -3691,6 +3732,13 @@ bool NppParameters::writeGUIParams() GUIConfigElement->SetAttribute(TEXT("blinkRate"), _nppGUI._caretBlinkRate); } + if (!defaultDirExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); + GUIConfigElement->SetAttribute(TEXT("name"), TEXT("defaultDir")); + GUIConfigElement->SetAttribute(TEXT("path"), _nppGUI._defaultDir); + } + insertDockingParamNode(GUIRoot); return true; } diff --git a/PowerEditor/src/Parameters.h b/PowerEditor/src/Parameters.h index 508646b6..6719aea9 100644 --- a/PowerEditor/src/Parameters.h +++ b/PowerEditor/src/Parameters.h @@ -538,13 +538,15 @@ struct NppGUI _isMaximized(false), _isMinimizedToTray(false), _rememberLastSession(true), _backup(bak_none), _useDir(false),\ _doTaskList(true), _maitainIndent(true), _saveOpenKeepInSameDir(false), _styleMRU(true), _styleURL(0),\ _autocStatus(autoc_none), _autocFromLen(1), _funcParams(false), _definedSessionExt(TEXT("")), _neverUpdate(false),\ - _doesExistUpdater(false), _caretBlinkRate(250), _caretWidth(1){ + _doesExistUpdater(false), _caretBlinkRate(250), _caretWidth(1), _defaultDirValid(false) { _appPos.left = 0; _appPos.top = 0; _appPos.right = 700; _appPos.bottom = 500; _backupDir[0] = '\0'; + _defaultDir[0] = 0; + _defaultDirExp[0] = 0; }; toolBarStatusType _toolBarStatus; // small, large ou standard bool _toolbarShow; @@ -609,6 +611,10 @@ struct NppGUI bool _doesExistUpdater; int _caretBlinkRate; int _caretWidth; + + TCHAR _defaultDir[MAX_PATH]; + TCHAR _defaultDirExp[MAX_PATH]; //expanded environment variables + bool _defaultDirValid; }; struct ScintillaViewParams @@ -1032,6 +1038,8 @@ public: const TCHAR * getNppPath() const {return _nppPath;}; const TCHAR * getAppDataNppDir() const {return _appdataNppDir;}; + const TCHAR * getWorkingDir() const {return _currentDirectory;}; + void setWorkingDir(const TCHAR * newPath); bool loadSession(Session & session, const TCHAR *sessionFileName); int langTypeToCommandID(LangType lt) const; @@ -1154,6 +1162,7 @@ private: TCHAR _sessionPath[MAX_PATH]; TCHAR _nppPath[MAX_PATH]; TCHAR _appdataNppDir[MAX_PATH]; // sentinel of the absence of "doLocalConf.xml" : (_appdataNppDir == TEXT(""))?"doLocalConf.xml present":"doLocalConf.xml absent" + TCHAR _currentDirectory[MAX_PATH]; Accelerator *_pAccelerator; ScintillaAccelerator * _pScintAccelerator; diff --git a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp index 2d7472d0..aa34d3aa 100644 --- a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp +++ b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp @@ -474,9 +474,10 @@ BOOL CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lP doDialog((DIALOG_TYPE)indexClicked); if ((DIALOG_TYPE)indexClicked == FINDINFILES_DLG) { - TCHAR currentDir[MAX_PATH]; - ::GetCurrentDirectory(MAX_PATH, currentDir); - setFindInFilesDirFilter(currentDir, NULL); + //TCHAR currentDir[MAX_PATH]; + //::GetCurrentDirectory(MAX_PATH, currentDir); + //setFindInFilesDirFilter(currentDir, NULL); + setFindInFilesDirFilter(NppParameters::getInstance()->getWorkingDir(), NULL); } } return TRUE; diff --git a/PowerEditor/src/WinControls/OpenSaveFileDialog/FileDialog.cpp b/PowerEditor/src/WinControls/OpenSaveFileDialog/FileDialog.cpp index c7b1bb0a..ba722184 100644 --- a/PowerEditor/src/WinControls/OpenSaveFileDialog/FileDialog.cpp +++ b/PowerEditor/src/WinControls/OpenSaveFileDialog/FileDialog.cpp @@ -136,8 +136,10 @@ int FileDialog::setExtsFilter(const TCHAR *extText, const TCHAR *exts) TCHAR * FileDialog::doOpenSingleFileDlg() { TCHAR dir[MAX_PATH]; - ::GetCurrentDirectory(sizeof(dir), dir); - _ofn.lpstrInitialDir = dir; + ::GetCurrentDirectory(MAX_PATH, dir); + //_ofn.lpstrInitialDir = dir; + + _ofn.lpstrInitialDir = NppParameters::getInstance()->getWorkingDir(); _ofn.Flags |= OFN_FILEMUSTEXIST; @@ -148,18 +150,27 @@ TCHAR * FileDialog::doOpenSingleFileDlg() catch(...) { ::MessageBox(NULL, TEXT("GetSaveFileName crashes!!!"), TEXT(""), MB_OK); } + + ::SetCurrentDirectory(dir); + return (fn); } stringVector * FileDialog::doOpenMultiFilesDlg() { TCHAR dir[MAX_PATH]; - ::GetCurrentDirectory(sizeof(dir), dir); - _ofn.lpstrInitialDir = dir; + ::GetCurrentDirectory(MAX_PATH, dir); + //_ofn.lpstrInitialDir = dir; + + _ofn.lpstrInitialDir = NppParameters::getInstance()->getWorkingDir(); _ofn.Flags |= OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT; - if (::GetOpenFileName((OPENFILENAME*)&_ofn)) + BOOL res = ::GetOpenFileName((OPENFILENAME*)&_ofn); + + ::SetCurrentDirectory(dir); + + if (res) { TCHAR fn[MAX_PATH]; TCHAR *pFn = _fileName + lstrlen(_fileName) + 1; @@ -190,9 +201,10 @@ stringVector * FileDialog::doOpenMultiFilesDlg() TCHAR * FileDialog::doSaveDlg() { TCHAR dir[MAX_PATH]; - ::GetCurrentDirectory(sizeof(dir), dir); + ::GetCurrentDirectory(MAX_PATH, dir); + //_ofn.lpstrInitialDir = dir; - _ofn.lpstrInitialDir = dir; + _ofn.lpstrInitialDir = NppParameters::getInstance()->getWorkingDir(); _ofn.Flags |= OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_ENABLESIZING; @@ -206,6 +218,9 @@ TCHAR * FileDialog::doSaveDlg() catch(...) { ::MessageBox(NULL, TEXT("GetSaveFileName crashes!!!"), TEXT(""), MB_OK); } + + ::SetCurrentDirectory(dir); + return (fn); }