From f3a451f61c9ee2a522beea1e2acb55c0e89a62ff Mon Sep 17 00:00:00 2001 From: Don Ho Date: Tue, 18 Aug 2009 18:36:07 +0000 Subject: [PATCH] [NEW_FEATURE] Tab settings per language(implementation terminated). git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@522 f5eea248-9336-0410-98b8-ebc06183d4e3 --- PowerEditor/src/Notepad_plus.cpp | 1 + PowerEditor/src/Parameters.cpp | 28 +++++++++- PowerEditor/src/Parameters.h | 9 ++-- .../ScitillaComponent/ScintillaEditView.cpp | 4 +- PowerEditor/src/TinyXml/tinyxml.h | 8 +++ .../src/WinControls/Preference/preference.rc | 1 + .../WinControls/Preference/preferenceDlg.cpp | 51 +++++++++++++------ .../WinControls/Preference/preference_rc.h | 1 + 8 files changed, 80 insertions(+), 23 deletions(-) diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index 93ee5ec34..73618e654 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -8710,6 +8710,7 @@ LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa if (nppgui._rememberLastSession) saveSession(currentSession); + //Sends WM_DESTROY, Notepad++ will end ::DestroyWindow(hwnd); diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp index f6f6cce84..564030009 100644 --- a/PowerEditor/src/Parameters.cpp +++ b/PowerEditor/src/Parameters.cpp @@ -957,6 +957,8 @@ void NppParameters::destroyInstance() { if (_pXmlDoc != NULL) { + if (_pXmlDoc->isDirty()) + _pXmlDoc->SaveFile(); delete _pXmlDoc; } @@ -969,8 +971,9 @@ void NppParameters::destroyInstance() delete _pXmlUserStylerDoc; if (_pXmlUserLangDoc) + { delete _pXmlUserLangDoc; - + } if (_pXmlNativeLangDocA) delete _pXmlNativeLangDocA; @@ -2471,7 +2474,7 @@ void NppParameters::feedKeyWordsParameters(TiXmlNode *node) _langList[_nbLang]->setCommentStart(element->Attribute(TEXT("commentStart"))); _langList[_nbLang]->setCommentEnd(element->Attribute(TEXT("commentEnd"))); int i; - if (element->Attribute(TEXT("TabSettings"), &i)) + if (element->Attribute(TEXT("tabSettings"), &i)) _langList[_nbLang]->setTabInfo(i); for (TiXmlNode *kwNode = langNode->FirstChildElement(TEXT("Keywords")); @@ -4578,6 +4581,27 @@ void NppParameters::writeStyles(LexerStylerArray & lexersStylers, StyleArray & g _pXmlUserStylerDoc->SaveFile(); } + +bool NppParameters::insertTabInfo(const TCHAR *langName, int tabInfo) +{ + if (!_pXmlDoc) return false; + TiXmlNode *langRoot = (_pXmlDoc->FirstChild(TEXT("NotepadPlus")))->FirstChildElement(TEXT("Languages")); + for (TiXmlNode *childNode = langRoot->FirstChildElement(TEXT("Language")); + childNode ; + childNode = childNode->NextSibling(TEXT("Language"))) + { + TiXmlElement *element = childNode->ToElement(); + const TCHAR *nm = element->Attribute(TEXT("name")); + if (nm && lstrcmp(langName, nm) == 0) + { + childNode->ToElement()->SetAttribute(TEXT("tabSettings"), tabInfo); + _pXmlDoc->makeDirty(); + return true; + } + } + return false; +} + void NppParameters::writeStyle2Element(Style & style2Wite, Style & style2Sync, TiXmlElement *element) { if (HIBYTE(HIWORD(style2Wite._fgColor)) != 0xFF) diff --git a/PowerEditor/src/Parameters.h b/PowerEditor/src/Parameters.h index 23b2ea240..1d759c49d 100644 --- a/PowerEditor/src/Parameters.h +++ b/PowerEditor/src/Parameters.h @@ -801,10 +801,10 @@ struct Lang }; void setTabInfo(int tabInfo) { - if (tabInfo & MASK_TabSize) + if (tabInfo != -1 && tabInfo & MASK_TabSize) { - _isTabReplacedBySpace = (tabInfo & MASK_ReplaceBySpc) != 0; - _tabSize = tabInfo & MASK_TabSize; + _isTabReplacedBySpace = (tabInfo & MASK_ReplaceBySpc) != 0; + _tabSize = tabInfo & MASK_TabSize; } }; @@ -825,7 +825,7 @@ struct Lang int getTabInfo() const { if (_tabSize == -1) return -1; - return _isTabReplacedBySpace?0x80:0x00 | _tabSize; + return (_isTabReplacedBySpace?0x80:0x00) | _tabSize; }; }; @@ -1141,6 +1141,7 @@ public: bool writeGUIParams(); void writeStyles(LexerStylerArray & lexersStylers, StyleArray & globalStylers); + bool insertTabInfo(const TCHAR *langName, int tabInfo); LexerStylerArray & getLStylerArray() {return _lexerStylerArray;}; StyleArray & getGlobalStylers() {return _widgetStyleArray;}; diff --git a/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp b/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp index 2ec126315..53461998d 100644 --- a/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp +++ b/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp @@ -2586,12 +2586,12 @@ void ScintillaEditView::setTabSettings(Lang *lang) if (lang && lang->_tabSize != -1 && lang->_tabSize != 0) { execute(SCI_SETTABWIDTH, lang->_tabSize); - execute(SCI_SETUSETABS, lang->_isTabReplacedBySpace); + execute(SCI_SETUSETABS, !lang->_isTabReplacedBySpace); } else { const NppGUI & nppgui = (NppParameters::getInstance())->getNppGUI(); execute(SCI_SETTABWIDTH, nppgui._tabSize); - execute(SCI_SETUSETABS, nppgui._tabReplacedBySpace); + execute(SCI_SETUSETABS, !nppgui._tabReplacedBySpace); } } diff --git a/PowerEditor/src/TinyXml/tinyxml.h b/PowerEditor/src/TinyXml/tinyxml.h index cf4081b0d..0e6d22906 100644 --- a/PowerEditor/src/TinyXml/tinyxml.h +++ b/PowerEditor/src/TinyXml/tinyxml.h @@ -1107,6 +1107,13 @@ public: virtual void Print( FILE* cfile, int depth = 0 ) const; // [internal use] void SetError( int err, const TCHAR* errorLocation, TiXmlParsingData* prevData ); + void makeDirty() { + _isDirty = true; + }; + + bool isDirty() const { + return _isDirty; + }; protected : virtual void StreamOut ( TIXML_OSTREAM * out) const; @@ -1122,6 +1129,7 @@ private: TIXML_STRING errorDesc; int tabsize; TiXmlCursor errorLocation; + bool _isDirty; }; diff --git a/PowerEditor/src/WinControls/Preference/preference.rc b/PowerEditor/src/WinControls/Preference/preference.rc index d180b3917..4e9ee51df 100644 --- a/PowerEditor/src/WinControls/Preference/preference.rc +++ b/PowerEditor/src/WinControls/Preference/preference.rc @@ -173,6 +173,7 @@ BEGIN CONTROL "Use default value",IDC_CHECK_DEFAULTTABVALUE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,246,125,85,10 RTEXT "Tab size : ",IDC_TABSIZE_STATIC,251,138,58,8 LTEXT "0",IDC_TABSIZEVAL_STATIC,311,138,18,8 + LTEXT "0",IDC_TABSIZEVAL_DISABLE_STATIC,311,138,18,8 CONTROL "Replace by space",IDC_CHECK_REPLACEBYSPACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,258,149,100,10 END diff --git a/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp index 381f09414..aff7b6bce 100644 --- a/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp +++ b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp @@ -65,7 +65,7 @@ BOOL CALLBACK PreferenceDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lPa _wVector.push_back(DlgInfo(&_marginsDlg, TEXT("Edit Components"), TEXT("Scintillas"))); _wVector.push_back(DlgInfo(&_defaultNewDocDlg, TEXT("New Document/Open Save Directory"), TEXT("NewDoc"))); _wVector.push_back(DlgInfo(&_fileAssocDlg, TEXT("File Association"), TEXT("FileAssoc"))); - _wVector.push_back(DlgInfo(&_langMenuDlg, TEXT("Language Menu"), TEXT("LangMenu"))); + _wVector.push_back(DlgInfo(&_langMenuDlg, TEXT("Language Menu/Tab Settings"), TEXT("LangMenu"))); _wVector.push_back(DlgInfo(&_printSettingsDlg, TEXT("Print - Colour and Margin"), TEXT("Print1"))); _wVector.push_back(DlgInfo(&_printSettings2Dlg, TEXT("Print - Header and Footer"), TEXT("Print2"))); _wVector.push_back(DlgInfo(&_backupDlg, TEXT("Backup/Auto-completion"), TEXT("Backup"))); @@ -1039,7 +1039,8 @@ BOOL CALLBACK LangMenuDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lPara ::SendDlgItemMessage(_hSelf, IDC_LIST_TABSETTNG, LB_SETCURSEL, 0, index2Begin); ::ShowWindow(::GetDlgItem(_hSelf, IDC_GR_TABVALUE_STATIC), SW_HIDE); ::ShowWindow(::GetDlgItem(_hSelf, IDC_CHECK_DEFAULTTABVALUE), SW_HIDE); - + ::EnableWindow(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_DISABLE_STATIC), FALSE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_DISABLE_STATIC), SW_HIDE); for (int i = L_TXT ; i < pNppParam->L_END ; i++) { @@ -1091,6 +1092,8 @@ BOOL CALLBACK LangMenuDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lPara TCHAR nbStr[10]; wsprintf(nbStr, TEXT("%d"), size); ::SetWindowText(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), nbStr); + ::SetWindowText(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_DISABLE_STATIC), nbStr); + int index = ::SendDlgItemMessage(_hSelf, IDC_LIST_TABSETTNG, LB_GETCURSEL, 0, 0); if (index == LB_ERR) return FALSE; @@ -1099,11 +1102,15 @@ BOOL CALLBACK LangMenuDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lPara Lang *lang = pNppParam->getLangFromIndex(index - 1); if (!lang) return FALSE; lang->_tabSize = size; + + // write in langs.xml + pNppParam->insertTabInfo(lang->getLangName(), lang->getTabInfo()); } else { nppGUI._tabSize = size; } + ::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_TAB_SIZE, 0); return TRUE; } @@ -1111,13 +1118,18 @@ BOOL CALLBACK LangMenuDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lPara case IDC_CHECK_REPLACEBYSPACE: { bool isTabReplacedBySpace = BST_CHECKED == ::SendMessage(::GetDlgItem(_hSelf, IDC_CHECK_REPLACEBYSPACE), BM_GETCHECK, 0, 0); - int index = ::SendDlgItemMessage(_hSelf, IDC_LIST_TABSETTNG, LB_GETCURSEL, 0, 0); + int index = ::SendDlgItemMessage(_hSelf, IDC_LIST_TABSETTNG, LB_GETCURSEL, 0, 0); if (index == LB_ERR) return FALSE; if (index != 0) { Lang *lang = pNppParam->getLangFromIndex(index - 1); if (!lang) return FALSE; + if (!lang->_tabSize || lang->_tabSize == -1) + lang->_tabSize = nppGUI._tabSize; lang->_isTabReplacedBySpace = isTabReplacedBySpace; + + // write in langs.xml + pNppParam->insertTabInfo(lang->getLangName(), lang->getTabInfo()); } else { @@ -1129,7 +1141,7 @@ BOOL CALLBACK LangMenuDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lPara case IDC_LIST_TABSETTNG : { - if (HIWORD(wParam) == CBN_SELCHANGE) + if (HIWORD(wParam) == LBN_SELCHANGE) { int index = ::SendDlgItemMessage(_hSelf, IDC_LIST_TABSETTNG, LB_GETCURSEL, 0, 0); if (index == LB_ERR) @@ -1149,9 +1161,12 @@ BOOL CALLBACK LangMenuDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lPara ::SendMessage(::GetDlgItem(_hSelf, IDC_CHECK_DEFAULTTABVALUE), BM_SETCHECK, useDefaultTab, 0); ::EnableWindow(::GetDlgItem(_hSelf, IDC_TABSIZE_STATIC), !useDefaultTab); - ::SetWindowText(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), nbStr); + ::SetWindowText(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), nbStr); + ::SetWindowText(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_DISABLE_STATIC), nbStr); ::EnableWindow(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), !useDefaultTab); - ::SendMessage(::GetDlgItem(_hSelf, IDC_CHECK_REPLACEBYSPACE), BM_SETCHECK, useDefaultTab?nppGUI._tabReplacedBySpace:lang->_isTabReplacedBySpace, 0); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_DISABLE_STATIC), useDefaultTab); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), !useDefaultTab); + ::SendMessage(::GetDlgItem(_hSelf, IDC_CHECK_REPLACEBYSPACE), BM_SETCHECK, useDefaultTab?nppGUI._tabReplacedBySpace:lang->_isTabReplacedBySpace, 0); ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_REPLACEBYSPACE), !useDefaultTab); if (!useDefaultTab) @@ -1159,19 +1174,19 @@ BOOL CALLBACK LangMenuDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lPara TCHAR nbStr[16]; wsprintf(nbStr, TEXT("%d"),lang->_tabSize); ::SetWindowText(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), nbStr); - ::SendMessage(::GetDlgItem(_hSelf, IDC_CHECK_REPLACEBYSPACE), BM_SETCHECK, lang->_isTabReplacedBySpace, 0); + ::SendMessage(::GetDlgItem(_hSelf, IDC_CHECK_REPLACEBYSPACE), BM_SETCHECK, lang->_isTabReplacedBySpace, 0); } } else { - ::EnableWindow(::GetDlgItem(_hSelf, IDC_TABSIZE_STATIC), TRUE); - ::EnableWindow(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), TRUE); - - TCHAR nbStr[16]; - wsprintf(nbStr, TEXT("%d"),nppGUI._tabSize); - ::SetWindowText(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), nbStr); - - ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_REPLACEBYSPACE), TRUE); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_TABSIZE_STATIC), TRUE); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), TRUE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), SW_SHOW); + TCHAR nbStr[16]; + wsprintf(nbStr, TEXT("%d"),nppGUI._tabSize); + ::SetWindowText(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), nbStr); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_DISABLE_STATIC), SW_HIDE); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_REPLACEBYSPACE), TRUE); ::SendMessage(::GetDlgItem(_hSelf, IDC_CHECK_REPLACEBYSPACE), BM_SETCHECK, nppGUI._tabReplacedBySpace, 0); } } @@ -1200,9 +1215,15 @@ BOOL CALLBACK LangMenuDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lPara ::EnableWindow(::GetDlgItem(_hSelf, IDC_TABSIZE_STATIC), !useDefaultTab); ::SetWindowText(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), nbStr); ::EnableWindow(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), !useDefaultTab); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_DISABLE_STATIC), useDefaultTab); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), !useDefaultTab); ::SendMessage(::GetDlgItem(_hSelf, IDC_CHECK_REPLACEBYSPACE), BM_SETCHECK, useDefaultTab?nppGUI._tabReplacedBySpace:lang->_isTabReplacedBySpace, 0); ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_REPLACEBYSPACE), !useDefaultTab); + // write in langs.xml + if (useDefaultTab) + pNppParam->insertTabInfo(lang->getLangName(), -1); + return TRUE; } diff --git a/PowerEditor/src/WinControls/Preference/preference_rc.h b/PowerEditor/src/WinControls/Preference/preference_rc.h index 43f0d44be..d55f736bc 100644 --- a/PowerEditor/src/WinControls/Preference/preference_rc.h +++ b/PowerEditor/src/WinControls/Preference/preference_rc.h @@ -144,6 +144,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #define IDC_LIST_TABSETTNG (IDD_PREFERENCE_LANG_BOX + 9) #define IDC_CHECK_DEFAULTTABVALUE (IDD_PREFERENCE_LANG_BOX + 10) #define IDC_GR_TABVALUE_STATIC (IDD_PREFERENCE_LANG_BOX + 11) + #define IDC_TABSIZEVAL_DISABLE_STATIC (IDD_PREFERENCE_LANG_BOX + 12) #define IDD_PREFERENCE_PRINT_BOX 6600 //(IDD_PREFERENCE_BOX + 600) #define IDC_CHECK_PRINTLINENUM (IDD_PREFERENCE_PRINT_BOX + 1)