From 5e052c5bd0fc86451f1257e0afaa313af98c4358 Mon Sep 17 00:00:00 2001 From: NN--- Date: Sun, 2 Aug 2015 22:08:01 +0300 Subject: [PATCH 01/85] Build: VS2015 project update (closes #628) + Added `_CRT_NON_CONFORMING_WCSTOK` define --- .../visual.net/notepadPlus.vs2015.vcxproj | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/PowerEditor/visual.net/notepadPlus.vs2015.vcxproj b/PowerEditor/visual.net/notepadPlus.vs2015.vcxproj index f1415b6dc..295deed62 100644 --- a/PowerEditor/visual.net/notepadPlus.vs2015.vcxproj +++ b/PowerEditor/visual.net/notepadPlus.vs2015.vcxproj @@ -76,7 +76,9 @@ false - false + x64\$(Configuration)\ + x64\$(Configuration)\ + false ..\bin\ @@ -84,6 +86,8 @@ false + ..\bin64\ + x64\$(Configuration)\ false @@ -91,7 +95,7 @@ Disabled Neither ..\src\WinControls\AboutDlg;..\..\scintilla\include;..\include;..\src\WinControls;..\src\WinControls\ImageListSet;..\src\WinControls\OpenSaveFileDialog;..\src\WinControls\SplitterContainer;..\src\WinControls\StaticDialog;..\src\WinControls\TabBar;..\src\WinControls\ToolBar;..\src\MISC\Process;..\src\ScitillaComponent;..\src\MISC;..\src\MISC\SysMsg;..\src\WinControls\StatusBar;..\src;..\src\WinControls\StaticDialog\RunDlg;..\src\tinyxml;..\src\WinControls\ColourPicker;..\src\Win32Explr;..\src\MISC\RegExt;..\src\WinControls\TrayIcon;..\src\WinControls\shortcut;..\src\WinControls\Grid;..\src\WinControls\ContextMenu;..\src\MISC\PluginsManager;..\src\WinControls\Preference;..\src\WinControls\WindowsDlg;..\src\WinControls\TaskList;..\src\WinControls\DockingWnd;..\src\WinControls\ToolTip;..\src\MISC\Exception;..\src\MISC\Common;..\src\tinyxml\tinyXmlA;..\src\WinControls\AnsiCharPanel;..\src\WinControls\ClipboardHistory;..\src\WinControls\FindCharsInRange;..\src\WinControls\VerticalFileSwitcher;..\src\WinControls\ProjectPanel;..\src\WinControls\DocumentMap;..\src\WinControls\FunctionList;..\src\uchardet;%(AdditionalIncludeDirectories) - WIN32;_WIN32_WINNT=0x0501;_WINDOWS;_USE_64BIT_TIME_T;TIXML_USE_STL;TIXMLA_USE_STL;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS=1;%(PreprocessorDefinitions) + WIN32;_WIN32_WINNT=0x0501;_WINDOWS;_USE_64BIT_TIME_T;TIXML_USE_STL;TIXMLA_USE_STL;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS=1;_CRT_NON_CONFORMING_WCSTOK;%(PreprocessorDefinitions) Async Default MultiThreadedDebug @@ -126,7 +130,7 @@ Disabled Neither ..\src\WinControls\AboutDlg;..\..\scintilla\include;..\include;..\src\WinControls;..\src\WinControls\ImageListSet;..\src\WinControls\OpenSaveFileDialog;..\src\WinControls\SplitterContainer;..\src\WinControls\StaticDialog;..\src\WinControls\TabBar;..\src\WinControls\ToolBar;..\src\MISC\Process;..\src\ScitillaComponent;..\src\MISC;..\src\MISC\SysMsg;..\src\WinControls\StatusBar;..\src;..\src\WinControls\StaticDialog\RunDlg;..\src\tinyxml;..\src\WinControls\ColourPicker;..\src\Win32Explr;..\src\MISC\RegExt;..\src\WinControls\TrayIcon;..\src\WinControls\shortcut;..\src\WinControls\Grid;..\src\WinControls\ContextMenu;..\src\MISC\PluginsManager;..\src\WinControls\Preference;..\src\WinControls\WindowsDlg;..\src\WinControls\TaskList;..\src\WinControls\DockingWnd;..\src\WinControls\ToolTip;..\src\MISC\Exception;..\src\MISC\Common;..\src\tinyxml\tinyXmlA;..\src\WinControls\AnsiCharPanel;..\src\WinControls\ClipboardHistory;..\src\WinControls\FindCharsInRange;..\src\WinControls\VerticalFileSwitcher;..\src\WinControls\ProjectPanel;..\src\WinControls\DocumentMap;..\src\WinControls\FunctionList;..\src\uchardet;%(AdditionalIncludeDirectories) - WIN32;_WIN32_WINNT=0x0501;_WINDOWS;_USE_64BIT_TIME_T;TIXML_USE_STL;TIXMLA_USE_STL;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS=1;%(PreprocessorDefinitions) + WIN32;_WIN32_WINNT=0x0501;_WINDOWS;_USE_64BIT_TIME_T;TIXML_USE_STL;TIXMLA_USE_STL;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS=1;_CRT_NON_CONFORMING_WCSTOK;%(PreprocessorDefinitions) Async Default MultiThreadedDebug @@ -164,7 +168,7 @@ false false ..\src\WinControls\AboutDlg;..\..\scintilla\include;..\include;..\src\WinControls;..\src\WinControls\ImageListSet;..\src\WinControls\OpenSaveFileDialog;..\src\WinControls\SplitterContainer;..\src\WinControls\StaticDialog;..\src\WinControls\TabBar;..\src\WinControls\ToolBar;..\src\MISC\Process;..\src\ScitillaComponent;..\src\MISC;..\src\MISC\SysMsg;..\src\WinControls\StatusBar;..\src;..\src\WinControls\StaticDialog\RunDlg;..\src\tinyxml;..\src\WinControls\ColourPicker;..\src\Win32Explr;..\src\MISC\RegExt;..\src\WinControls\TrayIcon;..\src\WinControls\shortcut;..\src\WinControls\Grid;..\src\WinControls\ContextMenu;..\src\MISC\PluginsManager;..\src\WinControls\Preference;..\src\WinControls\WindowsDlg;..\src\WinControls\TaskList;..\src\WinControls\DockingWnd;..\src\WinControls\ToolTip;..\src\MISC\Exception;..\src\MISC\Common;..\src\tinyxml\tinyXmlA;..\src\WinControls\AnsiCharPanel;..\src\WinControls\ClipboardHistory;..\src\WinControls\FindCharsInRange;..\src\WinControls\VerticalFileSwitcher;..\src\WinControls\ProjectPanel;..\src\WinControls\DocumentMap;..\src\WinControls\FunctionList;..\src\uchardet;%(AdditionalIncludeDirectories) - WIN32;_WIN32_WINNT=0x0501;NDEBUG;_WINDOWS;_USE_64BIT_TIME_T;TIXML_USE_STL;TIXMLA_USE_STL;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS=1;%(PreprocessorDefinitions) + WIN32;_WIN32_WINNT=0x0501;NDEBUG;_WINDOWS;_USE_64BIT_TIME_T;TIXML_USE_STL;TIXMLA_USE_STL;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS=1;_CRT_NON_CONFORMING_WCSTOK;%(PreprocessorDefinitions) false false true @@ -203,6 +207,10 @@ copy ..\src\stylers.model.xml ..\bin\stylers.model.xml copy ..\src\shortcuts.xml ..\bin\shortcuts.xml copy ..\src\functionList.xml ..\bin\functionList.xml copy ..\src\contextMenu.xml ..\bin\contextMenu.xml +copy ..\src\fonts\sourceCodePro\SourceCodePro-Regular.ttf ..\bin\SourceCodePro-Regular.ttf +copy ..\src\fonts\sourceCodePro\SourceCodePro-Bold.ttf ..\bin\SourceCodePro-Bold.ttf +copy ..\src\fonts\sourceCodePro\SourceCodePro-It.ttf ..\bin\SourceCodePro-It.ttf +copy ..\src\fonts\sourceCodePro\SourceCodePro-BoldIt.ttf ..\bin\SourceCodePro-BoldIt.ttf ..\misc\vistaIconTool\changeIcon.bat "..\misc\vistaIconTool\ChangeIcon.exe" "$(OutDir)notepad++.exe" @@ -215,7 +223,7 @@ copy ..\src\contextMenu.xml ..\bin\contextMenu.xml false false ..\src\WinControls\AboutDlg;..\..\scintilla\include;..\include;..\src\WinControls;..\src\WinControls\ImageListSet;..\src\WinControls\OpenSaveFileDialog;..\src\WinControls\SplitterContainer;..\src\WinControls\StaticDialog;..\src\WinControls\TabBar;..\src\WinControls\ToolBar;..\src\MISC\Process;..\src\ScitillaComponent;..\src\MISC;..\src\MISC\SysMsg;..\src\WinControls\StatusBar;..\src;..\src\WinControls\StaticDialog\RunDlg;..\src\tinyxml;..\src\WinControls\ColourPicker;..\src\Win32Explr;..\src\MISC\RegExt;..\src\WinControls\TrayIcon;..\src\WinControls\shortcut;..\src\WinControls\Grid;..\src\WinControls\ContextMenu;..\src\MISC\PluginsManager;..\src\WinControls\Preference;..\src\WinControls\WindowsDlg;..\src\WinControls\TaskList;..\src\WinControls\DockingWnd;..\src\WinControls\ToolTip;..\src\MISC\Exception;..\src\MISC\Common;..\src\tinyxml\tinyXmlA;..\src\WinControls\AnsiCharPanel;..\src\WinControls\ClipboardHistory;..\src\WinControls\FindCharsInRange;..\src\WinControls\VerticalFileSwitcher;..\src\WinControls\ProjectPanel;..\src\WinControls\DocumentMap;..\src\WinControls\FunctionList;..\src\uchardet;%(AdditionalIncludeDirectories) - WIN32;_WIN32_WINNT=0x0501;NDEBUG;_WINDOWS;_USE_64BIT_TIME_T;TIXML_USE_STL;TIXMLA_USE_STL;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS=1;%(PreprocessorDefinitions) + WIN32;_WIN32_WINNT=0x0501;NDEBUG;_WINDOWS;_USE_64BIT_TIME_T;TIXML_USE_STL;TIXMLA_USE_STL;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS=1;_CRT_NON_CONFORMING_WCSTOK;%(PreprocessorDefinitions) false false true @@ -248,12 +256,12 @@ copy ..\src\contextMenu.xml ..\bin\contextMenu.xml ..\src\dpiAware.manifest;%(AdditionalManifestFiles) - copy ..\src\config.model.xml ..\bin\config.model.xml -copy ..\src\langs.model.xml ..\bin\langs.model.xml -copy ..\src\stylers.model.xml ..\bin\stylers.model.xml -copy ..\src\shortcuts.xml ..\bin\shortcuts.xml -copy ..\src\functionList.xml ..\bin\functionList.xml -copy ..\src\contextMenu.xml ..\bin\contextMenu.xml + copy ..\src\config.model.xml ..\bin64\config.model.xml +copy ..\src\langs.model.xml ..\bin64\langs.model.xml +copy ..\src\stylers.model.xml ..\bin64\stylers.model.xml +copy ..\src\shortcuts.xml ..\bin64\shortcuts.xml +copy ..\src\functionList.xml ..\bin64\functionList.xml +copy ..\src\contextMenu.xml ..\bin64\contextMenu.xml ..\misc\vistaIconTool\changeIcon.bat "..\misc\vistaIconTool\ChangeIcon.exe" "$(OutDir)notepad++.exe" @@ -525,7 +533,6 @@ copy ..\src\contextMenu.xml ..\bin\contextMenu.xml - @@ -655,4 +662,4 @@ copy ..\src\contextMenu.xml ..\bin\contextMenu.xml - \ No newline at end of file + From 24c557392ff0913389dcf6ea5725663e5b0beb66 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Mon, 3 Aug 2015 01:31:17 +0200 Subject: [PATCH 02/85] [BUG_FIXED] Fix inconsistant untitled name issue. The inconsistant untitled name issue is the first untitled document name is "new 0" or "new 2" instead of "new 1". This fix make the first untitled document name always be "new 1". --- PowerEditor/src/ScitillaComponent/Buffer.cpp | 12 ++++++++---- PowerEditor/src/ScitillaComponent/Buffer.h | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/PowerEditor/src/ScitillaComponent/Buffer.cpp b/PowerEditor/src/ScitillaComponent/Buffer.cpp index add3092d7..8be39de17 100644 --- a/PowerEditor/src/ScitillaComponent/Buffer.cpp +++ b/PowerEditor/src/ScitillaComponent/Buffer.cpp @@ -1052,9 +1052,13 @@ size_t FileManager::nextUntitledNewNumber() const Buffer *buf = _buffers.at(i); if (buf->isUntitled()) { - TCHAR *numberStr = buf->_fileName + lstrlen(UNTITLED_STR); - int usedNumber = generic_atoi(numberStr); - usedNumbers.push_back(usedNumber); + // if untitled document is invisible, then don't put its number into array (so its number is available to be used) + if ((buf->_referees[0])->isVisible()) + { + TCHAR *numberStr = buf->_fileName + lstrlen(UNTITLED_STR); + int usedNumber = generic_atoi(numberStr); + usedNumbers.push_back(usedNumber); + } } } @@ -1106,7 +1110,7 @@ BufferID FileManager::bufferFromDocument(Document doc, bool dontIncrease, bool d { generic_string newTitle = UNTITLED_STR; TCHAR nb[10]; - wsprintf(nb, TEXT("%d"), 0); + wsprintf(nb, TEXT("%d"), nextUntitledNewNumber()); newTitle += nb; if (!dontRef) diff --git a/PowerEditor/src/ScitillaComponent/Buffer.h b/PowerEditor/src/ScitillaComponent/Buffer.h index dc9c0140e..655e205c1 100644 --- a/PowerEditor/src/ScitillaComponent/Buffer.h +++ b/PowerEditor/src/ScitillaComponent/Buffer.h @@ -346,7 +346,7 @@ private : bool _needLexer; //initially true //these properties have to be duplicated because of multiple references //All the vectors must have the same size at all times - std::vector< ScintillaEditView * > _referees; + std::vector< ScintillaEditView * > _referees; // Instances of ScintillaEditView which contain this buffer std::vector< Position > _positions; std::vector< std::vector > _foldStates; From a36b4f7810670d6e40430703349ce4cac7ad38c8 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Mon, 3 Aug 2015 01:56:18 +0200 Subject: [PATCH 03/85] [UPDATE] Update localization files --- PowerEditor/installer/nativeLang/catalan.xml | 50 +- PowerEditor/installer/nativeLang/korean.xml | 1517 +++++++++--------- PowerEditor/installer/nativeLang/spanish.xml | 13 +- 3 files changed, 791 insertions(+), 789 deletions(-) diff --git a/PowerEditor/installer/nativeLang/catalan.xml b/PowerEditor/installer/nativeLang/catalan.xml index 0c494c060..273404f0e 100644 --- a/PowerEditor/installer/nativeLang/catalan.xml +++ b/PowerEditor/installer/nativeLang/catalan.xml @@ -1,12 +1,12 @@ - +
@@ -87,6 +87,7 @@ By Hiro5 + @@ -109,7 +110,13 @@ By Hiro5 + + + + + + @@ -284,12 +291,10 @@ By Hiro5 - - - + @@ -644,8 +649,8 @@ By Hiro5 - + + @@ -770,9 +775,7 @@ By Hiro5 - - - + @@ -826,6 +829,7 @@ By Hiro5 + @@ -835,28 +839,18 @@ By Hiro5 - - - - + + + + - - + + + diff --git a/PowerEditor/installer/nativeLang/korean.xml b/PowerEditor/installer/nativeLang/korean.xml index 91f26a0ea..c3164bf2a 100644 --- a/PowerEditor/installer/nativeLang/korean.xml +++ b/PowerEditor/installer/nativeLang/korean.xml @@ -1,251 +1,252 @@ - + - - + +
- + - - - - - - - - - - - + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -257,99 +258,99 @@ - - - + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + +
- + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + +
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -363,346 +364,346 @@ - - - - - - - + + + + + + + - - - - + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - + + + - - + + - - - - + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + @@ -710,44 +711,44 @@ - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - + + + + @@ -758,141 +759,141 @@ - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - + + + - - - - - - + + + + + + - - - - - + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - + - - - + + + - - - - + + + + - + - - - + + + - - - - + + + + - - + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - + + + + + diff --git a/PowerEditor/installer/nativeLang/spanish.xml b/PowerEditor/installer/nativeLang/spanish.xml index 037f94fd2..d1e258277 100644 --- a/PowerEditor/installer/nativeLang/spanish.xml +++ b/PowerEditor/installer/nativeLang/spanish.xml @@ -86,7 +86,7 @@ - + @@ -101,6 +101,14 @@ + + + + + + + + @@ -141,8 +149,6 @@ - - @@ -829,6 +835,7 @@ + From 5748fdb49f97acffad16d34bd8bfbbd61541a9b6 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Mon, 3 Aug 2015 23:02:16 +0200 Subject: [PATCH 04/85] [BUG_FIXED] Fix the inconsist code (closes #624) Fix using of the member just after object deleting itself. --- PowerEditor/src/WinControls/DockingWnd/Gripper.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PowerEditor/src/WinControls/DockingWnd/Gripper.cpp b/PowerEditor/src/WinControls/DockingWnd/Gripper.cpp index 22645e8f8..2c64fec56 100644 --- a/PowerEditor/src/WinControls/DockingWnd/Gripper.cpp +++ b/PowerEditor/src/WinControls/DockingWnd/Gripper.cpp @@ -239,8 +239,8 @@ LRESULT Gripper::runProc(UINT message, WPARAM wParam, LPARAM lParam) mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); ::SetWindowPos(_hParent, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); _pCont->focusClient(); - delete this; - break; + delete this; // TODO: remove this line and delete this object outside of itself + return TRUE; } default: break; From f6b7bb0469579d85d311faf1d65da23b09c5b816 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Mon, 3 Aug 2015 23:41:09 +0200 Subject: [PATCH 05/85] [RELEASE] Notepad++ 6.8.1 release --- PowerEditor/bin/change.log | 14 +++++++++----- PowerEditor/installer/nppSetup.nsi | 4 ++-- PowerEditor/src/resource.h | 6 +++--- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/PowerEditor/bin/change.log b/PowerEditor/bin/change.log index c921ecca0..31b1b3ffc 100644 --- a/PowerEditor/bin/change.log +++ b/PowerEditor/bin/change.log @@ -1,9 +1,13 @@ -Notepad++ v6.8 new features and bug-fix: +Notepad++ v6.8.1 bug-fixes: -1. Settings on cloud feature allows users to write their settings on whichever cloud. -2. Use Source Code Pro as default font. -3. Make smooth font optional. -4. Fix the context menu disappears problem after find in files operation. +1. Fix the Source Code Pro font making OS hanging issue (for some specific hardware congiguration). +2. Make current default font (Source Code Pro) prettier by adding its bold, italic and bold-italic fonts. +3. Fix "Restore recent close file" text disappearing issue for some circonstance. +4. Fix snapshot file after saving being always dirty problem. +5. Fix document tab moving by clicking close button issue due to splitter inaccuracy. +6. Fix a regression of Preferences dialog in which some modified options are not applied immediately. +7. Fix inconsistant untitled document name issue (new 0 instead of new 1). +8. Fix Macro button on toolbar inconsistant issue at Notepad++ startup. diff --git a/PowerEditor/installer/nppSetup.nsi b/PowerEditor/installer/nppSetup.nsi index ae45481d6..2b1129aab 100644 --- a/PowerEditor/installer/nppSetup.nsi +++ b/PowerEditor/installer/nppSetup.nsi @@ -36,10 +36,10 @@ ; Define the application name !define APPNAME "Notepad++" -!define APPVERSION "6.8" +!define APPVERSION "6.8.1" !define APPNAMEANDVERSION "${APPNAME} v${APPVERSION}" !define VERSION_MAJOR 6 -!define VERSION_MINOR 8 +!define VERSION_MINOR 81 !define APPWEBSITE "http://notepad-plus-plus.org/" diff --git a/PowerEditor/src/resource.h b/PowerEditor/src/resource.h index 3cc35e589..1f74f3f07 100644 --- a/PowerEditor/src/resource.h +++ b/PowerEditor/src/resource.h @@ -29,12 +29,12 @@ #ifndef RESOURCE_H #define RESOURCE_H -#define NOTEPAD_PLUS_VERSION TEXT("Notepad++ v6.8") +#define NOTEPAD_PLUS_VERSION TEXT("Notepad++ v6.8.1") // should be X.Y : ie. if VERSION_DIGITALVALUE == 4, 7, 1, 0 , then X = 4, Y = 71 // ex : #define VERSION_VALUE TEXT("5.63\0") -#define VERSION_VALUE TEXT("6.8\0") -#define VERSION_DIGITALVALUE 6, 8, 0, 0 +#define VERSION_VALUE TEXT("6.8.1\0") +#define VERSION_DIGITALVALUE 6, 8, 1, 0 #ifndef IDC_STATIC #define IDC_STATIC -1 From 7a431549343386505c00217f28637f0877b87455 Mon Sep 17 00:00:00 2001 From: Don HO Date: Tue, 4 Aug 2015 01:47:14 +0200 Subject: [PATCH 06/85] Update CONTRIBUTING.md --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a5dbf23cf..a1d80dd99 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -54,7 +54,7 @@ In short: The easier the code review is, the better the chance your pull request * ###### Good: ```cpp - if (10 == a && 42 == b) + if (a == 10 && b == 42) ``` * ###### Bad: From 660951bdf673d57ed5ea3263e96422d17d766b60 Mon Sep 17 00:00:00 2001 From: Damien GERARD Date: Tue, 4 Aug 2015 13:36:22 +0200 Subject: [PATCH 07/85] Coding style / Code cleanup --- PowerEditor/src/MISC/Common/Common.cpp | 90 +++-- PowerEditor/src/MISC/Common/Common.h | 46 +-- PowerEditor/src/Notepad_plus.cpp | 66 +++- PowerEditor/src/Notepad_plus.h | 168 ++++---- PowerEditor/src/Notepad_plus_Window.cpp | 22 +- PowerEditor/src/NppIO.cpp | 138 +++---- .../src/ScitillaComponent/AutoCompletion.cpp | 34 +- PowerEditor/src/ScitillaComponent/Buffer.cpp | 361 +++++++++++------- PowerEditor/src/ScitillaComponent/Buffer.h | 309 +++++++-------- .../src/ScitillaComponent/DocTabView.cpp | 47 ++- .../ScitillaComponent/ScintillaEditView.cpp | 236 ++++++------ .../src/ScitillaComponent/ScintillaEditView.h | 54 +-- .../src/WinControls/AboutDlg/AboutDlg.cpp | 14 +- .../src/WinControls/AboutDlg/URLCtrl.cpp | 130 +++---- .../WinControls/AnsiCharPanel/ListView.cpp | 26 +- .../WinControls/DockingWnd/DockingManager.cpp | 48 +-- .../DockingWnd/DockingSplitter.cpp | 22 +- .../src/WinControls/DockingWnd/Gripper.cpp | 78 ++-- .../FunctionList/functionListPanel.cpp | 54 +-- PowerEditor/src/WinControls/Grid/BabyGrid.cpp | 124 +++--- .../src/WinControls/ProjectPanel/TreeView.cpp | 48 +-- .../SplitterContainer/Splitter.cpp | 98 ++--- .../SplitterContainer/SplitterContainer.cpp | 36 +- .../WinControls/StaticDialog/StaticDialog.cpp | 18 +- .../src/WinControls/StatusBar/StatusBar.cpp | 141 +++++-- .../src/WinControls/StatusBar/StatusBar.h | 76 ++-- .../src/WinControls/TabBar/ControlsTab.h | 37 +- PowerEditor/src/WinControls/TabBar/TabBar.cpp | 150 +++++--- PowerEditor/src/WinControls/TabBar/TabBar.h | 63 +-- .../src/WinControls/TreeView/TreeView.cpp | 34 +- PowerEditor/src/WinControls/Window.h | 103 ++--- .../WinControls/WindowsDlg/SizeableDlg.cpp | 43 ++- .../src/WinControls/WindowsDlg/WinMgr.cpp | 22 +- .../src/WinControls/WindowsDlg/WindowsDlg.cpp | 122 +++--- PowerEditor/src/winmain.cpp | 111 +++--- 35 files changed, 1711 insertions(+), 1458 deletions(-) diff --git a/PowerEditor/src/MISC/Common/Common.cpp b/PowerEditor/src/MISC/Common/Common.cpp index 58d472c97..57de62a3a 100644 --- a/PowerEditor/src/MISC/Common/Common.cpp +++ b/PowerEditor/src/MISC/Common/Common.cpp @@ -24,20 +24,20 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - #include #include #include #include #include "StaticDialog.h" - - #include "Common.h" #include "../Utf8.h" -WcharMbcsConvertor * WcharMbcsConvertor::_pSelf = new WcharMbcsConvertor; + +WcharMbcsConvertor* WcharMbcsConvertor::_pSelf = new WcharMbcsConvertor; + + + void printInt(int int2print) { @@ -112,6 +112,7 @@ generic_string relativeFilePathToFullFilePath(const TCHAR *relativeFilePath) fullFilePathName += getDriveLetter(); fullFilePathName += ':'; } + fullFilePathName += relativeFilePath; } @@ -301,7 +302,6 @@ int filter(unsigned int code, struct _EXCEPTION_POINTERS *) { if (code == EXCEPTION_ACCESS_VIOLATION) return EXCEPTION_EXECUTE_HANDLER; - return EXCEPTION_CONTINUE_SEARCH; } @@ -310,9 +310,11 @@ bool isInList(const TCHAR *token, const TCHAR *list) { if ((!token) || (!list)) return false; + TCHAR word[64]; size_t i = 0; size_t j = 0; + for (size_t len = lstrlen(list); i <= len; ++i) { if ((list[i] == ' ')||(list[i] == '\0')) @@ -341,24 +343,26 @@ generic_string purgeMenuItemString(const TCHAR * menuItemStr, bool keepAmpersand TCHAR cleanedName[64] = TEXT(""); size_t j = 0; size_t menuNameLen = lstrlen(menuItemStr); - for(size_t k = 0 ; k < menuNameLen ; ++k) + for (size_t k = 0 ; k < menuNameLen ; ++k) { if (menuItemStr[k] == '\t') { cleanedName[k] = 0; break; } - else if (menuItemStr[k] == '&') - { - if (keepAmpersand) - cleanedName[j++] = menuItemStr[k]; - //else skip - } else { - cleanedName[j++] = menuItemStr[k]; + if (menuItemStr[k] == '&') + { + if (keepAmpersand) + cleanedName[j++] = menuItemStr[k]; + //else skip + } + else + cleanedName[j++] = menuItemStr[k]; } } + cleanedName[j] = 0; return cleanedName; } @@ -367,10 +371,15 @@ generic_string purgeMenuItemString(const TCHAR * menuItemStr, bool keepAmpersand const wchar_t * WcharMbcsConvertor::char2wchar(const char * mbcs2Convert, UINT codepage, int lenMbcs, int *pLenWc, int *pBytesNotProcessed) { // Do not process NULL pointer - if (!mbcs2Convert) return NULL; + if (!mbcs2Convert) + return nullptr; // Do not process empty strings - if (lenMbcs == 0 || lenMbcs == -1 && mbcs2Convert[0] == 0) { _wideCharStr.empty(); return _wideCharStr; } + if (lenMbcs == 0 || lenMbcs == -1 && mbcs2Convert[0] == 0) + { + _wideCharStr.empty(); + return _wideCharStr; + } int bytesNotProcessed = 0; int lenWc = 0; @@ -419,8 +428,11 @@ const wchar_t * WcharMbcsConvertor::char2wchar(const char * mbcs2Convert, UINT c else _wideCharStr.empty(); - if (pLenWc) *pLenWc = lenWc; - if (pBytesNotProcessed) *pBytesNotProcessed = bytesNotProcessed; + if (pLenWc) + *pLenWc = lenWc; + if (pBytesNotProcessed) + *pBytesNotProcessed = bytesNotProcessed; + return _wideCharStr; } @@ -459,10 +471,10 @@ const wchar_t * WcharMbcsConvertor::char2wchar(const char * mbcs2Convert, UINT c } -const char * WcharMbcsConvertor::wchar2char(const wchar_t * wcharStr2Convert, UINT codepage, int lenWc, int *pLenMbcs) +const char* WcharMbcsConvertor::wchar2char(const wchar_t * wcharStr2Convert, UINT codepage, int lenWc, int *pLenMbcs) { - // Do not process NULL pointer - if (!wcharStr2Convert) return NULL; + if (nullptr == wcharStr2Convert) + return nullptr; int lenMbcs = WideCharToMultiByte(codepage, 0, wcharStr2Convert, lenWc, NULL, 0, NULL, NULL); if (lenMbcs > 0) @@ -481,8 +493,8 @@ const char * WcharMbcsConvertor::wchar2char(const wchar_t * wcharStr2Convert, UI const char * WcharMbcsConvertor::wchar2char(const wchar_t * wcharStr2Convert, UINT codepage, long *mstart, long *mend) { - // Do not process NULL pointer - if (!wcharStr2Convert) return NULL; + if (nullptr == wcharStr2Convert) + return nullptr; int len = WideCharToMultiByte(codepage, 0, wcharStr2Convert, -1, NULL, 0, NULL, NULL); if (len > 0) @@ -517,10 +529,10 @@ std::wstring string2wstring(const std::string & rString, UINT codepage) MultiByteToWideChar(codepage, 0, rString.c_str(), -1, &vw[0], len); return &vw[0]; } - else - return L""; + return std::wstring(); } + std::string wstring2string(const std::wstring & rwString, UINT codepage) { int len = WideCharToMultiByte(codepage, 0, rwString.c_str(), -1, NULL, 0, NULL, NULL); @@ -530,10 +542,10 @@ std::string wstring2string(const std::wstring & rwString, UINT codepage) WideCharToMultiByte(codepage, 0, rwString.c_str(), -1, &vw[0], len, NULL, NULL); return &vw[0]; } - else - return ""; + return std::string(); } + // Escapes ampersands in file name to use it in menu template generic_string convertFileName(T beg, T end) @@ -549,6 +561,7 @@ generic_string convertFileName(T beg, T end) return strTmp; } + generic_string intToString(int val) { std::vector vt; @@ -558,7 +571,8 @@ generic_string intToString(int val) vt.push_back('0' + (TCHAR)(std::abs(val % 10))); val /= 10; - while (val != 0) { + while (val != 0) + { vt.push_back('0' + (TCHAR)(std::abs(val % 10))); val /= 10; } @@ -569,13 +583,15 @@ generic_string intToString(int val) return generic_string(vt.rbegin(), vt.rend()); } + generic_string uintToString(unsigned int val) { std::vector vt; vt.push_back('0' + (TCHAR)(val % 10)); val /= 10; - while (val != 0) { + while (val != 0) + { vt.push_back('0' + (TCHAR)(val % 10)); val /= 10; } @@ -635,7 +651,7 @@ generic_string BuildMenuFileName(int filenameLen, unsigned int pos, const generi } -generic_string PathRemoveFileSpec(generic_string & path) +generic_string PathRemoveFileSpec(generic_string& path) { generic_string::size_type lastBackslash = path.find_last_of(TEXT('\\')); if (lastBackslash == generic_string::npos) @@ -649,7 +665,7 @@ generic_string PathRemoveFileSpec(generic_string & path) { if (lastBackslash == 2 && path[1] == TEXT(':') && path.size() >= 3) // "C:\foo.exe" becomes "C:\" path.erase(3); - else if (lastBackslash == 0 && path.size() > 1) // "\foo.exe" becomes "\" + else if (lastBackslash == 0 && path.size() > 1) // "\foo.exe" becomes "\" path.erase(1); else path.erase(lastBackslash); @@ -658,29 +674,29 @@ generic_string PathRemoveFileSpec(generic_string & path) } -generic_string PathAppend(generic_string &strDest, const generic_string & str2append) +generic_string PathAppend(generic_string& strDest, const generic_string& str2append) { - if (strDest == TEXT("") && str2append == TEXT("")) // "" + "" + if (strDest.empty() && str2append.empty()) // "" + "" { strDest = TEXT("\\"); return strDest; } - if (strDest == TEXT("") && str2append != TEXT("")) // "" + titi + if (strDest.empty() && not str2append.empty()) // "" + titi { strDest = str2append; return strDest; } - if (strDest[strDest.length() - 1] == '\\' && (str2append != TEXT("") && str2append[0] == '\\')) // toto\ + \titi + if (strDest[strDest.length() - 1] == '\\' && (not str2append.empty() && str2append[0] == '\\')) // toto\ + \titi { strDest.erase(strDest.length() - 1, 1); strDest += str2append; return strDest; } - if ((strDest[strDest.length() - 1] == '\\' && (str2append != TEXT("") && str2append[0] != '\\')) // toto\ + titi - || (strDest[strDest.length() - 1] != '\\' && (str2append != TEXT("") && str2append[0] == '\\'))) // toto + \titi + if ((strDest[strDest.length() - 1] == '\\' && (not str2append.empty() && str2append[0] != '\\')) // toto\ + titi + || (strDest[strDest.length() - 1] != '\\' && (not str2append.empty() && str2append[0] == '\\'))) // toto + \titi { strDest += str2append; return strDest; diff --git a/PowerEditor/src/MISC/Common/Common.h b/PowerEditor/src/MISC/Common/Common.h index 4ce7307ca..895e668bb 100644 --- a/PowerEditor/src/MISC/Common/Common.h +++ b/PowerEditor/src/MISC/Common/Common.h @@ -24,15 +24,12 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - -#ifndef M30_IDE_COMMUN_H -#define M30_IDE_COMMUN_H - +#pragma once #include #include - #include +#include + const bool dirUp = true; const bool dirDown = false; @@ -117,59 +114,64 @@ std::string getFileContent(const TCHAR *file2read); generic_string relativeFilePathToFullFilePath(const TCHAR *relativeFilePath); void writeFileContent(const TCHAR *file2write, const char *content2write); -class WcharMbcsConvertor { + +class WcharMbcsConvertor final +{ public: - static WcharMbcsConvertor * getInstance() {return _pSelf;}; - static void destroyInstance() {delete _pSelf;}; + static WcharMbcsConvertor * getInstance() {return _pSelf;} + static void destroyInstance() {delete _pSelf;} const wchar_t * char2wchar(const char *mbStr, UINT codepage, int lenIn=-1, int *pLenOut=NULL, int *pBytesNotProcessed=NULL); const wchar_t * char2wchar(const char *mbcs2Convert, UINT codepage, int *mstart, int *mend); const char * wchar2char(const wchar_t *wcStr, UINT codepage, int lenIn=-1, int *pLenOut=NULL); const char * wchar2char(const wchar_t *wcStr, UINT codepage, long *mstart, long *mend); - const char * encode(UINT fromCodepage, UINT toCodepage, const char *txt2Encode, int lenIn=-1, int *pLenOut=NULL, int *pBytesNotProcessed=NULL) { + const char * encode(UINT fromCodepage, UINT toCodepage, const char *txt2Encode, int lenIn=-1, int *pLenOut=NULL, int *pBytesNotProcessed=NULL) + { int lenWc = 0; const wchar_t * strW = char2wchar(txt2Encode, fromCodepage, lenIn, &lenWc, pBytesNotProcessed); return wchar2char(strW, toCodepage, lenWc, pLenOut); - }; + } protected: WcharMbcsConvertor() {} ~WcharMbcsConvertor() {} - static WcharMbcsConvertor * _pSelf; + static WcharMbcsConvertor* _pSelf; template - class StringBuffer + class StringBuffer final { public: - StringBuffer() : _str(0), _allocLen(0) { } - ~StringBuffer() { if(_allocLen) delete [] _str; } + ~StringBuffer() { if(_allocLen) delete[] _str; } void sizeTo(size_t size) { - if(_allocLen < size) + if (_allocLen < size) { - if(_allocLen) delete[] _str; + if (_allocLen) + delete[] _str; _allocLen = max(size, initSize); _str = new T[_allocLen]; } } + void empty() { static T nullStr = 0; // routines may return an empty string, with null terminator, without allocating memory; a pointer to this null character will be returned in that case - if(_allocLen == 0) + if (_allocLen == 0) _str = &nullStr; else _str[0] = 0; } - operator T*() { return _str; } + operator T* () { return _str; } + operator const T* () const { return _str; } protected: static const int initSize = 1024; - size_t _allocLen; - T* _str; + size_t _allocLen = 0; + T* _str = nullptr; }; StringBuffer _multiByteStr; @@ -202,5 +204,3 @@ generic_string stringTakeWhileAdmissable(const generic_string& input, const gene double stodLocale(const generic_string& str, _locale_t loc, size_t* idx = NULL); bool str2Clipboard(const generic_string &str2cpy, HWND hwnd); - -#endif //M30_IDE_COMMUN_H diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index 7d8a3ea72..e3eddbe52 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -126,14 +126,13 @@ ToolBarButtonUnit toolBarIcons[] = { {IDM_MACRO_SAVECURRENTMACRO, IDI_SAVERECORD_OFF_ICON, IDI_SAVERECORD_ON_ICON, IDI_SAVERECORD_DISABLE_ICON, IDR_SAVERECORD} }; -Notepad_plus::Notepad_plus(): _mainWindowStatus(0), _pDocTab(NULL), _pEditView(NULL), - _pMainSplitter(NULL), - _recordingMacro(false), _pTrayIco(NULL), _isUDDocked(false), _pFileSwitcherPanel(NULL), - _pProjectPanel_1(NULL), _pProjectPanel_2(NULL), _pProjectPanel_3(NULL), _pDocMap(NULL), _pFuncList(NULL), - _linkTriggered(true), _isHotspotDblClicked(false), _isFolding(false), - _sysMenuEntering(false), - _autoCompleteMain(&_mainEditView), _autoCompleteSub(&_subEditView), _smartHighlighter(&_findReplaceDlg), - _isFileOpening(false), _pAnsiCharPanel(NULL), _pClipboardHistoryPanel(NULL) + + + +Notepad_plus::Notepad_plus() + : _autoCompleteMain(&_mainEditView) + , _autoCompleteSub(&_subEditView) + , _smartHighlighter(&_findReplaceDlg) { ZeroMemory(&_prevSelectedRange, sizeof(_prevSelectedRange)); @@ -368,11 +367,11 @@ LRESULT Notepad_plus::init(HWND hwnd) //--Status Bar Section--// bool willBeShown = nppGUI._statusBarShow; _statusBar.init(_pPublicInterface->getHinst(), hwnd, 6); - _statusBar.setPartWidth(STATUSBAR_DOC_SIZE, 200); - _statusBar.setPartWidth(STATUSBAR_CUR_POS, 260); - _statusBar.setPartWidth(STATUSBAR_EOF_FORMAT, 110); + _statusBar.setPartWidth(STATUSBAR_DOC_SIZE, 200); + _statusBar.setPartWidth(STATUSBAR_CUR_POS, 260); + _statusBar.setPartWidth(STATUSBAR_EOF_FORMAT, 110); _statusBar.setPartWidth(STATUSBAR_UNICODE_TYPE, 120); - _statusBar.setPartWidth(STATUSBAR_TYPING_MODE, 30); + _statusBar.setPartWidth(STATUSBAR_TYPING_MODE, 30); _statusBar.display(willBeShown); _pMainWindow = &_mainDocTab; @@ -380,7 +379,10 @@ LRESULT Notepad_plus::init(HWND hwnd) _dockingManager.init(_pPublicInterface->getHinst(), hwnd, &_pMainWindow); if (nppGUI._isMinimizedToTray && _pTrayIco == NULL) - _pTrayIco = new trayIconControler(hwnd, IDI_M30ICON, IDC_MINIMIZED_TRAY, ::LoadIcon(_pPublicInterface->getHinst(), MAKEINTRESOURCE(IDI_M30ICON)), TEXT("")); + { + HICON icon = ::LoadIcon(_pPublicInterface->getHinst(), MAKEINTRESOURCE(IDI_M30ICON)); + _pTrayIco = new trayIconControler(hwnd, IDI_M30ICON, IDC_MINIMIZED_TRAY, icon, TEXT("")); + } checkSyncState(); @@ -422,9 +424,7 @@ LRESULT Notepad_plus::init(HWND hwnd) ::InsertMenu(hMacroMenu, posBase - 1, MF_BYPOSITION, (unsigned int)-1, 0); for (size_t i = 0 ; i < nbMacro ; ++i) - { ::InsertMenu(hMacroMenu, posBase + i, MF_BYPOSITION, ID_MACRO + i, macros[i].toMenuItemString().c_str()); - } if (nbMacro >= 1) { @@ -554,7 +554,7 @@ LRESULT Notepad_plus::init(HWND hwnd) TCHAR menuName[64]; for (size_t i = 0 ; i < len ; ++i) { - if (tmp[i]._itemName == TEXT("")) + if (tmp[i]._itemName.empty()) { ::GetMenuString(_mainMenuHandle, tmp[i]._cmdID, menuName, 64, MF_BYCOMMAND); tmp[i]._itemName = purgeMenuItemString(menuName); @@ -902,6 +902,26 @@ void Notepad_plus::saveDockingParams() } +void Notepad_plus::saveUserDefineLangs() +{ + if (ScintillaEditView::getUserDefineDlg()->isDirty()) + (NppParameters::getInstance())->writeUserDefinedLang(); +} + + +void Notepad_plus::saveShortcuts() +{ + NppParameters::getInstance()->writeShortcuts(); +} + + +void Notepad_plus::saveFindHistory() +{ + _findReplaceDlg.saveFindHistory(); + (NppParameters::getInstance())->writeFindHistory(); +} + + int Notepad_plus::getHtmlXmlEncoding(const TCHAR *fileName) const { // Get Language type @@ -2100,6 +2120,12 @@ bool Notepad_plus::braceMatch() } +void Notepad_plus::setLangStatus(LangType langType) +{ + _statusBar.setText(getLangDesc(langType).c_str(), STATUSBAR_DOC_TYPE); +} + + void Notepad_plus::setDisplayFormat(formatType f) { generic_string str; @@ -2981,7 +3007,8 @@ void Notepad_plus::getMainClientRect(RECT &rc) const rc.bottom -= rc.top + _rebarBottom.getHeight() + _statusBar.getHeight(); } -void Notepad_plus::showView(int whichOne) { +void Notepad_plus::showView(int whichOne) +{ if (viewVisible(whichOne)) //no use making visible view visible return; @@ -3027,8 +3054,11 @@ void Notepad_plus::hideView(int whichOne) { _pMainSplitter->setWin0(windowToSet); } - else // otherwise the main window is the spltter container that we just created + else + { + // otherwise the main window is the spltter container that we just created _pMainWindow = windowToSet; + } _subSplitter.display(false); //hide splitter //hide scintilla and doctab diff --git a/PowerEditor/src/Notepad_plus.h b/PowerEditor/src/Notepad_plus.h index 9db2c945c..8905a8e85 100644 --- a/PowerEditor/src/Notepad_plus.h +++ b/PowerEditor/src/Notepad_plus.h @@ -161,29 +161,29 @@ enum spaceTab { struct TaskListInfo; -struct VisibleGUIConf { - bool isPostIt; - bool isFullScreen; + +struct VisibleGUIConf final +{ + bool isPostIt = false; + bool isFullScreen = false; //Used by both views - bool isMenuShown; + bool isMenuShown = true; //bool isToolbarShown; //toolbar forcefully hidden by hiding rebar - DWORD_PTR preStyle; + DWORD_PTR preStyle = (WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN); //used by postit only - bool isTabbarShown; - bool isAlwaysOnTop; - bool isStatusbarShown; + bool isTabbarShown = true; + bool isAlwaysOnTop = false; + bool isStatusbarShown = true; //used by fullscreen only WINDOWPLACEMENT _winPlace; - VisibleGUIConf() : isPostIt(false), isFullScreen(false), - isAlwaysOnTop(false), isMenuShown(true), isTabbarShown(true), - isStatusbarShown(true), preStyle(WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN) + VisibleGUIConf() { - _winPlace.length = 0; - }; + memset(&_winPlace, 0x0, sizeof(_winPlace)); + } }; @@ -196,14 +196,19 @@ class ProjectPanel; class DocumentMap; class FunctionListPanel; -class Notepad_plus + + + + +class Notepad_plus final { friend class Notepad_plus_Window; friend class FileManager; public: Notepad_plus(); - virtual ~Notepad_plus(); + ~Notepad_plus(); + LRESULT init(HWND hwnd); LRESULT process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); void killAllChildren(); @@ -215,7 +220,8 @@ public: // For filtering the modeless Dialog message -// fileOperations + //! \name File Operations + //@{ //The doXXX functions apply to a single buffer and dont need to worry about views, with the excpetion of doClose, since closing one view doesnt have to mean the document is gone BufferID doOpen(const TCHAR *fileName, bool isRecursive = false, bool isReadOnly = false, int encoding = -1, const TCHAR *backupFileName = NULL, time_t fileNameTimestamp = 0); bool doReload(BufferID id, bool alert = true); @@ -225,16 +231,11 @@ public: void fileOpen(); void fileNew(); - - bool fileReload() { - BufferID buf = _pEditView->getCurrentBufferID(); - return doReload(buf, buf->isDirty()); - } - + bool fileReload(); bool fileClose(BufferID id = BUFFER_INVALID, int curView = -1); //use curView to override view to close from bool fileCloseAll(bool doDeleteBackup, bool isSnapshotMode = false); bool fileCloseAllButCurrent(); - bool fileCloseAllGiven(const std::vector &krvecBufferIndexes); + bool fileCloseAllGiven(const std::vector& krvecBufferIndexes); bool fileCloseAllToLeft(); bool fileCloseAllToRight(); bool fileSave(BufferID id = BUFFER_INVALID); @@ -246,7 +247,7 @@ public: bool addBufferToView(BufferID id, int whichOne); bool moveBuffer(BufferID id, int whereTo); //assumes whereFrom is otherView(whereTo) bool switchToFile(BufferID buffer); //find buffer in active view then in other view. -// end fileOperations + //@} bool isFileSession(const TCHAR * filename); void filePrint(bool showDialog); @@ -255,26 +256,17 @@ public: bool saveGUIParams(); bool saveProjectPanelsParams(); void saveDockingParams(); - void saveUserDefineLangs() { - if (ScintillaEditView::getUserDefineDlg()->isDirty()) - (NppParameters::getInstance())->writeUserDefinedLang(); - } - void saveShortcuts(){ - NppParameters::getInstance()->writeShortcuts(); - } + void saveUserDefineLangs(); + void saveShortcuts(); void saveSession(const Session & session); void saveCurrentSession(); + void saveFindHistory(); - void saveFindHistory(){ - _findReplaceDlg.saveFindHistory(); - (NppParameters::getInstance())->writeFindHistory(); - } + void getCurrentOpenedFiles(Session& session, bool includUntitledDoc = false); - void getCurrentOpenedFiles(Session & session, bool includUntitledDoc = false); - - bool fileLoadSession(const TCHAR *fn = NULL); + bool fileLoadSession(const TCHAR* fn = nullptr); const TCHAR * fileSaveSession(size_t nbFile, TCHAR ** fileNames, const TCHAR *sessionFile2save); - const TCHAR * fileSaveSession(size_t nbFile = 0, TCHAR ** fileNames = NULL); + const TCHAR * fileSaveSession(size_t nbFile = 0, TCHAR** fileNames = nullptr); void changeToolBarIcons(); bool doBlockComment(comment_mode currCommentMode); @@ -298,7 +290,7 @@ public: return _accelerator.getAccTable(); } bool emergency(generic_string emergencySavedDir); - Buffer * getCurrentBuffer() { + Buffer* getCurrentBuffer() { return _pEditView->getCurrentBuffer(); } void launchDocumentBackupTask(); @@ -306,39 +298,42 @@ public: void showQuoteFromIndex(int index) const; void showQuote(const char *quote, const char *quoter, bool doTrolling) const; + private: - Notepad_plus_Window *_pPublicInterface; - Window *_pMainWindow; + Notepad_plus_Window *_pPublicInterface = nullptr; + Window *_pMainWindow = nullptr; DockingManager _dockingManager; std::vector _internalFuncIDs; AutoCompletion _autoCompleteMain; - AutoCompletion _autoCompleteSub; //each Scintilla has its own autoComplete + AutoCompletion _autoCompleteSub; // each Scintilla has its own autoComplete SmartHighlighter _smartHighlighter; NativeLangSpeaker _nativeLangSpeaker; DocTabView _mainDocTab; DocTabView _subDocTab; - DocTabView *_pDocTab; - DocTabView *_pNonDocTab; + DocTabView* _pDocTab = nullptr; + DocTabView* _pNonDocTab = nullptr; ScintillaEditView _subEditView; ScintillaEditView _mainEditView; - ScintillaEditView _invisibleEditView; //for searches - ScintillaEditView _fileEditView; //for FileManager - ScintillaEditView *_pEditView; - ScintillaEditView *_pNonEditView; + ScintillaEditView _invisibleEditView; // for searches + ScintillaEditView _fileEditView; // for FileManager + ScintillaEditView* _pEditView = nullptr; + ScintillaEditView* _pNonEditView = nullptr; - SplitterContainer *_pMainSplitter; + SplitterContainer* _pMainSplitter = nullptr; SplitterContainer _subSplitter; - ContextMenu _tabPopupMenu, _tabPopupDropMenu, _fileSwitcherMultiFilePopupMenu; + ContextMenu _tabPopupMenu; + ContextMenu _tabPopupDropMenu; + ContextMenu _fileSwitcherMultiFilePopupMenu; ToolBar _toolBar; IconList _docTabIconList; StatusBar _statusBar; - bool _toReduceTabBar; + bool _toReduceTabBar = false; ReBar _rebarTop; ReBar _rebarBottom; @@ -361,9 +356,9 @@ private: //vector _customIconVect; WindowsMenu _windowsMenu; - HMENU _mainMenuHandle; + HMENU _mainMenuHandle = NULL; - bool _sysMenuEntering; + bool _sysMenuEntering = false; // For FullScreen/PostIt features @@ -373,43 +368,42 @@ private: // Keystroke macro recording and playback Macro _macro; - bool _recordingMacro; + bool _recordingMacro = false; RunMacroDlg _runMacroDlg; // For hotspot - bool _linkTriggered; - bool _isHotspotDblClicked; - bool _isFolding; + bool _linkTriggered = true; + bool _isHotspotDblClicked = false; + bool _isFolding = false; //For Dynamic selection highlight CharacterRange _prevSelectedRange; - struct ActivateAppInfo + struct ActivateAppInfo final { - bool _isActivated; - int _x; - int _y; - ActivateAppInfo() : _isActivated(false), _x(0), _y(0){}; + bool _isActivated = false; + int _x = 0; + int _y = 0; } _activeAppInf; //Synchronized Scolling - struct SyncInfo + struct SyncInfo final { - int _line; - int _column; - bool _isSynScollV; - bool _isSynScollH; - SyncInfo():_line(0), _column(0), _isSynScollV(false), _isSynScollH(false){}; - bool doSync() const {return (_isSynScollV || _isSynScollH); }; + int _line = 0; + int _column = 0; + bool _isSynScollV = false; + bool _isSynScollH = false; + + bool doSync() const {return (_isSynScollV || _isSynScollH); } } _syncInfo; - bool _isUDDocked; + bool _isUDDocked = false; - trayIconControler *_pTrayIco; - int _zoomOriginalValue; + trayIconControler* _pTrayIco = nullptr; + int _zoomOriginalValue = 0; Accelerator _accelerator; ScintillaAccelerator _scintaccelerator; @@ -417,30 +411,30 @@ private: PluginsManager _pluginsManager; ButtonDlg _restoreButton; - bool _isFileOpening; - bool _isAdministrator; + bool _isFileOpening = false; + bool _isAdministrator = false; ScintillaCtrls _scintillaCtrls4Plugins; std::vector > _hideLinesMarks; StyleArray _hotspotStyles; - AnsiCharPanel *_pAnsiCharPanel; - ClipboardHistoryPanel *_pClipboardHistoryPanel; - VerticalFileSwitcher *_pFileSwitcherPanel; - ProjectPanel *_pProjectPanel_1; - ProjectPanel *_pProjectPanel_2; - ProjectPanel *_pProjectPanel_3; + AnsiCharPanel* _pAnsiCharPanel = nullptr; + ClipboardHistoryPanel* _pClipboardHistoryPanel = nullptr; + VerticalFileSwitcher* _pFileSwitcherPanel = nullptr; + ProjectPanel* _pProjectPanel_1 = nullptr; + ProjectPanel* _pProjectPanel_2 = nullptr; + ProjectPanel* _pProjectPanel_3 = nullptr; - DocumentMap *_pDocMap; - FunctionListPanel *_pFuncList; + DocumentMap* _pDocMap = nullptr; + FunctionListPanel* _pFuncList = nullptr; BOOL notify(SCNotification *notification); void command(int id); //Document management - UCHAR _mainWindowStatus; //For 2 views and user dialog if docked - int _activeView; + UCHAR _mainWindowStatus = 0; //For 2 views and user dialog if docked + int _activeView = MAIN_VIEW; //User dialog docking void dockUserDlg(); @@ -506,9 +500,7 @@ private: generic_string getLangDesc(LangType langType, bool getName = false); - void setLangStatus(LangType langType){ - _statusBar.setText(getLangDesc(langType).c_str(), STATUSBAR_DOC_TYPE); - } + void setLangStatus(LangType langType); void setDisplayFormat(formatType f); int getCmdIDFromEncoding(int encoding) const; diff --git a/PowerEditor/src/Notepad_plus_Window.cpp b/PowerEditor/src/Notepad_plus_Window.cpp index 49f8be613..c0f7ae630 100644 --- a/PowerEditor/src/Notepad_plus_Window.cpp +++ b/PowerEditor/src/Notepad_plus_Window.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -65,7 +65,7 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin if (cmdLineParams->_isNoPlugin) _notepad_plus_plus_core._pluginsManager.disable(); - + _hSelf = ::CreateWindowEx( WS_EX_ACCEPTFILES | (_notepad_plus_plus_core._nativeLangSpeaker.isRTL()?WS_EX_LAYOUTRTL:0),\ _className,\ @@ -77,7 +77,7 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin NULL,\ _hInst,\ (LPVOID)this); // pass the ptr of this instantiated object - // for retrieve it in Notepad_plus_Proc from + // for retrieve it in Notepad_plus_Proc from // the CREATESTRUCT.lpCreateParams afterward. if (!_hSelf) @@ -113,13 +113,13 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin //SetWindowPlacement will take care of situations, where saved position was in no longer available monitor ::SetWindowPlacement(_hSelf,&posInfo); } - + if (nppGUI._tabStatus & TAB_MULTILINE) ::SendMessage(_hSelf, WM_COMMAND, IDM_VIEW_DRAWTABBAR_MULTILINE, 0); if (!nppGUI._menuBarShow) ::SetMenu(_hSelf, NULL); - + if (cmdLineParams->_isNoTab || (nppGUI._tabStatus & TAB_HIDE)) { const int tabStatusOld = nppGUI._tabStatus; @@ -163,7 +163,7 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin std::vector fileNames; std::vector patterns; patterns.push_back(TEXT("*.xml")); - + generic_string nppDir = pNppParams->getNppPath(); LocalizationSwitcher & localizationSwitcher = pNppParams->getLocalizationSwitcher(); @@ -178,7 +178,7 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin fileNames.clear(); ThemeSwitcher & themeSwitcher = pNppParams->getThemeSwitcher(); - + // Get themes from both npp install themes dir and app data themes dir with the per user // overriding default themes of the same name. @@ -201,7 +201,7 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin for (size_t i = 0, len = fileNames.size(); i < len ; ++i) { generic_string themeName( themeSwitcher.getThemeFromXmlFileName(fileNames[i].c_str()) ); - if (! themeSwitcher.themeNameExists(themeName.c_str()) ) + if (! themeSwitcher.themeNameExists(themeName.c_str()) ) { themeSwitcher.addThemeFromXml(fileNames[i].c_str()); } @@ -269,7 +269,7 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin } } -bool Notepad_plus_Window::isDlgsMsg(MSG *msg) const +bool Notepad_plus_Window::isDlgsMsg(MSG *msg) const { for (size_t i = 0, len = _notepad_plus_plus_core._hModelessDlgs.size(); i < len; ++i) { diff --git a/PowerEditor/src/NppIO.cpp b/PowerEditor/src/NppIO.cpp index f4dc2a9cb..86e682774 100644 --- a/PowerEditor/src/NppIO.cpp +++ b/PowerEditor/src/NppIO.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -39,7 +39,7 @@ using namespace std; BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isRecursive, bool isReadOnly, int encoding, const TCHAR *backupFileName, time_t fileNameTimestamp) { - + const rsize_t longFileNameBufferSize = MAX_PATH; //If [GetFullPathName] succeeds, the return value is the length, in TCHARs, of the string copied to lpBuffer, not including the terminating null character. @@ -59,7 +59,7 @@ BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isRecursive, bool isRe return BUFFER_INVALID; } assert( _tcslen( longFileName ) == getFullPathNameResult ); - + // ignore the returned value of function due to win64 redirection system ::GetLongPathName(longFileName, longFileName, longFileNameBufferSize); @@ -75,7 +75,7 @@ BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isRecursive, bool isRe const TCHAR * fileName2Find; generic_string gs_fileName = fileName; size_t res = gs_fileName.find_first_of(UNTITLED_STR); - + if (res != string::npos && res == 0) { fileName2Find = fileName; @@ -171,7 +171,7 @@ BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isRecursive, bool isRe { encoding = getHtmlXmlEncoding(longFileName); } - + BufferID buffer; if (isSnapshotMode) { @@ -222,7 +222,7 @@ BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isRecursive, bool isRe scnN.nmhdr.code = NPPN_FILEBEFOREOPEN; scnN.nmhdr.idFrom = (uptr_t)buffer; _pluginsManager.notify(&scnN); - + loadBufferIntoView(buffer, currentView()); @@ -270,7 +270,7 @@ BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isRecursive, bool isRe patterns.push_back(TEXT("*")); getMatchedFileNames(fileNameStr.c_str(), patterns, fileNames, true, false); } - + bool ok2Open = true; size_t nbFiles2Open = fileNames.size(); @@ -320,7 +320,7 @@ bool Notepad_plus::doReload(BufferID id, bool alert) int answer = _nativeLangSpeaker.messageBox("DocReloadWarning", _pPublicInterface->getHSelf(), TEXT("Are you sure you want to reload the current file and lose the changes made in Notepad++?"), - TEXT("Reload"), + TEXT("Reload"), MB_YESNO | MB_ICONEXCLAMATION | MB_APPLMODAL); if (answer != IDYES) return false; @@ -362,7 +362,7 @@ bool Notepad_plus::doSave(BufferID id, const TCHAR * filename, bool isCopy) // Notify plugins that current file is about to be saved if (!isCopy) { - + scnN.nmhdr.code = NPPN_FILEBEFORESAVE; scnN.nmhdr.hwndFrom = _pPublicInterface->getHSelf(); scnN.nmhdr.idFrom = (uptr_t)id; @@ -538,7 +538,7 @@ void Notepad_plus::doClose(BufferID id, int whichOne, bool doDeleteBackup) { //close the view if both visible hideView(whichOne); - // if the current activated buffer is in this view, + // if the current activated buffer is in this view, // then get buffer ID to remove the entry from File Switcher Pannel hiddenBufferID = reinterpret_cast(::SendMessage(_pPublicInterface->getHSelf(), NPPM_GETBUFFERIDFROMPOS, 0, whichOne)); } @@ -554,7 +554,7 @@ void Notepad_plus::doClose(BufferID id, int whichOne, bool doDeleteBackup) if (_pFileSwitcherPanel) { //int posInfo = ::SendMessage(_pPublicInterface->getHSelf(), NPPM_GETPOSFROMBUFFERID, (WPARAM)id ,0); - + _pFileSwitcherPanel->closeItem(id, whichOne); if (hiddenBufferID != BUFFER_INVALID) @@ -630,7 +630,7 @@ int Notepad_plus::setFileOpenSaveDlgFilters(FileDialog & fDlg, int langType) LangType lid = l->getLangID(); bool inExcludedList = false; - + for (size_t j = 0, len = nppGUI._excludedLangList.size() ; j < len ; ++j) { if (lid == nppGUI._excludedLangList[j]._langType) @@ -648,7 +648,7 @@ int Notepad_plus::setFileOpenSaveDlgFilters(FileDialog & fDlg, int langType) LexerStylerArray &lsa = (NppParameters::getInstance())->getLStylerArray(); const TCHAR *lName = l->getLangName(); LexerStyler *pLS = lsa.getLexerStylerByName(lName); - + if (pLS) userList = pLS->getLexerUserExt(); @@ -660,7 +660,7 @@ int Notepad_plus::setFileOpenSaveDlgFilters(FileDialog & fDlg, int langType) list += TEXT(" "); list += userList; } - + generic_string stringFilters = exts2Filters(list); const TCHAR *filters = stringFilters.c_str(); if (filters[0]) @@ -708,7 +708,7 @@ bool Notepad_plus::fileClose(BufferID id, int curView) } else if (buf->isDirty()) { - + res = doSaveOrNot(fileNamePath); if (res == IDYES) { @@ -748,7 +748,7 @@ bool Notepad_plus::fileCloseAll(bool doDeleteBackup, bool isSnapshotMode) { // Do nothing } - else if (buf->isDirty()) + else if (buf->isDirty()) { if (isSnapshotMode) { @@ -758,18 +758,18 @@ bool Notepad_plus::fileCloseAll(bool doDeleteBackup, bool isSnapshotMode) activateBuffer(id, MAIN_VIEW); if(!activateBuffer(id, SUB_VIEW)) switchEditViewTo(MAIN_VIEW); - + TCHAR pattern[140] = TEXT("Your backup file cannot be found (deleted from outside).\rSave it otherwise your data will be lost\rDo you want to save file \"%s\" ?"); TCHAR phrase[512]; wsprintf(phrase, pattern, buf->getFullPathName()); int res = doActionOrNot(TEXT("Save"), phrase, MB_YESNOCANCEL | MB_ICONQUESTION | MB_APPLMODAL); //int res = doSaveOrNot(buf->getFullPathName()); - if (res == IDYES) + if (res == IDYES) { if (!fileSave(id)) return false; //abort entire procedure - } - else if (res == IDCANCEL) + } + else if (res == IDCANCEL) { return false; } @@ -782,19 +782,19 @@ bool Notepad_plus::fileCloseAll(bool doDeleteBackup, bool isSnapshotMode) switchEditViewTo(MAIN_VIEW); int res = doSaveOrNot(buf->getFullPathName()); - if (res == IDYES) + if (res == IDYES) { if (!fileSave(id)) return false; //abort entire procedure - } - else if (res == IDCANCEL) + } + else if (res == IDCANCEL) { return false; } } } } - for(int i = 0; i < _subDocTab.nbItem(); ++i) + for(int i = 0; i < _subDocTab.nbItem(); ++i) { BufferID id = _subDocTab.getBufferByIndex(i); Buffer * buf = MainFileManager->getBufferByID(id); @@ -811,18 +811,18 @@ bool Notepad_plus::fileCloseAll(bool doDeleteBackup, bool isSnapshotMode) // warning user and save it if user want it. activateBuffer(id, SUB_VIEW); switchEditViewTo(SUB_VIEW); - + TCHAR pattern[140] = TEXT("Your backup file cannot be found (deleted from outside).\rSave it otherwise your data will be lost\rDo you want to save file \"%s\" ?"); TCHAR phrase[512]; wsprintf(phrase, pattern, buf->getFullPathName()); int res = doActionOrNot(TEXT("Save"), phrase, MB_YESNOCANCEL | MB_ICONQUESTION | MB_APPLMODAL); //int res = doSaveOrNot(buf->getFullPathName()); - if (res == IDYES) + if (res == IDYES) { if (!fileSave(id)) return false; //abort entire procedure - } - else if (res == IDCANCEL) + } + else if (res == IDCANCEL) { return false; } @@ -839,7 +839,7 @@ bool Notepad_plus::fileCloseAll(bool doDeleteBackup, bool isSnapshotMode) if (!fileSave(id)) return false; //abort entire procedure } - else if (res == IDCANCEL) + else if (res == IDCANCEL) { return false; //otherwise continue (IDNO) @@ -879,7 +879,7 @@ bool Notepad_plus::fileCloseAllGiven(const std::vector &krvecBufferIndexes) { // Do nothing. } - else if (buf->isDirty()) + else if (buf->isDirty()) { if(_activeView == MAIN_VIEW) { @@ -894,11 +894,11 @@ bool Notepad_plus::fileCloseAllGiven(const std::vector &krvecBufferIndexes) } int res = doSaveOrNot(buf->getFullPathName()); - if (res == IDYES) + if (res == IDYES) { if (!fileSave(id)) return false; // Abort entire procedure. - } + } else if (res == IDCANCEL) { return false; @@ -954,25 +954,25 @@ bool Notepad_plus::fileCloseAllButCurrent() { // Do nothing } - else if (buf->isDirty()) + else if (buf->isDirty()) { activateBuffer(id, MAIN_VIEW); if(!activateBuffer(id, SUB_VIEW)) switchEditViewTo(MAIN_VIEW); int res = doSaveOrNot(buf->getFullPathName()); - if (res == IDYES) + if (res == IDYES) { if (!fileSave(id)) return false; //abort entire procedure - } + } else if (res == IDCANCEL) { return false; } } } - for(int i = 0; i < _subDocTab.nbItem(); ++i) + for(int i = 0; i < _subDocTab.nbItem(); ++i) { BufferID id = _subDocTab.getBufferByIndex(i); Buffer * buf = MainFileManager->getBufferByID(id); @@ -982,18 +982,18 @@ bool Notepad_plus::fileCloseAllButCurrent() { // Do nothing } - else if (buf->isDirty()) + else if (buf->isDirty()) { activateBuffer(id, SUB_VIEW); switchEditViewTo(SUB_VIEW); int res = doSaveOrNot(buf->getFullPathName()); - if (res == IDYES) + if (res == IDYES) { if (!fileSave(id)) return false; //abort entire procedure - } - else if (res == IDCANCEL) + } + else if (res == IDCANCEL) { return false; } @@ -1006,7 +1006,7 @@ bool Notepad_plus::fileCloseAllButCurrent() { //first close all docs in non-current view, which gets closed automatically //Set active tab to the last one closed. activateBuffer(_pNonDocTab->getBufferByIndex(0), otherView()); - + for(int i = _pNonDocTab->nbItem() - 1; i >= 0; i--) { //close all from right to left doClose(_pNonDocTab->getBufferByIndex(i), otherView(), isSnapshotMode); } @@ -1063,7 +1063,7 @@ bool Notepad_plus::fileSave(BufferID id) else if (backup == bak_verbose) { generic_string fn_dateTime_bak(TEXT("")); - + if ((nppgui._useDir) && (nppgui._backupDir != TEXT(""))) { fn_dateTime_bak = nppgui._backupDir; @@ -1073,11 +1073,11 @@ bool Notepad_plus::fileSave(BufferID id) { const TCHAR *bakDir = TEXT("nppBackup"); - // std::string path should be a temp throwable variable + // std::string path should be a temp throwable variable generic_string path = fn; ::PathRemoveFileSpec(path); fn_dateTime_bak = path.c_str(); - + fn_dateTime_bak += TEXT("\\"); fn_dateTime_bak += bakDir; @@ -1141,7 +1141,7 @@ bool Notepad_plus::fileSaveAs(BufferID id, bool isSaveCopy) fDlg.setExtFilter(TEXT("All types"), TEXT(".*"), NULL); int langTypeIndex = setFileOpenSaveDlgFilters(fDlg, buf->getLangType()); fDlg.setDefFileName(buf->getFileName()); - + fDlg.setExtIndex(langTypeIndex+1); // +1 for "All types" // Disable file autodetection before opening save dialog to prevent use-after-delete bug. @@ -1199,7 +1199,7 @@ bool Notepad_plus::fileRename(BufferID id) fDlg.setExtFilter(TEXT("All types"), TEXT(".*"), NULL); setFileOpenSaveDlgFilters(fDlg); - + fDlg.setDefFileName(buf->getFileName()); TCHAR *pfn = fDlg.doSaveDlg(); @@ -1219,7 +1219,7 @@ bool Notepad_plus::fileDelete(BufferID id) BufferID bufferID = id; if (id == BUFFER_INVALID) bufferID = _pEditView->getCurrentBufferID(); - + Buffer * buf = MainFileManager->getBufferByID(bufferID); const TCHAR *fileNamePath = buf->getFullPathName(); @@ -1246,7 +1246,7 @@ bool Notepad_plus::fileDelete(BufferID id) TEXT("Delete File failed"), TEXT("Delete File"), MB_OK); - + scnN.nmhdr.code = NPPN_FILEDELETEFAILED; _pluginsManager.notify(&scnN); @@ -1269,7 +1269,7 @@ void Notepad_plus::fileOpen() { FileDialog fDlg(_pPublicInterface->getHSelf(), _pPublicInterface->getHinst()); fDlg.setExtFilter(TEXT("All types"), TEXT(".*"), NULL); - + setFileOpenSaveDlgFilters(fDlg); BufferID lastOpened = BUFFER_INVALID; @@ -1287,14 +1287,24 @@ void Notepad_plus::fileOpen() } } + void Notepad_plus::fileNew() { BufferID newBufID = MainFileManager->newEmptyDocument(); - + loadBufferIntoView(newBufID, currentView(), true); //true, because we want multiple new files if possible activateBuffer(newBufID, currentView()); } + +bool Notepad_plus::fileReload() +{ + assert(_pEditView != nullptr); + BufferID buf = _pEditView->getCurrentBufferID(); + return doReload(buf, buf->isDirty()); +} + + bool Notepad_plus::isFileSession(const TCHAR * filename) { // if file2open matches the ext of user defined session file ext, then it'll be opened as a session const TCHAR *definedSessionExt = NppParameters::getInstance()->getNppGUI()._definedSessionExt.c_str(); @@ -1355,7 +1365,7 @@ bool Notepad_plus::loadSession(Session & session, bool isSnapshotMode) pNppParam->safeWow64EnableWow64FsRedirection(FALSE); isWow64Off = true; } - if (PathFileExists(pFn)) + if (PathFileExists(pFn)) { if (isSnapshotMode && session._mainViewFiles[i]._backupFilePath != TEXT("")) lastOpened = doOpen(pFn, false, false, session._mainViewFiles[i]._encoding, session._mainViewFiles[i]._backupFilePath.c_str(), session._mainViewFiles[i]._originalFileLastModifTimestamp); @@ -1411,7 +1421,7 @@ bool Notepad_plus::loadSession(Session & session, bool isSnapshotMode) //Don't use default methods because of performance Document prevDoc = _mainEditView.execute(SCI_GETDOCPOINTER); _mainEditView.execute(SCI_SETDOCPOINTER, 0, buf->getDocument()); - for (size_t j = 0, len = session._mainViewFiles[i]._marks.size(); j < len ; ++j) + for (size_t j = 0, len = session._mainViewFiles[i]._marks.size(); j < len ; ++j) { _mainEditView.execute(SCI_MARKERADD, session._mainViewFiles[i]._marks[j], MARK_BOOKMARK); } @@ -1449,7 +1459,7 @@ bool Notepad_plus::loadSession(Session & session, bool isSnapshotMode) pNppParam->safeWow64EnableWow64FsRedirection(FALSE); isWow64Off = true; } - if (PathFileExists(pFn)) + if (PathFileExists(pFn)) { if (isSnapshotMode && session._subViewFiles[k]._backupFilePath != TEXT("")) lastOpened = doOpen(pFn, false, false, session._subViewFiles[k]._encoding, session._subViewFiles[k]._backupFilePath.c_str(), session._subViewFiles[k]._originalFileLastModifTimestamp); @@ -1465,7 +1475,7 @@ bool Notepad_plus::loadSession(Session & session, bool isSnapshotMode) { lastOpened = doOpen(pFn, false, false, session._subViewFiles[k]._encoding, session._subViewFiles[k]._backupFilePath.c_str(), session._subViewFiles[k]._originalFileLastModifTimestamp); } - else + else { lastOpened = BUFFER_INVALID; } @@ -1483,7 +1493,7 @@ bool Notepad_plus::loadSession(Session & session, bool isSnapshotMode) const TCHAR *pLn = session._subViewFiles[k]._langName.c_str(); int id = getLangFromMenuName(pLn); LangType typeToSet = L_TEXT; - + if (id != 0) typeToSet = menuID2LangType(id); if (typeToSet == L_EXTERNAL ) @@ -1513,12 +1523,12 @@ bool Notepad_plus::loadSession(Session & session, bool isSnapshotMode) if (isSnapshotMode && session._subViewFiles[k]._backupFilePath != TEXT("") && PathFileExists(session._subViewFiles[k]._backupFilePath.c_str())) buf->setDirty(true); - + //Force in the document so we can add the markers //Don't use default methods because of performance Document prevDoc = _subEditView.execute(SCI_GETDOCPOINTER); _subEditView.execute(SCI_SETDOCPOINTER, 0, buf->getDocument()); - for (size_t j = 0, len = session._subViewFiles[k]._marks.size(); j < len ; ++j) + for (size_t j = 0, len = session._subViewFiles[k]._marks.size(); j < len ; ++j) { _subEditView.execute(SCI_MARKERADD, session._subViewFiles[k]._marks[j], MARK_BOOKMARK); } @@ -1573,7 +1583,7 @@ bool Notepad_plus::fileLoadSession(const TCHAR *fn) generic_string sessionExt = TEXT(""); if (*ext != '\0') { - if (*ext != '.') + if (*ext != '.') sessionExt += TEXT("."); sessionExt += ext; fDlg.setExtFilter(TEXT("Session file"), sessionExt.c_str(), NULL); @@ -1585,7 +1595,7 @@ bool Notepad_plus::fileLoadSession(const TCHAR *fn) if (PathFileExists(fn)) sessionFileName = fn; } - + NppParameters *pNppParam = NppParameters::getInstance(); const NppGUI & nppGUI = pNppParam->getNppGUI(); @@ -1603,7 +1613,7 @@ bool Notepad_plus::fileLoadSession(const TCHAR *fn) TCHAR nppFullPath[MAX_PATH]; ::GetModuleFileName(NULL, nppFullPath, MAX_PATH); - + generic_string args = TEXT("-multiInst -nosession -openSession "); args += TEXT("\""); args += sessionFileName; @@ -1652,7 +1662,7 @@ const TCHAR * Notepad_plus::fileSaveSession(size_t nbFile, TCHAR ** fileNames, c const TCHAR * Notepad_plus::fileSaveSession(size_t nbFile, TCHAR ** fileNames) { const TCHAR *sessionFileName = NULL; - + FileDialog fDlg(_pPublicInterface->getHSelf(), _pPublicInterface->getHinst()); const TCHAR *ext = NppParameters::getInstance()->getNppGUI()._definedSessionExt.c_str(); @@ -1660,7 +1670,7 @@ const TCHAR * Notepad_plus::fileSaveSession(size_t nbFile, TCHAR ** fileNames) generic_string sessionExt = TEXT(""); if (*ext != '\0') { - if (*ext != '.') + if (*ext != '.') sessionExt += TEXT("."); sessionExt += ext; fDlg.setExtFilter(TEXT("Session file"), sessionExt.c_str(), NULL); diff --git a/PowerEditor/src/ScitillaComponent/AutoCompletion.cpp b/PowerEditor/src/ScitillaComponent/AutoCompletion.cpp index cd79faf7f..cb059055e 100644 --- a/PowerEditor/src/ScitillaComponent/AutoCompletion.cpp +++ b/PowerEditor/src/ScitillaComponent/AutoCompletion.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -75,7 +75,7 @@ bool AutoCompletion::showApiAndWordComplete() const size_t bufSize = 256; TCHAR beginChars[bufSize]; - + size_t len = (curPos > startPos)?(curPos - startPos):(startPos - curPos); if (len >= bufSize) return false; @@ -99,7 +99,7 @@ bool AutoCompletion::showApiAndWordComplete() sort(wordArray.begin(), wordArray.end()); // Get word list - generic_string words(TEXT("")); + generic_string words; for (size_t i = 0, len = wordArray.size(); i < len; ++i) { @@ -111,10 +111,10 @@ bool AutoCompletion::showApiAndWordComplete() _pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM(' ')); _pEditView->execute(SCI_AUTOCSETIGNORECASE, _ignoreCase); _pEditView->showAutoComletion(curPos - startPos, words.c_str()); - return true; } + void AutoCompletion::getWordArray(vector & wordArray, TCHAR *beginChars) { const size_t bufSize = 256; @@ -314,7 +314,7 @@ bool AutoCompletion::showWordComplete(bool autoInsert) const size_t bufSize = 256; TCHAR beginChars[bufSize]; - + size_t len = (curPos > startPos)?(curPos - startPos):(startPos - curPos); if (len >= bufSize) return false; @@ -327,7 +327,7 @@ bool AutoCompletion::showWordComplete(bool autoInsert) if (wordArray.size() == 0) return false; - if (wordArray.size() == 1 && autoInsert) + if (wordArray.size() == 1 && autoInsert) { _pEditView->replaceTargetRegExMode(wordArray[0].c_str(), startPos, curPos); _pEditView->execute(SCI_GOTOPOS, startPos + wordArray[0].length()); @@ -370,7 +370,7 @@ void AutoCompletion::getCloseTag(char *closeTag, size_t closeTagSize, size_t car _pEditView->execute(SCI_SETSEARCHFLAGS, flags); TCHAR tag2find[] = TEXT("<[^\\s>]*"); int targetStart = _pEditView->searchInTarget(tag2find, lstrlen(tag2find), caretPos, 0); - + if (targetStart == -1 || targetStart == -2) return; @@ -398,7 +398,7 @@ void AutoCompletion::getCloseTag(char *closeTag, size_t closeTagSize, size_t car closeTag[1] = '/'; _pEditView->getText(closeTag + 2, targetStart + 1, targetEnd); closeTag[foundTextLen+1] = '>'; - closeTag[foundTextLen+2] = '\0'; + closeTag[foundTextLen+2] = '\0'; } void InsertedMatchedChars::removeInvalidElements(MatchedCharInserted mci) @@ -443,7 +443,7 @@ int InsertedMatchedChars::search(char startChar, char endChar, int posToDetect) if (isEmpty()) return -1; int posToDetectLine = _pEditView->execute(SCI_LINEFROMPOSITION, posToDetect); - + for (int i = _insertedMatchedChars.size() - 1; i >= 0; --i) { if (_insertedMatchedChars[i]._c == startChar) @@ -508,7 +508,7 @@ void AutoCompletion::insertMatchedChars(int character, const MatchedPairConf & m } // if there's no user defined matched pair found, continue to check notepad++'s one - + const size_t closeTagLen = 256; char closeTag[closeTagLen]; closeTag[0] = '\0'; @@ -652,7 +652,7 @@ void AutoCompletion::update(int character) const int wordSize = 64; TCHAR s[wordSize]; _pEditView->getWordToCurrentPos(s, wordSize); - + if (lstrlen(s) >= int(nppGUI._autocFromLen)) { if (nppGUI._autocStatus == nppGUI.autoc_word) @@ -721,11 +721,11 @@ bool AutoCompletion::setLanguage(LangType language) { _funcCalltip._param = ','; _funcCalltip._terminal = ';'; _funcCalltip._ignoreCase = true; - _funcCalltip._additionalWordChar = TEXT(""); + _funcCalltip._additionalWordChar.clear(); TiXmlElement * pElem = pAutoNode->FirstChildElement(TEXT("Environment")); - if (pElem) - { + if (pElem) + { const TCHAR * val = 0; val = pElem->Attribute(TEXT("ignoreCase")); if (val && !lstrcmp(val, TEXT("no"))) { @@ -756,7 +756,7 @@ bool AutoCompletion::setLanguage(LangType language) { _funcCalltip.setLanguageXML(NULL); } - _keyWords = TEXT(""); + _keyWords.clear(); _keyWordArray.clear(); if (_funcCompletionActive) diff --git a/PowerEditor/src/ScitillaComponent/Buffer.cpp b/PowerEditor/src/ScitillaComponent/Buffer.cpp index 8be39de17..43df4e632 100644 --- a/PowerEditor/src/ScitillaComponent/Buffer.cpp +++ b/PowerEditor/src/ScitillaComponent/Buffer.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -43,82 +43,124 @@ static const int blockSize = 128 * 1024 + 4; static const int CR = 0x0D; static const int LF = 0x0A; +long Buffer::_recentTagCtr = 0; -Buffer::Buffer(FileManager * pManager, BufferID id, Document doc, DocFileStatus type, const TCHAR *fileName) //type must be either DOC_REGULAR or DOC_UNNAMED - : _pManager(pManager), _id(id), _isDirty(false), _doc(doc), _isFileReadOnly(false), _isUserReadOnly(false), _recentTag(-1), _references(0), - _canNotify(false), _timeStamp(0), _needReloading(false), _encoding(-1), _backupFileName(TEXT("")), _isModified(false), _isLoadedDirty(false), _lang(L_TEXT) + + + + +Buffer::Buffer(FileManager * pManager, BufferID id, Document doc, DocFileStatus type, const TCHAR *fileName) + // type must be either DOC_REGULAR or DOC_UNNAMED + : _pManager(pManager) + , _id(id) + , _doc(doc) + , _lang(L_TEXT) { - NppParameters *pNppParamInst = NppParameters::getInstance(); - const NewDocDefaultSettings & ndds = (pNppParamInst->getNppGUI()).getNewDocDefaultSettings(); + NppParameters* pNppParamInst = NppParameters::getInstance(); + const NewDocDefaultSettings& ndds = (pNppParamInst->getNppGUI()).getNewDocDefaultSettings(); + _format = ndds._format; _unicodeMode = ndds._unicodeMode; _encoding = ndds._codepage; if (_encoding != -1) _unicodeMode = uniCookie; - _userLangExt = TEXT(""); - _fullPathName = TEXT(""); - _fileName = NULL; _currentStatus = type; setFileName(fileName, ndds._lang); updateTimeStamp(); checkFileState(); - _isDirty = false; - _needLexer = false; //new buffers do not need lexing, Scintilla takes care of that + // reset after initialization + _isDirty = false; _canNotify = true; + _needLexer = false; // new buffers do not need lexing, Scintilla takes care of that } -void Buffer::setLangType(LangType lang, const TCHAR * userLangName) +void Buffer::doNotify(int mask) +{ + if (_canNotify) + { + assert(_pManager != nullptr); + _pManager->beNotifiedOfBufferChange(this, mask); + } +} + + +void Buffer::setDirty(bool dirty) +{ + _isDirty = dirty; + doNotify(BufferChangeDirty); +} + + +void Buffer::setEncoding(int encoding) +{ + _encoding = encoding; + doNotify(BufferChangeUnicode | BufferChangeDirty); +} + + +void Buffer::setUnicodeMode(UniMode mode) +{ + _unicodeMode = mode; + doNotify(BufferChangeUnicode | BufferChangeDirty); +} + + +void Buffer::setLangType(LangType lang, const TCHAR* userLangName) { if (lang == _lang && lang != L_USER) return; + _lang = lang; - if (_lang == L_USER) - { + if (_lang == L_USER) _userLangExt = userLangName; - } + _needLexer = true; //change of lang means lexern needs updating doNotify(BufferChangeLanguage|BufferChangeLexing); } -long Buffer::_recentTagCtr = 0; -void Buffer::updateTimeStamp() { +void Buffer::updateTimeStamp() +{ struct _stat buf; time_t timeStamp = (generic_stat(_fullPathName.c_str(), &buf)==0)?buf.st_mtime:0; - if (timeStamp != _timeStamp) { + if (timeStamp != _timeStamp) + { _timeStamp = timeStamp; doNotify(BufferChangeTimestamp); } -}; +} + // Set full path file name in buffer object, // and determinate its language by its extension. // If the ext is not in the list, the defaultLang passed as argument will be set. -void Buffer::setFileName(const TCHAR *fn, LangType defaultLang) +void Buffer::setFileName(const TCHAR *fn, LangType defaultLang) { NppParameters *pNppParamInst = NppParameters::getInstance(); - if (_fullPathName == fn) + if (_fullPathName == fn) { updateTimeStamp(); doNotify(BufferChangeTimestamp); return; } + _fullPathName = fn; _fileName = PathFindFileName(_fullPathName.c_str()); // for _lang LangType newLang = defaultLang; TCHAR *ext = PathFindExtension(_fullPathName.c_str()); - if (*ext == '.') { //extension found + if (*ext == '.') // extension found + { ext += 1; // Define User Lang firstly - const TCHAR *langName = pNppParamInst->getUserDefinedLangNameFromExt(ext, _fileName); + const TCHAR* langName = pNppParamInst->getUserDefinedLangNameFromExt(ext, _fileName); if (langName) { newLang = L_USER; @@ -126,9 +168,9 @@ void Buffer::setFileName(const TCHAR *fn, LangType defaultLang) } else // if it's not user lang, then check if it's supported lang { - _userLangExt = TEXT(""); + _userLangExt.clear(); newLang = pNppParamInst->getLangFromExt(ext); - } + } } if (newLang == defaultLang || newLang == L_TEXT) //language can probably be refined @@ -144,7 +186,8 @@ void Buffer::setFileName(const TCHAR *fn, LangType defaultLang) } updateTimeStamp(); - if (newLang != _lang || _lang == L_USER) { + if (newLang != _lang || _lang == L_USER) + { _lang = newLang; doNotify(BufferChangeFilename | BufferChangeLanguage | BufferChangeTimestamp); return; @@ -153,14 +196,16 @@ void Buffer::setFileName(const TCHAR *fn, LangType defaultLang) doNotify(BufferChangeFilename | BufferChangeTimestamp); } -bool Buffer::checkFileState() { //returns true if the status has been changed (it can change into DOC_REGULAR too). false otherwise - struct _stat buf; +bool Buffer::checkFileState() //eturns true if the status has been changed (it can change into DOC_REGULAR too). false otherwise +{ if (_currentStatus == DOC_UNNAMED) //unsaved document cannot change by environment return false; + struct _stat buf; bool isWow64Off = false; NppParameters *pNppParam = NppParameters::getInstance(); + if (!PathFileExists(_fullPathName.c_str())) { pNppParam->safeWow64EnableWow64FsRedirection(FALSE); @@ -176,8 +221,8 @@ bool Buffer::checkFileState() { //returns true if the status has been changed (i _timeStamp = 0; doNotify(BufferChangeStatus | BufferChangeReadonly | BufferChangeTimestamp); isOK = true; - } - else if (_currentStatus == DOC_DELETED && PathFileExists(_fullPathName.c_str())) + } + else if (_currentStatus == DOC_DELETED && PathFileExists(_fullPathName.c_str())) { //document has returned from its grave if (!generic_stat(_fullPathName.c_str(), &buf)) { @@ -206,14 +251,14 @@ bool Buffer::checkFileState() { //returns true if the status has been changed (i mask |= BufferChangeStatus; //status always 'changes', even if from modified to modified } - if (mask != 0) + if (mask != 0) { doNotify(mask); isOK = true; } isOK = false; } - + if (isWow64Off) { pNppParam->safeWow64EnableWow64FsRedirection(TRUE); @@ -222,35 +267,35 @@ bool Buffer::checkFileState() { //returns true if the status has been changed (i return isOK; } -int Buffer::getFileLength() + +int Buffer::getFileLength() const { if (_currentStatus == DOC_UNNAMED) return -1; struct _stat buf; - if (PathFileExists(_fullPathName.c_str())) + if (PathFileExists(_fullPathName.c_str())) { if (!generic_stat(_fullPathName.c_str(), &buf)) - { return buf.st_size; - } } return -1; } -generic_string Buffer::getFileTime(fileTimeType ftt) + +generic_string Buffer::getFileTime(fileTimeType ftt) const { if (_currentStatus == DOC_UNNAMED) - return TEXT(""); + return generic_string(); struct _stat buf; - if (PathFileExists(_fullPathName.c_str())) + if (PathFileExists(_fullPathName.c_str())) { if (!generic_stat(_fullPathName.c_str(), &buf)) { - time_t rawtime = ftt==ft_created?buf.st_ctime:ftt==ft_modified?buf.st_mtime:buf.st_atime; + time_t rawtime = (ftt == ft_created ? buf.st_ctime : (ftt == ft_modified ? buf.st_mtime : buf.st_atime)); tm *timeinfo = localtime(&rawtime); const int temBufLen = 64; TCHAR tmpbuf[temBufLen]; @@ -259,41 +304,51 @@ generic_string Buffer::getFileTime(fileTimeType ftt) return tmpbuf; } } - return TEXT(""); + + return generic_string(); } -void Buffer::setPosition(const Position & pos, ScintillaEditView * identifier) { +void Buffer::setPosition(const Position & pos, ScintillaEditView * identifier) +{ int index = indexOfReference(identifier); if (index == -1) return; _positions[index] = pos; } -Position & Buffer::getPosition(ScintillaEditView * identifier) { + +Position& Buffer::getPosition(ScintillaEditView* identifier) +{ int index = indexOfReference(identifier); return _positions.at(index); } -void Buffer::setHeaderLineState(const std::vector & folds, ScintillaEditView * identifier) { + +void Buffer::setHeaderLineState(const std::vector & folds, ScintillaEditView * identifier) +{ int index = indexOfReference(identifier); if (index == -1) return; + //deep copy std::vector & local = _foldStates[index]; local.clear(); size_t size = folds.size(); - for(size_t i = 0; i < size; ++i) { + for(size_t i = 0; i < size; ++i) local.push_back(folds[i]); - } } -const std::vector & Buffer::getHeaderLineState(const ScintillaEditView * identifier) const { + +const std::vector & Buffer::getHeaderLineState(const ScintillaEditView * identifier) const +{ int index = indexOfReference(identifier); return _foldStates.at(index); } -Lang * Buffer::getCurrentLang() const { + +Lang * Buffer::getCurrentLang() const +{ NppParameters *pNppParam = NppParameters::getInstance(); int i = 0; Lang *l = pNppParam->getLangFromIndex(i); @@ -306,21 +361,27 @@ Lang * Buffer::getCurrentLang() const { l = pNppParam->getLangFromIndex(i); ++i; } - return NULL; -}; + return nullptr; +} -int Buffer::indexOfReference(const ScintillaEditView * identifier) const { + +int Buffer::indexOfReference(const ScintillaEditView * identifier) const +{ int size = (int)_referees.size(); - for(int i = 0; i < size; ++i) { + for (int i = 0; i < size; ++i) + { if (_referees[i] == identifier) return i; } return -1; //not found } -int Buffer::addReference(ScintillaEditView * identifier) { + +int Buffer::addReference(ScintillaEditView * identifier) +{ if (indexOfReference(identifier) != -1) return _references; + _referees.push_back(identifier); _positions.push_back(Position()); _foldStates.push_back(std::vector()); @@ -328,10 +389,13 @@ int Buffer::addReference(ScintillaEditView * identifier) { return _references; } -int Buffer::removeReference(ScintillaEditView * identifier) { + +int Buffer::removeReference(ScintillaEditView * identifier) +{ int indexToPop = indexOfReference(identifier); if (indexToPop == -1) return _references; + _referees.erase(_referees.begin() + indexToPop); _positions.erase(_positions.begin() + indexToPop); _foldStates.erase(_foldStates.begin() + indexToPop); @@ -339,25 +403,30 @@ int Buffer::removeReference(ScintillaEditView * identifier) { return _references; } -void Buffer::setHideLineChanged(bool isHide, int location) { - //First run through all docs without removing markers - for(int i = 0; i < _references; ++i) { - _referees.at(i)->notifyMarkers(this, isHide, location, false);//(i == _references-1)); - } - if (!isHide) { //no deleting if hiding lines +void Buffer::setHideLineChanged(bool isHide, int location) +{ + //First run through all docs without removing markers + for(int i = 0; i < _references; ++i) + _referees.at(i)->notifyMarkers(this, isHide, location, false); // (i == _references-1)); + + if (!isHide) // no deleting if hiding lines + { //Then all docs to remove markers. - for(int i = 0; i < _references; ++i) { + for(int i = 0; i < _references; ++i) _referees.at(i)->notifyMarkers(this, isHide, location, true); - } } } -void Buffer::setDeferredReload() { //triggers a reload on the next Document access + + +void Buffer::setDeferredReload() // triggers a reload on the next Document access +{ _isDirty = false; //when reloading, just set to false, since it sohuld be marked as clean _needReloading = true; doNotify(BufferChangeDirty); } + /* pair Buffer::getLineUndoState(size_t currentLine) const { @@ -406,7 +475,8 @@ void FileManager::init(Notepad_plus * pNotepadPlus, ScintillaEditView * pscratch _pscratchTilla->execute(SCI_ADDREFDOCUMENT, 0, _scratchDocDefault); } -void FileManager::checkFilesystemChanges() { +void FileManager::checkFilesystemChanges() +{ for(int i = int(_nrBufs -1) ; i >= 0 ; i--) { if (i >= int(_nrBufs)) @@ -418,37 +488,47 @@ void FileManager::checkFilesystemChanges() { } _buffers[i]->checkFileState(); //something has changed. Triggers update automatically } - } -int FileManager::getBufferIndexByID(BufferID id) { - for(size_t i = 0; i < _nrBufs; ++i) { + +int FileManager::getBufferIndexByID(BufferID id) +{ + for(size_t i = 0; i < _nrBufs; ++i) + { if (_buffers[i]->_id == id) - return (int)i; + return (int) i; } return -1; } -Buffer * FileManager::getBufferByIndex(int index) { +Buffer* FileManager::getBufferByIndex(int index) +{ return _buffers.at(index); } -void FileManager::beNotifiedOfBufferChange(Buffer * theBuf, int mask) { + +void FileManager::beNotifiedOfBufferChange(Buffer* theBuf, int mask) +{ _pNotepadPlus->notifyBufferChanged(theBuf, mask); } -void FileManager::addBufferReference(BufferID buffer, ScintillaEditView * identifier) { - Buffer * buf = getBufferByID(buffer); + +void FileManager::addBufferReference(BufferID buffer, ScintillaEditView * identifier) +{ + Buffer* buf = getBufferByID(buffer); buf->addReference(identifier); } -void FileManager::closeBuffer(BufferID id, ScintillaEditView * identifier) { + +void FileManager::closeBuffer(BufferID id, ScintillaEditView * identifier) +{ int index = getBufferIndexByID(id); - Buffer * buf = getBufferByIndex(index); + Buffer* buf = getBufferByIndex(index); int refs = buf->removeReference(identifier); - if (!refs) { //buffer can be deallocated + if (!refs) // buffer can be deallocated + { _pscratchTilla->execute(SCI_RELEASEDOCUMENT, 0, buf->_doc); //release for FileManager, Document is now gone _buffers.erase(_buffers.begin() + index); delete buf; @@ -456,11 +536,12 @@ void FileManager::closeBuffer(BufferID id, ScintillaEditView * identifier) { } } + // backupFileName is sentinel of backup mode: if it's not NULL, then we use it (load it). Otherwise we use filename BufferID FileManager::loadFile(const TCHAR * filename, Document doc, int encoding, const TCHAR *backupFileName, time_t fileNameTimestamp) { bool ownDoc = false; - if (doc == NULL) + if (doc == NULL) { doc = (Document)_pscratchTilla->execute(SCI_CREATEDOCUMENT); ownDoc = true; @@ -481,9 +562,9 @@ BufferID FileManager::loadFile(const TCHAR * filename, Document doc, int encodin char data[blockSize + 8]; // +8 for incomplete multibyte char formatType format; bool res = loadFileData(doc, backupFileName?backupFileName:fullpath, data, &UnicodeConvertor, L_TEXT, encoding, &format); - if (res) + if (res) { - Buffer * newBuf = new Buffer(this, _nextBufferID, doc, DOC_REGULAR, fullpath); + Buffer* newBuf = new Buffer(this, _nextBufferID, doc, DOC_REGULAR, fullpath); BufferID id = (BufferID) newBuf; newBuf->_id = id; if (backupFileName != NULL) @@ -496,7 +577,7 @@ BufferID FileManager::loadFile(const TCHAR * filename, Document doc, int encodin newBuf->_timeStamp = fileNameTimestamp; _buffers.push_back(newBuf); ++_nrBufs; - Buffer * buf = _buffers.at(_nrBufs - 1); + Buffer* buf = _buffers.at(_nrBufs - 1); // restore the encoding (ANSI based) while opening the existing file NppParameters *pNppParamInst = NppParameters::getInstance(); @@ -507,28 +588,18 @@ BufferID FileManager::loadFile(const TCHAR * filename, Document doc, int encodin if (encoding == -1) { // 3 formats : WIN_FORMAT, UNIX_FORMAT and MAC_FORMAT - if (nullptr != UnicodeConvertor.getNewBuf()) + if (nullptr != UnicodeConvertor.getNewBuf()) { int format = getEOLFormatForm(UnicodeConvertor.getNewBuf(), UnicodeConvertor.getNewSize()); buf->setFormat(format == -1?WIN_FORMAT:(formatType)format); } else - { buf->setFormat(WIN_FORMAT); - } UniMode um = UnicodeConvertor.getEncoding(); if (um == uni7Bit) - { - if (ndds._openAnsiAsUtf8) - { - um = uniCookie; - } - else - { - um = uni8Bit; - } - } + um = (ndds._openAnsiAsUtf8) ? uniCookie : uni8Bit; + buf->setUnicodeMode(um); } else // encoding != -1 @@ -544,16 +615,17 @@ BufferID FileManager::loadFile(const TCHAR * filename, Document doc, int encodin return id; } else //failed loading, release document - { + { if (ownDoc) _pscratchTilla->execute(SCI_RELEASEDOCUMENT, 0, doc); //Failure, so release document return BUFFER_INVALID; } } + bool FileManager::reloadBuffer(BufferID id) { - Buffer * buf = getBufferByID(id); + Buffer* buf = getBufferByID(id); Document doc = buf->getDocument(); Utf8_16_Read UnicodeConvertor; buf->_canNotify = false; //disable notify during file load, we dont want dirty to be triggered @@ -562,11 +634,11 @@ bool FileManager::reloadBuffer(BufferID id) formatType format; bool res = loadFileData(doc, buf->getFullPathName(), data, &UnicodeConvertor, buf->getLangType(), encoding, &format); buf->_canNotify = true; - if (res) + if (res) { if (encoding == -1) { - if (nullptr != UnicodeConvertor.getNewBuf()) + if (nullptr != UnicodeConvertor.getNewBuf()) { int format = getEOLFormatForm(UnicodeConvertor.getNewBuf(), UnicodeConvertor.getNewSize()); buf->setFormat(format == -1?WIN_FORMAT:(formatType)format); @@ -587,16 +659,17 @@ bool FileManager::reloadBuffer(BufferID id) return res; } + bool FileManager::reloadBufferDeferred(BufferID id) { - Buffer * buf = getBufferByID(id); + Buffer* buf = getBufferByID(id); buf->setDeferredReload(); return true; } bool FileManager::deleteFile(BufferID id) { - Buffer * buf = getBufferByID(id); + Buffer* buf = getBufferByID(id); generic_string fileNamePath = buf->getFullPathName(); // Make sure to form a string with double '\0' terminator. @@ -619,9 +692,10 @@ bool FileManager::deleteFile(BufferID id) return SHFileOperation(&fileOpStruct) == 0; } + bool FileManager::moveFile(BufferID id, const TCHAR * newFileName) { - Buffer * buf = getBufferByID(id); + Buffer* buf = getBufferByID(id); const TCHAR *fileNamePath = buf->getFullPathName(); if (::MoveFileEx(fileNamePath, newFileName, MOVEFILE_REPLACE_EXISTING) == 0) return false; @@ -634,10 +708,10 @@ bool FileManager::moveFile(BufferID id, const TCHAR * newFileName) /* Specs and Algorithm of session snapshot & periodic backup system: Notepad++ quits without asking for saving unsaved file. -It restores all the unsaved files and document as the states they left. +It restores all the unsaved files and document as the states they left. For existing file (c:\tmp\foo.h) - - Open + - Open In the next session, Notepad++ 1. load backup\FILENAME@CREATION_TIMESTAMP (backup\foo.h@198776) if exist, otherwise load FILENAME (c:\tmp\foo.h). 2. if backup\FILENAME@CREATION_TIMESTAMP (backup\foo.h@198776) is loaded, set it dirty (red). @@ -652,7 +726,7 @@ For existing file (c:\tmp\foo.h) 3. before switch off to another tab (or close files on exit), check 1 & 2 (sync with backup). - Close - In the current session, Notepad++ + In the current session, Notepad++ 1. track FILENAME@CREATION_TIMESTAMP (backup\foo.h@198776) if exist (in session.xml). 2. track last modified timestamp of FILENAME (c:\tmp\foo.h) if FILENAME@CREATION_TIMESTAMP (backup\foo.h@198776) was tracked (in session.xml). @@ -661,7 +735,7 @@ For untitled document (new 4) In the next session, Notepad++ 1. open file UNTITLED_NAME@CREATION_TIMESTAMP (backup\new 4@198776) 2. set label as UNTITLED_NAME (new 4) and disk icon as red. - + - Editing when a untitled document starts being modified, a backup file will be created with name: UNTITLED_NAME@CREATION_TIMESTAMP (backup\new 4@198776) the Buffer object will associate with this UNTITLED_NAME@CREATION_TIMESTAMP file (backup\new 4@198776). @@ -670,14 +744,14 @@ For untitled document (new 4) 3. before switch off to another tab (or close documents on exit), check 1 & 2 (sync with backup). - CLOSE - In the current session, Notepad++ + In the current session, Notepad++ 1. track UNTITLED_NAME@CREATION_TIMESTAMP (backup\new 4@198776) in session.xml. */ bool FileManager::backupCurrentBuffer() { LongRunningOperation op; - Buffer * buffer = _pNotepadPlus->getCurrentBuffer(); + Buffer* buffer = _pNotepadPlus->getCurrentBuffer(); bool result = false; bool hasModifForSession = false; @@ -693,7 +767,7 @@ bool FileManager::backupCurrentBuffer() // no thread yet, create a event with non-signaled, to block all threads writeEvent = ::CreateEvent(NULL, TRUE, FALSE, TEXT("nppWrittingEvent")); } - else + else { if (::WaitForSingleObject(writeEvent, INFINITE) != WAIT_OBJECT_0) { @@ -715,7 +789,7 @@ bool FileManager::backupCurrentBuffer() int encoding = buffer->getEncoding(); generic_string backupFilePath = buffer->getBackupFileName(); - if (backupFilePath == TEXT("")) + if (backupFilePath.empty()) { // Create file backupFilePath = NppParameters::getInstance()->getUserPath(); @@ -732,9 +806,7 @@ bool FileManager::backupCurrentBuffer() const int temBufLen = 32; TCHAR tmpbuf[temBufLen]; time_t ltime = time(0); - struct tm *today; - - today = localtime(<ime); + struct tm* today = localtime(<ime); generic_strftime(tmpbuf, temBufLen, TEXT("%Y-%m-%d_%H%M%S"), today); backupFilePath += TEXT("@"); @@ -750,12 +822,12 @@ bool FileManager::backupCurrentBuffer() TCHAR fullpath[MAX_PATH]; ::GetFullPathName(backupFilePath.c_str(), MAX_PATH, fullpath, NULL); ::GetLongPathName(fullpath, fullpath, MAX_PATH); - + // Make sure the backup file is not read only DWORD dwFileAttribs = ::GetFileAttributes(fullpath); if (dwFileAttribs & FILE_ATTRIBUTE_READONLY) // if file is read only, remove read only attribute { - dwFileAttribs ^= FILE_ATTRIBUTE_READONLY; + dwFileAttribs ^= FILE_ATTRIBUTE_READONLY; ::SetFileAttributes(fullpath, dwFileAttribs); } @@ -778,9 +850,9 @@ bool FileManager::backupCurrentBuffer() for (int i = 0; i < lengthDoc; i += grabSize) { grabSize = lengthDoc - i; - if (grabSize > blockSize) + if (grabSize > blockSize) grabSize = blockSize; - + int newDataLen = 0; int incompleteMultibyteChar = 0; const char *newData = wmc->encode(SC_CP_UTF8, encoding, buf+i, grabSize, &newDataLen, &incompleteMultibyteChar); @@ -809,7 +881,7 @@ bool FileManager::backupCurrentBuffer() } else // buffer dirty but unmodified { - result = true; + result = true; } } else // buffer not dirty, sync: delete the backup file @@ -838,7 +910,7 @@ bool FileManager::backupCurrentBuffer() return result; } -class EventReset +class EventReset final { public: EventReset(HANDLE h) @@ -879,17 +951,16 @@ bool FileManager::deleteCurrentBufferBackup() EventReset reset(writeEvent); // Will reset event in destructor. - Buffer * buffer = _pNotepadPlus->getCurrentBuffer(); + Buffer* buffer = _pNotepadPlus->getCurrentBuffer(); bool result = true; generic_string backupFilePath = buffer->getBackupFileName(); - if (backupFilePath != TEXT("")) + if (not backupFilePath.empty()) { // delete backup file - generic_string file2Delete = buffer->getBackupFileName(); buffer->setBackupFileName(TEXT("")); - result = (::DeleteFile(file2Delete.c_str()) != 0); + result = (::DeleteFile(backupFilePath.c_str()) != 0); } - + // set to signaled state via destructor EventReset. return result; } @@ -902,7 +973,7 @@ bool FileManager::saveBuffer(BufferID id, const TCHAR * filename, bool isCopy, g // no thread yet, create a event with non-signaled, to block all threads writeEvent = ::CreateEvent(NULL, TRUE, FALSE, TEXT("nppWrittingEvent")); } - else + else { //printStr(TEXT("Locked. I wait.")); if (::WaitForSingleObject(writeEvent, INFINITE) != WAIT_OBJECT_0) { @@ -916,7 +987,7 @@ bool FileManager::saveBuffer(BufferID id, const TCHAR * filename, bool isCopy, g } EventReset reset(writeEvent); // Will reset event in destructor. - Buffer * buffer = getBufferByID(id); + Buffer* buffer = getBufferByID(id); bool isHidden = false; bool isSys = false; DWORD attrib = 0; @@ -970,9 +1041,9 @@ bool FileManager::saveBuffer(BufferID id, const TCHAR * filename, bool isCopy, g for (int i = 0; i < lengthDoc; i += grabSize) { grabSize = lengthDoc - i; - if (grabSize > blockSize) + if (grabSize > blockSize) grabSize = blockSize; - + int newDataLen = 0; int incompleteMultibyteChar = 0; const char *newData = wmc->encode(SC_CP_UTF8, encoding, buf+i, grabSize, &newDataLen, &incompleteMultibyteChar); @@ -982,6 +1053,7 @@ bool FileManager::saveBuffer(BufferID id, const TCHAR * filename, bool isCopy, g if (lengthDoc == 0) items_written = 1; } + UnicodeConvertor.fclose(); // Error, we didn't write the entire document to disk. @@ -990,7 +1062,7 @@ bool FileManager::saveBuffer(BufferID id, const TCHAR * filename, bool isCopy, g { if(error_msg != NULL) *error_msg = TEXT("Failed to save file.\nNot enough space on disk to save file?"); - + // set to signaled state via destructor EventReset. return false; } @@ -1005,7 +1077,7 @@ bool FileManager::saveBuffer(BufferID id, const TCHAR * filename, bool isCopy, g { _pscratchTilla->execute(SCI_SETDOCPOINTER, 0, _scratchDocDefault); - /* for saveAs it's not necessary since this action is for the "current" directory, so we let manage in SAVEPOINTREACHED event + /* for saveAs it's not necessary since this action is for the "current" directory, so we let manage in SAVEPOINTREACHED event generic_string backupFilePath = buffer->getBackupFileName(); if (backupFilePath != TEXT("")) { @@ -1029,12 +1101,11 @@ bool FileManager::saveBuffer(BufferID id, const TCHAR * filename, bool isCopy, g _pscratchTilla->execute(SCI_SETDOCPOINTER, 0, _scratchDocDefault); generic_string backupFilePath = buffer->getBackupFileName(); - if (backupFilePath != TEXT("")) + if (not backupFilePath.empty()) { // delete backup file - generic_string file2Delete = buffer->getBackupFileName(); buffer->setBackupFileName(TEXT("")); - ::DeleteFile(file2Delete.c_str()); + ::DeleteFile(backupFilePath.c_str()); } // set to signaled state via destructor EventReset. @@ -1046,7 +1117,7 @@ bool FileManager::saveBuffer(BufferID id, const TCHAR * filename, bool isCopy, g size_t FileManager::nextUntitledNewNumber() const { - std::vector usedNumbers; + std::vector usedNumbers; for(size_t i = 0; i < _buffers.size(); i++) { Buffer *buf = _buffers.at(i); @@ -1080,7 +1151,7 @@ size_t FileManager::nextUntitledNewNumber() const } if (!numberAvailable) newNumber++; - + if (!found) break; @@ -1089,7 +1160,7 @@ size_t FileManager::nextUntitledNewNumber() const return newNumber; } -BufferID FileManager::newEmptyDocument() +BufferID FileManager::newEmptyDocument() { generic_string newTitle = UNTITLED_STR; TCHAR nb[10]; @@ -1097,7 +1168,7 @@ BufferID FileManager::newEmptyDocument() newTitle += nb; Document doc = (Document)_pscratchTilla->execute(SCI_CREATEDOCUMENT); //this already sets a reference for filemanager - Buffer * newBuf = new Buffer(this, _nextBufferID, doc, DOC_UNNAMED, newTitle.c_str()); + Buffer* newBuf = new Buffer(this, _nextBufferID, doc, DOC_UNNAMED, newTitle.c_str()); BufferID id = (BufferID)newBuf; newBuf->_id = id; _buffers.push_back(newBuf); @@ -1106,7 +1177,7 @@ BufferID FileManager::newEmptyDocument() return id; } -BufferID FileManager::bufferFromDocument(Document doc, bool dontIncrease, bool dontRef) +BufferID FileManager::bufferFromDocument(Document doc, bool dontIncrease, bool dontRef) { generic_string newTitle = UNTITLED_STR; TCHAR nb[10]; @@ -1115,7 +1186,7 @@ BufferID FileManager::bufferFromDocument(Document doc, bool dontIncrease, bool d if (!dontRef) _pscratchTilla->execute(SCI_ADDREFDOCUMENT, 0, doc); //set reference for FileManager - Buffer * newBuf = new Buffer(this, _nextBufferID, doc, DOC_UNNAMED, newTitle.c_str()); + Buffer* newBuf = new Buffer(this, _nextBufferID, doc, DOC_UNNAMED, newTitle.c_str()); BufferID id = (BufferID)newBuf; newBuf->_id = id; _buffers.push_back(newBuf); @@ -1180,7 +1251,7 @@ inline bool FileManager::loadFileData(Document doc, const TCHAR * filename, char if (language < L_EXTERNAL) { _pscratchTilla->execute(SCI_SETLEXER, ScintillaEditView::langNames[language].lexerID); - } + } else { int id = language - L_EXTERNAL; @@ -1211,12 +1282,12 @@ inline bool FileManager::loadFileData(Document doc, const TCHAR * filename, char if (lenFile == 0) break; // check if file contain any BOM - if (isFirstTime) + if (isFirstTime) { if (Utf8_16_Read::determineEncoding((unsigned char *)data, lenFile) != uni8Bit) { // if file contains any BOM, then encoding will be erased, - // and the document will be interpreted as UTF + // and the document will be interpreted as UTF encoding = -1; } else if (encoding == -1) @@ -1257,13 +1328,13 @@ inline bool FileManager::loadFileData(Document doc, const TCHAR * filename, char // copy bytes to next buffer memcpy(data, data+blockSize-incompleteMultibyteChar, incompleteMultibyteChar); } - + } while (lenFile > 0); } __except(EXCEPTION_EXECUTE_HANDLER) { //TODO: should filter correctly for other exceptions; the old filter(GetExceptionCode(), GetExceptionInformation()) was only catching access violations ::MessageBox(NULL, TEXT("File is too big to be opened by Notepad++"), TEXT("File open problem"), MB_OK|MB_APPLMODAL); success = false; } - + fclose(fp); if (pFormat != NULL) @@ -1311,13 +1382,13 @@ bool FileManager::createEmptyFile(const TCHAR * path) { int FileManager::getFileNameFromBuffer(BufferID id, TCHAR * fn2copy) { if (getBufferIndexByID(id) == -1) return -1; - Buffer * buf = getBufferByID(id); + Buffer* buf = getBufferByID(id); if (fn2copy) lstrcpy(fn2copy, buf->getFullPathName()); return lstrlen(buf->getFullPathName()); } -int FileManager::docLength(Buffer * buffer) const +int FileManager::docLength(Buffer* buffer) const { _pscratchTilla->execute(SCI_SETDOCPOINTER, 0, buffer->_doc); int docLen = _pscratchTilla->getCurrentDocLen(); diff --git a/PowerEditor/src/ScitillaComponent/Buffer.h b/PowerEditor/src/ScitillaComponent/Buffer.h index 655e205c1..43d455c22 100644 --- a/PowerEditor/src/ScitillaComponent/Buffer.h +++ b/PowerEditor/src/ScitillaComponent/Buffer.h @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -24,49 +24,52 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - -#ifndef BUFFER_H -#define BUFFER_H - +#pragma once #include "Utf8_16.h" + + class Buffer; -typedef Buffer * BufferID; //each buffer has unique ID by which it can be retrieved +typedef Buffer* BufferID; //each buffer has unique ID by which it can be retrieved #define BUFFER_INVALID (BufferID)0 typedef sptr_t Document; -enum DocFileStatus{ - DOC_REGULAR = 0x01, //should not be combined with anything - DOC_UNNAMED = 0x02, //not saved (new ##) - DOC_DELETED = 0x04, //doesn't exist in environment anymore, but not DOC_UNNAMED - DOC_MODIFIED = 0x08 //File in environment has changed +enum DocFileStatus +{ + DOC_REGULAR = 0x01, // should not be combined with anything + DOC_UNNAMED = 0x02, // not saved (new ##) + DOC_DELETED = 0x04, // doesn't exist in environment anymore, but not DOC_UNNAMED + DOC_MODIFIED = 0x08 // File in environment has changed }; -enum BufferStatusInfo { - BufferChangeLanguage = 0x001, //Language was altered - BufferChangeDirty = 0x002, //Buffer has changed dirty state - BufferChangeFormat = 0x004, //EOL type was changed - BufferChangeUnicode = 0x008, //Unicode type was changed - BufferChangeReadonly = 0x010, //Readonly state was changed, can be both file and user - BufferChangeStatus = 0x020, //Filesystem Status has changed - BufferChangeTimestamp = 0x040, //Timestamp was changed - BufferChangeFilename = 0x080, //Filename was changed - BufferChangeRecentTag = 0x100, //Recent tag has changed - BufferChangeLexing = 0x200, //Document needs lexing - BufferChangeMask = 0x3FF //Mask: covers all changes +enum BufferStatusInfo +{ + BufferChangeLanguage = 0x001, // Language was altered + BufferChangeDirty = 0x002, // Buffer has changed dirty state + BufferChangeFormat = 0x004, // EOL type was changed + BufferChangeUnicode = 0x008, // Unicode type was changed + BufferChangeReadonly = 0x010, // Readonly state was changed, can be both file and user + BufferChangeStatus = 0x020, // Filesystem Status has changed + BufferChangeTimestamp = 0x040, // Timestamp was changed + BufferChangeFilename = 0x080, // Filename was changed + BufferChangeRecentTag = 0x100, // Recent tag has changed + BufferChangeLexing = 0x200, // Document needs lexing + BufferChangeMask = 0x3FF // Mask: covers all changes }; //const int userLangNameMax = 16; const TCHAR UNTITLED_STR[] = TEXT("new "); -//File manager class maintains all buffers -class FileManager { -public: - void init(Notepad_plus * pNotepadPlus, ScintillaEditView * pscratchTilla); - //void activateBuffer(int index); + +//File manager class maintains all buffers +class FileManager final +{ +public: + void init(Notepad_plus* pNotepadPlus, ScintillaEditView* pscratchTilla); + + //void activateBuffer(int index); void checkFilesystemChanges(); int getNrBuffers() { return _nrBufs; }; @@ -92,7 +95,7 @@ public: bool reloadBuffer(BufferID id); bool reloadBufferDeferred(BufferID id); - bool saveBuffer(BufferID id, const TCHAR * filename, bool isCopy = false, generic_string * error_msg = NULL); + bool saveBuffer(BufferID id, const TCHAR* filename, bool isCopy = false, generic_string * error_msg = NULL); bool backupCurrentBuffer(); bool deleteCurrentBufferBackup(); bool deleteFile(BufferID id); @@ -105,29 +108,34 @@ public: int getEOLFormatForm(const char* const data, size_t length) const; size_t nextUntitledNewNumber() const; + private: - FileManager() : _nextBufferID(0), _pNotepadPlus(NULL), _nrBufs(0), _pscratchTilla(NULL){}; ~FileManager(); + int detectCodepage(char* buf, size_t len); + bool loadFileData(Document doc, const TCHAR* filename, char* buffer, Utf8_16_Read* UnicodeConvertor, LangType language, int& encoding, formatType* pFormat = nullptr); + + +private: static FileManager *_pSelf; - Notepad_plus * _pNotepadPlus; - ScintillaEditView * _pscratchTilla; + Notepad_plus* _pNotepadPlus = nullptr; + ScintillaEditView* _pscratchTilla = nullptr; Document _scratchDocDefault; - std::vector _buffers; - BufferID _nextBufferID; - size_t _nrBufs; - int detectCodepage(char* buf, size_t len); - - bool loadFileData(Document doc, const TCHAR * filename, char* buffer, Utf8_16_Read * UnicodeConvertor, LangType language, int & encoding, formatType *pFormat = NULL); + std::vector _buffers; + BufferID _nextBufferID = 0; + size_t _nrBufs = 0; }; #define MainFileManager FileManager::getInstance() -class Buffer + + + +class Buffer final { friend class FileManager; -public : - //Loading a document: +public: + //Loading a document: //constructor with ID. //Set a reference (pointer to a container mostly, like DocTabView or ScintillaEditView) //Set the position manually if needed @@ -143,28 +151,24 @@ public : const TCHAR * getFullPathName() const { return _fullPathName.c_str(); - }; + } - const TCHAR * getFileName() const { return _fileName; }; + const TCHAR * getFileName() const { return _fileName; } - BufferID getID() const { - return _id; - }; + BufferID getID() const { return _id; } void increaseRecentTag() { _recentTag = ++_recentTagCtr; doNotify(BufferChangeRecentTag); - }; + } - long getRecentTag() const { - return _recentTag; - }; + long getRecentTag() const { return _recentTag; } bool checkFileState(); bool isDirty() const { return _isDirty; - }; + } bool isReadOnly() const { return (_isUserReadOnly || _isFileReadOnly); @@ -172,71 +176,62 @@ public : bool isUntitled() const { return (_currentStatus == DOC_UNNAMED); - }; + } bool getFileReadOnly() const { return _isFileReadOnly; - }; + } void setFileReadOnly(bool ro) { _isFileReadOnly = ro; doNotify(BufferChangeReadonly); - }; + } bool getUserReadOnly() const { return _isUserReadOnly; - }; + } void setUserReadOnly(bool ro) { _isUserReadOnly = ro; doNotify(BufferChangeReadonly); - }; + } formatType getFormat() const { return _format; - }; + } void setFormat(formatType format) { _format = format; doNotify(BufferChangeFormat); - }; + } LangType getLangType() const { return _lang; - }; + } void setLangType(LangType lang, const TCHAR * userLangName = TEXT("")); UniMode getUnicodeMode() const { return _unicodeMode; - }; + } - void setUnicodeMode(UniMode mode) { - _unicodeMode = mode; - doNotify(BufferChangeUnicode | BufferChangeDirty); - }; + void setUnicodeMode(UniMode mode); int getEncoding() const { return _encoding; - }; + } - void setEncoding(int encoding) { - _encoding = encoding; - doNotify(BufferChangeUnicode | BufferChangeDirty); - }; + void setEncoding(int encoding); DocFileStatus getStatus() const { return _currentStatus; - }; + } Document getDocument() { return _doc; - }; + } - void setDirty(bool dirty) { - _isDirty = dirty; - doNotify(BufferChangeDirty); - }; + void setDirty(bool dirty); void setPosition(const Position & pos, ScintillaEditView * identifier); Position & getPosition(ScintillaEditView * identifier); @@ -244,44 +239,50 @@ public : void setHeaderLineState(const std::vector & folds, ScintillaEditView * identifier); const std::vector & getHeaderLineState(const ScintillaEditView * identifier) const; - bool isUserDefineLangExt() const { + bool isUserDefineLangExt() const + { return (_userLangExt[0] != '\0'); - }; + } - const TCHAR * getUserDefineLangName() const { + const TCHAR * getUserDefineLangName() const + { return _userLangExt.c_str(); - }; + } - const TCHAR * getCommentLineSymbol() const { + const TCHAR * getCommentLineSymbol() const + { Lang *l = getCurrentLang(); if (!l) return NULL; return l->_pCommentLineSymbol; + } - }; - - const TCHAR * getCommentStart() const { + const TCHAR * getCommentStart() const + { Lang *l = getCurrentLang(); if (!l) return NULL; return l->_pCommentStart; - }; + } - const TCHAR * getCommentEnd() const { + const TCHAR * getCommentEnd() const + { Lang *l = getCurrentLang(); if (!l) return NULL; return l->_pCommentEnd; - }; + } - bool getNeedsLexing() const { + bool getNeedsLexing() const + { return _needLexer; - }; + } - void setNeedsLexing(bool lex) { + void setNeedsLexing(bool lex) + { _needLexer = lex; doNotify(BufferChangeLexing); - }; + } //these two return reference count after operation int addReference(ScintillaEditView * identifier); //if ID not registered, creates a new Position for that ID and new foldstate @@ -291,11 +292,13 @@ public : void setDeferredReload(); - bool getNeedReload() { + bool getNeedReload() + { return _needReloading; } - void setNeedReload(bool reload) { + void setNeedReload(bool reload) + { _needReloading = reload; } @@ -304,87 +307,91 @@ public : void setLineUndoState(size_t currentLine, size_t undoLevel, bool isSaved = false); */ - int docLength() const { + int docLength() const + { + assert(_pManager != nullptr); return _pManager->docLength(_id); - }; + } - int getFileLength(); // return file length. -1 if file is not existing. + int getFileLength() const; // return file length. -1 if file is not existing. enum fileTimeType {ft_created, ft_modified, ft_accessed}; - generic_string getFileTime(fileTimeType ftt); + generic_string getFileTime(fileTimeType ftt) const; Lang * getCurrentLang() const; - - bool isModified() const {return _isModified;}; - void setModifiedStatus(bool isModified) {_isModified = isModified;}; - generic_string getBackupFileName() const {return _backupFileName;}; - void setBackupFileName(generic_string fileName) {_backupFileName = fileName;}; - time_t getLastModifiedTimestamp() const {return _timeStamp;}; - bool isLoadedDirty() const { + + bool isModified() const {return _isModified;} + void setModifiedStatus(bool isModified) {_isModified = isModified;} + generic_string getBackupFileName() const {return _backupFileName;} + void setBackupFileName(generic_string fileName) {_backupFileName = fileName;} + time_t getLastModifiedTimestamp() const {return _timeStamp;} + + bool isLoadedDirty() const + { return _isLoadedDirty; - }; + } - void setLoadedDirty(bool val) { + void setLoadedDirty(bool val) + { _isLoadedDirty = val; - }; + } -private : - FileManager * _pManager; - bool _canNotify; - int _references; //if no references file inaccessible, can be closed - BufferID _id; + +private: + void updateTimeStamp(); + + int indexOfReference(const ScintillaEditView * identifier) const; + + void setStatus(DocFileStatus status) + { + _currentStatus = status; + doNotify(BufferChangeStatus); + } + + void doNotify(int mask); + + Buffer(const Buffer&) = delete; + Buffer& operator = (const Buffer&) = delete; + + +private: + FileManager * _pManager = nullptr; + bool _canNotify = false; + int _references = 0; // if no references file inaccessible, can be closed + BufferID _id = nullptr; //document properties Document _doc; //invariable LangType _lang; generic_string _userLangExt; // it's useful if only (_lang == L_USER) - bool _isDirty; + bool _isDirty = false; formatType _format; UniMode _unicodeMode; - int _encoding; - bool _isUserReadOnly; - bool _needLexer; //initially true + int _encoding = -1; + bool _isUserReadOnly = false; + bool _needLexer = false; // new buffers do not need lexing, Scintilla takes care of that //these properties have to be duplicated because of multiple references //All the vectors must have the same size at all times - std::vector< ScintillaEditView * > _referees; // Instances of ScintillaEditView which contain this buffer - std::vector< Position > _positions; - std::vector< std::vector > _foldStates; + std::vector _referees; // Instances of ScintillaEditView which contain this buffer + std::vector _positions; + std::vector> _foldStates; //vector< pair > > _linesUndoState; //Environment properties DocFileStatus _currentStatus; - time_t _timeStamp; // 0 if it's a new doc - - bool _isFileReadOnly; - generic_string _fullPathName; - TCHAR * _fileName; //points to filename part in _fullPathName - bool _needReloading; //True if Buffer needs to be reloaded on activation + time_t _timeStamp = 0; // 0 if it's a new doc - long _recentTag; + bool _isFileReadOnly = false; + generic_string _fullPathName; + TCHAR * _fileName = nullptr; // points to filename part in _fullPathName + bool _needReloading = false; // True if Buffer needs to be reloaded on activation + + long _recentTag = -1; static long _recentTagCtr; // For backup system - generic_string _backupFileName; // default: "" - bool _isModified; // default: false - bool _isLoadedDirty; // default: false - - void updateTimeStamp(); - - int indexOfReference(const ScintillaEditView * identifier) const; - - void setStatus(DocFileStatus status) { - _currentStatus = status; - doNotify(BufferChangeStatus); - } - - void doNotify(int mask) { - if (_canNotify) - _pManager->beNotifiedOfBufferChange(this, mask); - }; - - Buffer(const Buffer&) { assert(false); } - Buffer& operator = (const Buffer&) { assert(false); return *this; } -}; - -#endif //BUFFER_H + generic_string _backupFileName; + bool _isModified = false; + bool _isLoadedDirty = false; +}; \ No newline at end of file diff --git a/PowerEditor/src/ScitillaComponent/DocTabView.cpp b/PowerEditor/src/ScitillaComponent/DocTabView.cpp index 03d26069a..8bde58e79 100644 --- a/PowerEditor/src/ScitillaComponent/DocTabView.cpp +++ b/PowerEditor/src/ScitillaComponent/DocTabView.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -44,13 +44,13 @@ void DocTabView::addBuffer(BufferID buffer) if (this->getIndexByBuffer(buffer) != -1) //no duplicates return; Buffer * buf = MainFileManager->getBufferByID(buffer); - TCITEM tie; + TCITEM tie; tie.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM; int index = -1; if (_hasImgLst) index = 0; - tie.iImage = index; + tie.iImage = index; tie.pszText = (TCHAR *)buf->getFileName(); tie.lParam = (LPARAM)buffer; ::SendMessage(_hSelf, TCM_INSERTITEM, _nbItem++, reinterpret_cast(&tie)); @@ -59,27 +59,35 @@ void DocTabView::addBuffer(BufferID buffer) ::SendMessage(_hParent, WM_SIZE, 0, 0); } -void DocTabView::closeBuffer(BufferID buffer) { + +void DocTabView::closeBuffer(BufferID buffer) +{ int indexToClose = getIndexByBuffer(buffer); deletItemAt((size_t)indexToClose); - ::SendMessage(_hParent, WM_SIZE, 0, 0); } -bool DocTabView::activateBuffer(BufferID buffer) { + +bool DocTabView::activateBuffer(BufferID buffer) +{ int indexToActivate = getIndexByBuffer(buffer); if (indexToActivate == -1) return false; //cannot activate + activateAt(indexToActivate); return true; } -BufferID DocTabView::activeBuffer() { + +BufferID DocTabView::activeBuffer() +{ int index = getCurrentTabIndex(); return (BufferID)getBufferByIndex(index); } -BufferID DocTabView::findBufferByName(const TCHAR * fullfilename) { //-1 if not found, something else otherwise + +BufferID DocTabView::findBufferByName(const TCHAR * fullfilename) //-1 if not found, something else otherwise +{ TCITEM tie; tie.lParam = -1; tie.mask = TCIF_PARAM; @@ -96,7 +104,9 @@ BufferID DocTabView::findBufferByName(const TCHAR * fullfilename) { //-1 if not return BUFFER_INVALID; } -int DocTabView::getIndexByBuffer(BufferID id) { + +int DocTabView::getIndexByBuffer(BufferID id) +{ TCITEM tie; tie.lParam = -1; tie.mask = TCIF_PARAM; @@ -109,7 +119,9 @@ int DocTabView::getIndexByBuffer(BufferID id) { return -1; } -BufferID DocTabView::getBufferByIndex(int index) { + +BufferID DocTabView::getBufferByIndex(int index) +{ TCITEM tie; tie.lParam = -1; tie.mask = TCIF_PARAM; @@ -118,6 +130,7 @@ BufferID DocTabView::getBufferByIndex(int index) { return (BufferID)tie.lParam; } + void DocTabView::bufferUpdated(Buffer * buffer, int mask) { int index = getIndexByBuffer(buffer->getID()); @@ -127,7 +140,7 @@ void DocTabView::bufferUpdated(Buffer * buffer, int mask) TCITEM tie; tie.lParam = -1; tie.mask = 0; - + if (mask & BufferChangeReadonly || mask & BufferChangeDirty) { tie.mask |= TCIF_IMAGE; @@ -176,6 +189,7 @@ void DocTabView::bufferUpdated(Buffer * buffer, int mask) ::SendMessage(_hParent, WM_SIZE, 0, 0); } + void DocTabView::setBuffer(int index, BufferID id) { if (index < 0 || index >= (int)_nbItem) @@ -191,7 +205,8 @@ void DocTabView::setBuffer(int index, BufferID id) ::SendMessage(_hParent, WM_SIZE, 0, 0); } -void DocTabView::reSizeTo(RECT & rc) + +void DocTabView::reSizeTo(RECT & rc) { int borderWidth = ((NppParameters::getInstance())->getSVP())._borderWidth; if (_hideTabBarStatus) @@ -204,9 +219,9 @@ void DocTabView::reSizeTo(RECT & rc) { TabBar::reSizeTo(rc); rc.left += borderWidth; - rc.right -= borderWidth * 2; + rc.right -= borderWidth * 2; rc.top += borderWidth; - rc.bottom -= (borderWidth * 2); + rc.bottom -= (borderWidth * 2); _pView->reSizeTo(rc); } } \ No newline at end of file diff --git a/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp b/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp index 6a5dc843f..544903220 100644 --- a/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp +++ b/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -57,15 +57,15 @@ const int ScintillaEditView::_SC_MARGE_FOLDER = 2; WNDPROC ScintillaEditView::_scintillaDefaultProc = NULL; /* -SC_MARKNUM_* | Arrow Plus/minus Circle tree Box tree +SC_MARKNUM_* | Arrow Plus/minus Circle tree Box tree ------------------------------------------------------------------------------------------------------------- -FOLDEROPEN | SC_MARK_ARROWDOWN SC_MARK_MINUS SC_MARK_CIRCLEMINUS SC_MARK_BOXMINUS -FOLDER | SC_MARK_ARROW SC_MARK_PLUS SC_MARK_CIRCLEPLUS SC_MARK_BOXPLUS -FOLDERSUB | SC_MARK_EMPTY SC_MARK_EMPTY SC_MARK_VLINE SC_MARK_VLINE -FOLDERTAIL | SC_MARK_EMPTY SC_MARK_EMPTY SC_MARK_LCORNERCURVE SC_MARK_LCORNER -FOLDEREND | SC_MARK_EMPTY SC_MARK_EMPTY SC_MARK_CIRCLEPLUSCONNECTED SC_MARK_BOXPLUSCONNECTED -FOLDEROPENMID | SC_MARK_EMPTY SC_MARK_EMPTY SC_MARK_CIRCLEMINUSCONNECTED SC_MARK_BOXMINUSCONNECTED -FOLDERMIDTAIL | SC_MARK_EMPTY SC_MARK_EMPTY SC_MARK_TCORNERCURVE SC_MARK_TCORNER +FOLDEROPEN | SC_MARK_ARROWDOWN SC_MARK_MINUS SC_MARK_CIRCLEMINUS SC_MARK_BOXMINUS +FOLDER | SC_MARK_ARROW SC_MARK_PLUS SC_MARK_CIRCLEPLUS SC_MARK_BOXPLUS +FOLDERSUB | SC_MARK_EMPTY SC_MARK_EMPTY SC_MARK_VLINE SC_MARK_VLINE +FOLDERTAIL | SC_MARK_EMPTY SC_MARK_EMPTY SC_MARK_LCORNERCURVE SC_MARK_LCORNER +FOLDEREND | SC_MARK_EMPTY SC_MARK_EMPTY SC_MARK_CIRCLEPLUSCONNECTED SC_MARK_BOXPLUSCONNECTED +FOLDEROPENMID | SC_MARK_EMPTY SC_MARK_EMPTY SC_MARK_CIRCLEMINUSCONNECTED SC_MARK_BOXMINUSCONNECTED +FOLDERMIDTAIL | SC_MARK_EMPTY SC_MARK_EMPTY SC_MARK_TCORNERCURVE SC_MARK_TCORNER */ const int ScintillaEditView::_markersArray[][NB_FOLDER_STATE] = { @@ -146,7 +146,7 @@ int getNbDigits(int aNum, int base) { int nbChiffre = 1; int diviseur = base; - + for (;;) { int result = aNum / diviseur; @@ -230,7 +230,7 @@ void ScintillaEditView::init(HINSTANCE hInst, HWND hPere) execute(SCI_INDICSETSTYLE, SCE_UNIVERSAL_FOUND_STYLE_EXT2, INDIC_ROUNDBOX); execute(SCI_INDICSETSTYLE, SCE_UNIVERSAL_FOUND_STYLE_EXT3, INDIC_ROUNDBOX); execute(SCI_INDICSETSTYLE, SCE_UNIVERSAL_FOUND_STYLE_EXT4, INDIC_ROUNDBOX); - execute(SCI_INDICSETSTYLE, SCE_UNIVERSAL_FOUND_STYLE_EXT5, INDIC_ROUNDBOX); + execute(SCI_INDICSETSTYLE, SCE_UNIVERSAL_FOUND_STYLE_EXT5, INDIC_ROUNDBOX); execute(SCI_INDICSETALPHA, SCE_UNIVERSAL_FOUND_STYLE_SMART, 100); execute(SCI_INDICSETALPHA, SCE_UNIVERSAL_FOUND_STYLE, 100); @@ -241,7 +241,7 @@ void ScintillaEditView::init(HINSTANCE hInst, HWND hPere) execute(SCI_INDICSETALPHA, SCE_UNIVERSAL_FOUND_STYLE_EXT2, 100); execute(SCI_INDICSETALPHA, SCE_UNIVERSAL_FOUND_STYLE_EXT3, 100); execute(SCI_INDICSETALPHA, SCE_UNIVERSAL_FOUND_STYLE_EXT4, 100); - execute(SCI_INDICSETALPHA, SCE_UNIVERSAL_FOUND_STYLE_EXT5, 100); + execute(SCI_INDICSETALPHA, SCE_UNIVERSAL_FOUND_STYLE_EXT5, 100); execute(SCI_INDICSETUNDER, SCE_UNIVERSAL_FOUND_STYLE_SMART, true); execute(SCI_INDICSETUNDER, SCE_UNIVERSAL_FOUND_STYLE, true); @@ -252,9 +252,9 @@ void ScintillaEditView::init(HINSTANCE hInst, HWND hPere) execute(SCI_INDICSETUNDER, SCE_UNIVERSAL_FOUND_STYLE_EXT2, true); execute(SCI_INDICSETUNDER, SCE_UNIVERSAL_FOUND_STYLE_EXT3, true); execute(SCI_INDICSETUNDER, SCE_UNIVERSAL_FOUND_STYLE_EXT4, true); - execute(SCI_INDICSETUNDER, SCE_UNIVERSAL_FOUND_STYLE_EXT5, true); + execute(SCI_INDICSETUNDER, SCE_UNIVERSAL_FOUND_STYLE_EXT5, true); _pParameter = NppParameters::getInstance(); - + _codepage = ::GetACP(); ::SetWindowLongPtr(_hSelf, GWLP_USERDATA, reinterpret_cast(this)); @@ -270,7 +270,7 @@ LRESULT CALLBACK ScintillaEditView::scintillaStatic_Proc(HWND hwnd, UINT Message ScintillaEditView *pScint = (ScintillaEditView *)(::GetWindowLongPtr(hwnd, GWLP_USERDATA)); if (Message == WM_MOUSEWHEEL || Message == WM_MOUSEHWHEEL) - { + { POINT pt; POINTS pts = MAKEPOINTS(lParam); POINTSTOPOINT(pt, pts); @@ -295,7 +295,7 @@ LRESULT CALLBACK ScintillaEditView::scintillaStatic_Proc(HWND hwnd, UINT Message return ::DefWindowProc(hwnd, Message, wParam, lParam); } -LRESULT ScintillaEditView::scintillaNew_Proc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +LRESULT ScintillaEditView::scintillaNew_Proc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch (Message) { @@ -321,7 +321,7 @@ LRESULT ScintillaEditView::scintillaNew_Proc(HWND hwnd, UINT Message, WPARAM wPa case WM_IME_REQUEST: { - + if (wParam == IMR_RECONVERTSTRING) { int textLength; @@ -416,7 +416,7 @@ LRESULT ScintillaEditView::scintillaNew_Proc(HWND hwnd, UINT Message, WPARAM wPa notification.nmhdr.idFrom = ::GetDlgCtrlID(_hSelf); ::SendMessage(_hParent, WM_NOTIFY, (WPARAM)LINKTRIGGERED, (LPARAM)¬ification); - } + } break; } @@ -437,7 +437,7 @@ void ScintillaEditView::setSpecialStyle(const Style & styleToSet) if ( styleToSet._colorStyle & COLORSTYLE_BACKGROUND ) execute(SCI_STYLESETBACK, styleID, styleToSet._bgColor); - + if (styleToSet._fontName && lstrcmp(styleToSet._fontName, TEXT("")) != 0) { WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); @@ -465,7 +465,7 @@ void ScintillaEditView::setHotspotStyle(Style& styleToSet) } styleMap = _hotspotStyles[_currentBuffer]; (*styleMap)[styleToSet._styleID] = styleToSet; - + setStyle(styleToSet); } @@ -511,7 +511,7 @@ void ScintillaEditView::setStyle(Style styleToSet) styleToSet._fontSize = style._fontSize; if (style._fontStyle != STYLE_NOT_USED) - { + { if (go.enableBold) { if (style._fontStyle & FONTSTYLE_BOLD) @@ -523,7 +523,7 @@ void ScintillaEditView::setStyle(Style styleToSet) { if (style._fontStyle & FONTSTYLE_ITALIC) styleToSet._fontStyle |= FONTSTYLE_ITALIC; - else + else styleToSet._fontStyle &= ~FONTSTYLE_ITALIC; } if (go.enableUnderLine) @@ -559,7 +559,7 @@ void ScintillaEditView::setXmlLexer(LangType type) const char *htmlKeyWords = wmc->wchar2char(htmlKeyWords_generic, CP_ACP); execute(SCI_SETKEYWORDS, 0, reinterpret_cast(htmlKeyWords?htmlKeyWords:"")); makeStyle(L_HTML); - + setEmbeddedJSLexer(); setEmbeddedPhpLexer(); setEmbeddedAspLexer(); @@ -644,7 +644,7 @@ void ScintillaEditView::setUserLexer(const TCHAR *userLangName) } else { - codepage = CP_OEMCP; // system OEM code page might not match user selection for character set, + codepage = CP_OEMCP; // system OEM code page might not match user selection for character set, // but this is the best match WideCharToMultiByte offers } @@ -655,7 +655,7 @@ void ScintillaEditView::setUserLexer(const TCHAR *userLangName) char name[] = "userDefine.prefixKeywords0"; for (int i=0 ; i_isPrefix[i]?"1":"0")); } @@ -738,7 +738,7 @@ void ScintillaEditView::setUserLexer(const TCHAR *userLangName) itoa((int)_currentBufferID, intBuffer, 10); // use numeric value of BufferID pointer execute(SCI_SETPROPERTY, (WPARAM)"userDefine.currentBufferID", reinterpret_cast(intBuffer)); - + for (int i = 0 ; i < SCE_USER_STYLE_TOTAL_STYLES ; ++i) { Style & style = userLangContainer->_styleArray.getStyler(i); @@ -758,13 +758,13 @@ void ScintillaEditView::setExternalLexer(LangType typeDoc) { int id = typeDoc - L_EXTERNAL; TCHAR * name = _pParameter->getELCFromIndex(id)._name; - + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); const char *pName = wmc->wchar2char(name, CP_ACP); execute(SCI_SETLEXERLANGUAGE, 0, (LPARAM)pName); - LexerStyler *pStyler = (_pParameter->getLStylerArray()).getLexerStylerByName(name); + LexerStyler *pStyler = (_pParameter->getLStylerArray()).getLexerStylerByName(name); if (pStyler) { for (int i = 0 ; i < pStyler->getNbStyler() ; ++i) @@ -774,7 +774,7 @@ void ScintillaEditView::setExternalLexer(LangType typeDoc) setStyle(style); if (style._keywordClass >= 0 && style._keywordClass <= KEYWORDSET_MAX) - { + { basic_string keywordList(""); if (style._keywords) { @@ -808,13 +808,13 @@ void ScintillaEditView::setCppLexer(LangType langType) if (langType == L_JS) { - LexerStyler *pStyler = (_pParameter->getLStylerArray()).getLexerStylerByName(lexerName); + LexerStyler *pStyler = (_pParameter->getLStylerArray()).getLexerStylerByName(lexerName); if (pStyler) { for (int i = 0, nb = pStyler->getNbStyler() ; i < nb ; ++i) { Style style = pStyler->getStyler(i); //not by reference, but copy - int cppID = style._styleID; + int cppID = style._styleID; switch (style._styleID) { case SCE_HJ_DEFAULT : cppID = SCE_C_DEFAULT; break; @@ -878,7 +878,7 @@ void ScintillaEditView::setTclLexer() const char *tclTypes; - execute(SCI_SETLEXER, SCLEX_TCL); + execute(SCI_SETLEXER, SCLEX_TCL); const TCHAR *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; makeStyle(L_TCL, pKwArray); @@ -904,21 +904,21 @@ void ScintillaEditView::setTclLexer() } //used by Objective-C and Actionscript -void ScintillaEditView::setObjCLexer(LangType langType) +void ScintillaEditView::setObjCLexer(LangType langType) { execute(SCI_SETLEXER, SCLEX_OBJC); const TCHAR *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; makeStyle(langType, pKwArray); - + basic_string objcInstr1Kwl(""); if (pKwArray[LANG_INDEX_INSTR]) { objcInstr1Kwl = wstring2string(pKwArray[LANG_INDEX_INSTR], CP_ACP); } const char *objcInstrs = getCompleteKeywordList(objcInstr1Kwl, langType, LANG_INDEX_INSTR); - + basic_string objcInstr2Kwl(""); if (pKwArray[LANG_INDEX_INSTR2]) { @@ -932,7 +932,7 @@ void ScintillaEditView::setObjCLexer(LangType langType) objcTypeKwl = wstring2string(pKwArray[LANG_INDEX_TYPE], CP_ACP); } const char *objcTypes = getCompleteKeywordList(objcTypeKwl, langType, LANG_INDEX_TYPE); - + basic_string objcType2Kwl(""); if (pKwArray[LANG_INDEX_TYPE2]) @@ -940,9 +940,9 @@ void ScintillaEditView::setObjCLexer(LangType langType) objcType2Kwl = wstring2string(pKwArray[LANG_INDEX_TYPE2], CP_ACP); } const char *objCQualifier = getCompleteKeywordList(objcType2Kwl, langType, LANG_INDEX_TYPE2); - - - + + + basic_string doxygenKeyWordsString(""); const TCHAR *doxygenKeyWordsW = _pParameter->getWordList(L_CPP, LANG_INDEX_TYPE2); if (doxygenKeyWordsW) @@ -976,7 +976,7 @@ void ScintillaEditView::setLexer(int lexerID, LangType langType, int whichList) execute(SCI_SETLEXER, lexerID); const TCHAR *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; - + makeStyle(langType, pKwArray); WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); @@ -985,7 +985,7 @@ void ScintillaEditView::setLexer(int lexerID, LangType langType, int whichList) { const char * keyWords_char = wmc->wchar2char(pKwArray[LANG_INDEX_INSTR], CP_ACP); setKeywords(langType, keyWords_char, LANG_INDEX_INSTR); - } + } if (whichList & LIST_1) { @@ -1069,7 +1069,7 @@ void ScintillaEditView::defineDocType(LangType typeDoc) int iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_FOUND_STYLE); if (iFind != -1) { - pStyle = &(stylers.getStyler(iFind)); + pStyle = &(stylers.getStyler(iFind)); } setSpecialIndicator(*pStyle); @@ -1163,7 +1163,7 @@ void ScintillaEditView::defineDocType(LangType typeDoc) pStyle = &(stylers.getStyler(iFind)); } setSpecialIndicator(*pStyle); - + // Il faut surtout faire un test ici avant d'excuter SCI_SETCODEPAGE // Sinon y'aura un soucis de performance! if (isCJK()) @@ -1195,10 +1195,10 @@ void ScintillaEditView::defineDocType(LangType typeDoc) case L_TCL : setTclLexer(); break; - + case L_OBJC : setObjCLexer(typeDoc); break; - + case L_PHP : case L_ASP : case L_JSP : @@ -1217,11 +1217,11 @@ void ScintillaEditView::defineDocType(LangType typeDoc) case L_INI : setIniLexer(); break; - + case L_USER : { const TCHAR * langExt = _currentBuffer->getUserDefineLangName(); if (langExt[0]) - setUserLexer(langExt); + setUserLexer(langExt); else setUserLexer(); break; } @@ -1277,7 +1277,7 @@ void ScintillaEditView::defineDocType(LangType typeDoc) case L_BATCH : setBatchLexer(); break; - case L_TEX : + case L_TEX : setTeXLexer(); break; case L_NSIS : @@ -1286,7 +1286,7 @@ void ScintillaEditView::defineDocType(LangType typeDoc) case L_BASH : setBashLexer(); break; - case L_FORTRAN : + case L_FORTRAN : setFortranLexer(); break; case L_LISP : @@ -1490,13 +1490,13 @@ void ScintillaEditView::activateBuffer(BufferID buffer) // get foldStateInfo of current doc std::vector lineStateVector; getCurrentFoldStates(lineStateVector); - + // put the state into the future ex buffer _currentBuffer->setHeaderLineState(lineStateVector, this); _currentBufferID = buffer; //the magical switch happens here _currentBuffer = newBuf; - // change the doc, this operation will decrease + // change the doc, this operation will decrease // the ref count of old current doc and increase the one of the new doc. FileManager should manage the rest // Note that the actual reference in the Buffer itself is NOT decreased, Notepad_plus does that if neccessary execute(SCI_SETDOCPOINTER, 0, _currentBuffer->getDocument()); @@ -1536,7 +1536,7 @@ void ScintillaEditView::getCurrentFoldStates(std::vector & lineStateVect do { contractedFoldHeaderLine = execute(SCI_CONTRACTEDFOLDNEXT, contractedFoldHeaderLine); - if (contractedFoldHeaderLine != -1) + if (contractedFoldHeaderLine != -1) { //-- Store contracted line lineStateVector.push_back(contractedFoldHeaderLine); @@ -1559,9 +1559,9 @@ void ScintillaEditView::syncFoldStateWith(const std::vector & lineStateV void ScintillaEditView::bufferUpdated(Buffer * buffer, int mask) { //actually only care about language and lexing etc - if (buffer == _currentBuffer) + if (buffer == _currentBuffer) { - if (mask & BufferChangeLanguage) + if (mask & BufferChangeLanguage) { defineDocType(buffer->getLangType()); foldAll(fold_uncollapse); @@ -1575,30 +1575,30 @@ void ScintillaEditView::bufferUpdated(Buffer * buffer, int mask) } //else nothing, otherwise infinite loop } - if (mask & BufferChangeFormat) + if (mask & BufferChangeFormat) { execute(SCI_SETEOLMODE, _currentBuffer->getFormat()); } - if (mask & BufferChangeReadonly) + if (mask & BufferChangeReadonly) { execute(SCI_SETREADONLY, _currentBuffer->isReadOnly()); } - if (mask & BufferChangeUnicode) + if (mask & BufferChangeUnicode) { int enc = CP_ACP; - if (buffer->getUnicodeMode() == uni8Bit) + if (buffer->getUnicodeMode() == uni8Bit) { //either 0 or CJK codepage LangType typeDoc = buffer->getLangType(); if (isCJK()) { if (typeDoc == L_CSS || typeDoc == L_CAML || typeDoc == L_ASM || typeDoc == L_MATLAB) enc = CP_ACP; //you may also want to set charsets here, not yet implemented - else + else enc = _codepage; } else enc = CP_ACP; - } + } else //CP UTF8 for all unicode enc = SC_CP_UTF8; execute(SCI_SETCODEPAGE, enc); @@ -1612,10 +1612,10 @@ void ScintillaEditView::collapse(int level2Collapse, bool mode) int maxLine = execute(SCI_GETLINECOUNT); - for (int line = 0; line < maxLine; ++line) + for (int line = 0; line < maxLine; ++line) { int level = execute(SCI_GETFOLDLEVEL, line); - if (level & SC_FOLDLEVELHEADERFLAG) + if (level & SC_FOLDLEVELHEADERFLAG) { level -= SC_FOLDLEVELBASE; if (level2Collapse == (level & SC_FOLDLEVELNUMBERMASK)) @@ -1645,7 +1645,7 @@ void ScintillaEditView::fold(int line, bool mode) int headerLine; int level = execute(SCI_GETFOLDLEVEL, line); - + if (level & SC_FOLDLEVELHEADERFLAG) headerLine = line; else @@ -1674,10 +1674,10 @@ void ScintillaEditView::foldAll(bool mode) { int maxLine = execute(SCI_GETLINECOUNT); - for (int line = 0; line < maxLine; ++line) + for (int line = 0; line < maxLine; ++line) { int level = execute(SCI_GETFOLDLEVEL, line); - if (level & SC_FOLDLEVELHEADERFLAG) + if (level & SC_FOLDLEVELHEADERFLAG) if (isFolded(line) != mode) fold(line, mode); } @@ -1708,7 +1708,7 @@ void ScintillaEditView::getGenericText(TCHAR *dest, size_t destlen, int start, i WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); char *destA = new char[end - start + 1]; getText(destA, start, end); - unsigned int cp = execute(SCI_GETCODEPAGE); + unsigned int cp = execute(SCI_GETCODEPAGE); const TCHAR *destW = wmc->char2wchar(destA, cp); _tcsncpy_s(dest, destlen, destW, _TRUNCATE); delete [] destA; @@ -1722,7 +1722,7 @@ void ScintillaEditView::getGenericText(TCHAR *dest, size_t destlen, int start, i WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); char *destA = new char[end - start + 1]; getText(destA, start, end); - unsigned int cp = execute(SCI_GETCODEPAGE); + unsigned int cp = execute(SCI_GETCODEPAGE); const TCHAR *destW = wmc->char2wchar(destA, cp, mstart, mend); _tcsncpy_s(dest, destlen, destW, _TRUNCATE); delete [] destA; @@ -1786,7 +1786,7 @@ TCHAR * ScintillaEditView::getGenericWordOnCaretPos(TCHAR * txt, int size) unsigned int cp = execute(SCI_GETCODEPAGE); char *txtA = new char[size + 1]; getWordOnCaretPos(txtA, size); - + const TCHAR * txtW = wmc->char2wchar(txtA, cp); lstrcpy(txt, txtW); delete [] txtA; @@ -1817,7 +1817,7 @@ TCHAR * ScintillaEditView::getGenericSelectedText(TCHAR * txt, int size, bool ex unsigned int cp = execute(SCI_GETCODEPAGE); char *txtA = new char[size + 1]; getSelectedText(txtA, size, expand); - + const TCHAR * txtW = wmc->char2wchar(txtA, cp); lstrcpy(txt, txtW); delete [] txtA; @@ -1830,7 +1830,7 @@ int ScintillaEditView::searchInTarget(const TCHAR * text2Find, int lenOfText2Fin execute(SCI_SETTARGETEND, toPos); WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); - unsigned int cp = execute(SCI_GETCODEPAGE); + unsigned int cp = execute(SCI_GETCODEPAGE); const char *text2FindA = wmc->wchar2char(text2Find, cp); size_t text2FindALen = strlen(text2FindA); int len = (lenOfText2Find > (int)text2FindALen)?lenOfText2Find:text2FindALen; @@ -1841,7 +1841,7 @@ int ScintillaEditView::searchInTarget(const TCHAR * text2Find, int lenOfText2Fin void ScintillaEditView::appandGenericText(const TCHAR * text2Append) const { WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); - unsigned int cp = execute(SCI_GETCODEPAGE); + unsigned int cp = execute(SCI_GETCODEPAGE); const char *text2AppendA =wmc->wchar2char(text2Append, cp); execute(SCI_APPENDTEXT, strlen(text2AppendA), (LPARAM)text2AppendA); } @@ -1849,7 +1849,7 @@ void ScintillaEditView::appandGenericText(const TCHAR * text2Append) const void ScintillaEditView::addGenericText(const TCHAR * text2Append) const { WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); - unsigned int cp = execute(SCI_GETCODEPAGE); + unsigned int cp = execute(SCI_GETCODEPAGE); const char *text2AppendA =wmc->wchar2char(text2Append, cp); execute(SCI_ADDTEXT, strlen(text2AppendA), (LPARAM)text2AppendA); } @@ -1857,7 +1857,7 @@ void ScintillaEditView::addGenericText(const TCHAR * text2Append) const void ScintillaEditView::addGenericText(const TCHAR * text2Append, long *mstart, long *mend) const { WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); - unsigned int cp = execute(SCI_GETCODEPAGE); + unsigned int cp = execute(SCI_GETCODEPAGE); const char *text2AppendA =wmc->wchar2char(text2Append, cp, mstart, mend); execute(SCI_ADDTEXT, strlen(text2AppendA), (LPARAM)text2AppendA); } @@ -1870,7 +1870,7 @@ int ScintillaEditView::replaceTarget(const TCHAR * str2replace, int fromTargetPo execute(SCI_SETTARGETEND, toTargetPos); } WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); - unsigned int cp = execute(SCI_GETCODEPAGE); + unsigned int cp = execute(SCI_GETCODEPAGE); const char *str2replaceA = wmc->wchar2char(str2replace, cp); return execute(SCI_REPLACETARGET, (WPARAM)-1, (LPARAM)str2replaceA); } @@ -1888,10 +1888,10 @@ int ScintillaEditView::replaceTargetRegExMode(const TCHAR * re, int fromTargetPo return execute(SCI_REPLACETARGETRE, (WPARAM)-1, (LPARAM)reA); } -void ScintillaEditView::showAutoComletion(int lenEntered, const TCHAR * list) +void ScintillaEditView::showAutoComletion(int lenEntered, const TCHAR* list) { WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); - unsigned int cp = execute(SCI_GETCODEPAGE); + unsigned int cp = execute(SCI_GETCODEPAGE); const char *listA = wmc->wchar2char(list, cp); execute(SCI_AUTOCSHOW, lenEntered, WPARAM(listA)); } @@ -1899,7 +1899,7 @@ void ScintillaEditView::showAutoComletion(int lenEntered, const TCHAR * list) void ScintillaEditView::showCallTip(int startPos, const TCHAR * def) { WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); - unsigned int cp = execute(SCI_GETCODEPAGE); + unsigned int cp = execute(SCI_GETCODEPAGE); const char *defA = wmc->wchar2char(def, cp); execute(SCI_CALLTIPSHOW, startPos, LPARAM(defA)); } @@ -1919,7 +1919,7 @@ void ScintillaEditView::getLine(int lineNumber, TCHAR * line, int lineBufferLen) unsigned int cp = execute(SCI_GETCODEPAGE); char *lineA = new char[lineBufferLen]; // From Scintilla documentation for SCI_GETLINE: "The buffer is not terminated by a 0 character." - memset(lineA, '\0', sizeof(char) * lineBufferLen); + memset(lineA, 0x0, sizeof(char) * lineBufferLen); execute(SCI_GETLINE, lineNumber, (LPARAM)lineA); const TCHAR *lineW = wmc->char2wchar(lineA, cp); lstrcpyn(line, lineW, lineBufferLen); @@ -1969,22 +1969,22 @@ void ScintillaEditView::marginClick(int position, int modifiers) execute(SCI_SETFOLDEXPANDED, lineClick, 1); expand(lineClick, true, true, 100, levelClick); } - else if (modifiers & SCMOD_CTRL) + else if (modifiers & SCMOD_CTRL) { - if (isFolded(lineClick)) + if (isFolded(lineClick)) { // Contract this line and all children execute(SCI_SETFOLDEXPANDED, lineClick, 0); expand(lineClick, false, true, 0, levelClick); - } - else + } + else { // Expand this line and all children execute(SCI_SETFOLDEXPANDED, lineClick, 1); expand(lineClick, true, true, 100, levelClick); } - } - else + } + else { // Toggle this line bool mode = isFolded(lineClick); @@ -2000,31 +2000,30 @@ void ScintillaEditView::expand(int &line, bool doExpand, bool force, int visLeve ++line; while (line <= lineMaxSubord) { - if (force) + if (force) { - if (visLevels > 0) - execute(SCI_SHOWLINES, line, line); - else - execute(SCI_HIDELINES, line, line); - } - else + execute(((visLevels > 0) ? SCI_SHOWLINES : SCI_HIDELINES), line, line); + } + else { if (doExpand) execute(SCI_SHOWLINES, line, line); } + int levelLine = level; if (levelLine == -1) levelLine = int(execute(SCI_GETFOLDLEVEL, line, 0)); + if (levelLine & SC_FOLDLEVELHEADERFLAG) { - if (force) + if (force) { if (visLevels > 1) execute(SCI_SETFOLDEXPANDED, line, 1); else execute(SCI_SETFOLDEXPANDED, line, 0); expand(line, doExpand, force, visLevels - 1); - } + } else { if (doExpand) @@ -2033,23 +2032,20 @@ void ScintillaEditView::expand(int &line, bool doExpand, bool force, int visLeve execute(SCI_SETFOLDEXPANDED, line, 1); expand(line, true, force, visLevels - 1); - } - else - { - expand(line, false, force, visLevels - 1); } + else + expand(line, false, force, visLevels - 1); } } else - { ++line; - } } runMarkers(true, 0, true, false); } -void ScintillaEditView::performGlobalStyles() + +void ScintillaEditView::performGlobalStyles() { StyleArray & stylers = _pParameter->getMiscStylerArray(); @@ -2168,7 +2164,7 @@ void ScintillaEditView::setLineIndent(int line, int indent) const { execute(SCI_SETSEL, crange.cpMin, crange.cpMax); } -void ScintillaEditView::updateLineNumberWidth() +void ScintillaEditView::updateLineNumberWidth() { if (_lineNumbersShown) { @@ -2213,7 +2209,7 @@ const char * ScintillaEditView::getCompleteKeywordList(std::basic_string & { kwl += " "; const TCHAR *defKwl_generic = _pParameter->getWordList(langType, keywordIndex); - + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); const char * defKwl = wmc->wchar2char(defKwl_generic, CP_ACP); kwl += defKwl?defKwl:""; @@ -2242,7 +2238,7 @@ void ScintillaEditView::setMultiSelections(const ColumnModeInfos & cmi) } } -void ScintillaEditView::currentLineUp() const +void ScintillaEditView::currentLineUp() const { int currentLine = getCurrentLineNumber(); if (currentLine != 0) @@ -2255,7 +2251,7 @@ void ScintillaEditView::currentLineUp() const } } -void ScintillaEditView::currentLineDown() const +void ScintillaEditView::currentLineDown() const { int currentLine = getCurrentLineNumber(); if (currentLine != (execute(SCI_GETLINECOUNT) - 1)) @@ -2268,7 +2264,7 @@ void ScintillaEditView::currentLineDown() const } } -// Get selection range : (fromLine, toLine) +// Get selection range : (fromLine, toLine) // return (-1, -1) if multi-selection pair ScintillaEditView::getSelectionLinesRange() const { @@ -2289,7 +2285,7 @@ pair ScintillaEditView::getSelectionLinesRange() const return range; } -void ScintillaEditView::currentLinesUp() const +void ScintillaEditView::currentLinesUp() const { pair lineRange = getSelectionLinesRange(); if ((lineRange.first == -1 || lineRange.first == 0)) @@ -2317,10 +2313,10 @@ void ScintillaEditView::currentLinesUp() const execute(SCI_SETSELECTIONEND, noSel?posStart - nbChar:posEnd - nbChar); } -void ScintillaEditView::currentLinesDown() const +void ScintillaEditView::currentLinesDown() const { pair lineRange = getSelectionLinesRange(); - + if ((lineRange.first == -1 || lineRange.second >= execute(SCI_LINEFROMPOSITION, getCurrentDocLen()))) return; @@ -2360,7 +2356,7 @@ void ScintillaEditView::convertSelectedTextTo(bool Case) if (execute(SCI_GETSELECTIONS) > 1) // Multi-Selection || Column mode { execute(SCI_BEGINUNDOACTION); - + ColumnModeInfos cmi = getColumnModeSelectInfo(); for (size_t i = 0, cmiLen = cmi.size(); i < cmiLen ; ++i) @@ -2403,7 +2399,7 @@ void ScintillaEditView::convertSelectedTextTo(bool Case) size_t selectionStart = execute(SCI_GETSELECTIONSTART); size_t selectionEnd = execute(SCI_GETSELECTIONEND); - + int strSize = ((selectionEnd > selectionStart)?(selectionEnd - selectionStart):(selectionStart - selectionEnd))+1; if (strSize) { @@ -2454,7 +2450,7 @@ bool ScintillaEditView::expandWordSelection() return false; } -TCHAR * int2str(TCHAR *str, int strLen, int number, int base, int nbChiffre, bool isZeroLeading) +TCHAR * int2str(TCHAR *str, int strLen, int number, int base, int nbChiffre, bool isZeroLeading) { if (nbChiffre >= strLen) return NULL; TCHAR f[64]; @@ -2469,7 +2465,7 @@ TCHAR * int2str(TCHAR *str, int strLen, int number, int base, int nbChiffre, boo int nbBits = sizeof(unsigned int) * 8; int nbBit2Shift = (nbChiffre >= nbBits)?nbBits:(nbBits - nbChiffre); unsigned long mask = MASK_ULONG_BITFORT >> nbBit2Shift; - int i = 0; + int i = 0; for (; mask > 0 ; ++i) { str[i] = (mask & number)?'1':'0'; @@ -2527,7 +2523,7 @@ ColumnModeInfos ScintillaEditView::getColumnModeSelectInfo() int absPosSelEndPerLine = execute(SCI_GETSELECTIONNCARET, i); int nbVirtualAnchorSpc = execute(SCI_GETSELECTIONNANCHORVIRTUALSPACE, i); int nbVirtualCaretSpc = execute(SCI_GETSELECTIONNCARETVIRTUALSPACE, i); - + if (absPosSelStartPerLine == absPosSelEndPerLine && execute(SCI_SELECTIONISRECTANGLE)) { bool dir = nbVirtualAnchorSpcwchar2char(str, cp); execute(SCI_REPLACETARGET, (WPARAM)-1, (LPARAM)strA); - - if (hasVirtualSpc) + + if (hasVirtualSpc) { totalDiff += cmi[i]._nbVirtualAnchorSpc + lstrlen(str); @@ -2608,7 +2604,7 @@ void ScintillaEditView::columnReplace(ColumnModeInfos & cmi, int initial, int in UCHAR f = format & MASK_FORMAT; bool isZeroLeading = (MASK_ZERO_LEADING & format) != 0; - + int base = 10; if (f == BASE_16) base = 16; @@ -2677,7 +2673,7 @@ void ScintillaEditView::columnReplace(ColumnModeInfos & cmi, int initial, int in const char *strA = wmc->wchar2char(str, cp); execute(SCI_REPLACETARGET, (WPARAM)-1, (LPARAM)strA); - if (hasVirtualSpc) + if (hasVirtualSpc) { totalDiff += cmi[i]._nbVirtualAnchorSpc + lstrlen(str); // Now there's no more virtual space @@ -2843,7 +2839,7 @@ void ScintillaEditView::runMarkers(bool doHide, int searchStart, bool endOfDoc, return else search for other hidden sections - + Show: Run through all lines Find open hiding marker diff --git a/PowerEditor/src/ScitillaComponent/ScintillaEditView.h b/PowerEditor/src/ScitillaComponent/ScintillaEditView.h index c5f328a11..347883e11 100644 --- a/PowerEditor/src/ScitillaComponent/ScintillaEditView.h +++ b/PowerEditor/src/ScitillaComponent/ScintillaEditView.h @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -153,7 +153,7 @@ const bool L2R = true; const bool R2L = false; struct ColumnModeInfo { - int _selLpos; + int _selLpos; int _selRpos; int _order; // 0 based index bool _direction; // L2R or R2L @@ -218,7 +218,7 @@ public: { ::FreeLibrary(_hLib); - for (BufferStyleMap::iterator it(_hotspotStyles.begin()); it != _hotspotStyles.end(); ++it ) + for (BufferStyleMap::iterator it(_hotspotStyles.begin()); it != _hotspotStyles.end(); ++it ) { for (StyleMap::iterator it2(it->second->begin()) ; it2 != it->second->end() ; ++it2) { @@ -240,7 +240,7 @@ public: LRESULT execute(UINT Msg, WPARAM wParam=0, LPARAM lParam=0) const { return _pScintillaFunc(_pScintillaPtr, Msg, wParam, lParam); }; - + void activateBuffer(BufferID buffer); void getCurrentFoldStates(std::vector & lineStateVector); @@ -303,7 +303,7 @@ public: void getWordToCurrentPos(TCHAR * str, int strLen) const { int caretPos = execute(SCI_GETCURRENTPOS); int startPos = static_cast(execute(SCI_WORDSTARTPOSITION, caretPos, true)); - + str[0] = '\0'; if ((caretPos - startPos) < strLen) getGenericText(str, strLen, startPos, caretPos); @@ -394,7 +394,7 @@ public: }; void showIndentGuideLine(bool willBeShowed = true) { - execute(SCI_SETINDENTATIONGUIDES, (WPARAM)willBeShowed?(SC_IV_LOOKBOTH):(SC_IV_NONE)); + execute(SCI_SETINDENTATIONGUIDES, (WPARAM)willBeShowed?(SC_IV_LOOKBOTH):(SC_IV_NONE)); }; bool isShownIndentGuide() const { @@ -450,7 +450,7 @@ public: long getTextHeight()const{ return long(execute(SCI_TEXTHEIGHT)); }; - + void gotoLine(int line){ if (line < execute(SCI_GETLINECOUNT)) execute(SCI_GOTOLINE,line); @@ -467,17 +467,18 @@ public: long start = long(execute(SCI_GETSELECTIONSTART)); long end = long(execute(SCI_GETSELECTIONEND)); selByte = (start < end)?end-start:start-end; - + start = long(execute(SCI_LINEFROMPOSITION, start)); end = long(execute(SCI_LINEFROMPOSITION, end)); selLine = (start < end)?end-start:start-end; - if (selLine) + if (selLine) ++selLine; - + return true; }; - long getSelectedLength() const { + long getSelectedLength() const + { // return -1 if it's multi-selection or rectangle selection if ((execute(SCI_GETSELECTIONS) > 1) || execute(SCI_SELECTIONISRECTANGLE)) return -1; @@ -494,7 +495,7 @@ public: } delete [] selected; return length; - }; + } long getLineLength(int line) const { @@ -507,7 +508,8 @@ public: void setLineIndent(int line, int indent) const; - void showLineNumbersMargin(bool show){ + void showLineNumbersMargin(bool show) + { if (show == _lineNumbersShown) return; _lineNumbersShown = show; if (show) @@ -536,7 +538,7 @@ public: void performGlobalStyles(); void expand(int &line, bool doExpand, bool force = false, int visLevels = 0, int level = -1); - + void currentLineUp() const; void currentLineDown() const; @@ -562,7 +564,7 @@ public: else execute(SCI_UPPERCASE); }; - + void collapse(int level2Collapse, bool mode); void foldAll(bool mode); void fold(int line, bool mode); @@ -575,7 +577,7 @@ public: NppParameters * getParameter() { return _pParameter; }; - + ColumnModeInfos getColumnModeSelectInfo(); void columnReplace(ColumnModeInfos & cmi, const TCHAR *str); @@ -606,7 +608,7 @@ public: bool isSelecting() const { static CharacterRange previousSelRange = getSelection(); CharacterRange currentSelRange = getSelection(); - + if (currentSelRange.cpMin == currentSelRange.cpMax) { previousSelRange = currentSelRange; @@ -618,7 +620,7 @@ public: previousSelRange = currentSelRange; return true; } - + previousSelRange = currentSelRange; return false; }; @@ -627,14 +629,14 @@ public: void mouseWheel(WPARAM wParam, LPARAM lParam) { scintillaNew_Proc(_hSelf, WM_MOUSEWHEEL, wParam, lParam); }; - + void setHotspotStyle(Style& styleToSet); void setTabSettings(Lang *lang); bool isWrapRestoreNeeded() const {return _wrapRestoreNeeded;}; void setWrapRestoreNeeded(bool isWrapRestoredNeeded) {_wrapRestoreNeeded = isWrapRestoredNeeded;}; bool isCJK() const { - return ((_codepage == CP_CHINESE_TRADITIONAL) || (_codepage == CP_CHINESE_SIMPLIFIED) || + return ((_codepage == CP_CHINESE_TRADITIONAL) || (_codepage == CP_CHINESE_SIMPLIFIED) || (_codepage == CP_JAPANESE) || (_codepage == CP_KOREAN)); }; void scrollPosToCenter(int pos); @@ -646,7 +648,7 @@ public: protected: static HINSTANCE _hLib; static int _refCount; - + static UserDefineDialog _userDefineDlg; static const int _markersArray[][NB_FOLDER_STATE]; @@ -663,7 +665,7 @@ protected: //Store the current buffer so it can be retrieved later BufferID _currentBufferID; Buffer * _currentBuffer; - + NppParameters *_pParameter; int _codepage; bool _lineNumbersShown; @@ -861,7 +863,7 @@ protected: void setRLexer() { setLexer(SCLEX_R, L_R, LIST_0 | LIST_1 | LIST_2); }; - + void setCoffeeScriptLexer() { setLexer(SCLEX_COFFEESCRIPT, L_COFFEESCRIPT, LIST_0 | LIST_1 | LIST_2 | LIST_3); }; @@ -902,7 +904,7 @@ protected: }; int codepage2CharSet() const { - switch (_codepage) + switch (_codepage) { case CP_CHINESE_TRADITIONAL : return SC_CHARSET_CHINESEBIG5; case CP_CHINESE_SIMPLIFIED : return SC_CHARSET_GB2312; diff --git a/PowerEditor/src/WinControls/AboutDlg/AboutDlg.cpp b/PowerEditor/src/WinControls/AboutDlg/AboutDlg.cpp index 169c22df4..c1a2472b2 100644 --- a/PowerEditor/src/WinControls/AboutDlg/AboutDlg.cpp +++ b/PowerEditor/src/WinControls/AboutDlg/AboutDlg.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -35,7 +35,7 @@ INT_PTR CALLBACK AboutDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) { - switch (message) + switch (message) { case WM_INITDIALOG : { @@ -82,12 +82,12 @@ INT_PTR CALLBACK AboutDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lPara return TRUE; } - case WM_COMMAND : + case WM_COMMAND : { switch (wParam) { case IDCANCEL : - case IDOK : + case IDOK : display(false); return TRUE; @@ -101,7 +101,7 @@ INT_PTR CALLBACK AboutDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lPara return TRUE; } } - return FALSE; + return FALSE; } void AboutDlg::doDialog() diff --git a/PowerEditor/src/WinControls/AboutDlg/URLCtrl.cpp b/PowerEditor/src/WinControls/AboutDlg/URLCtrl.cpp index 7423d475a..8d53c6167 100644 --- a/PowerEditor/src/WinControls/AboutDlg/URLCtrl.cpp +++ b/PowerEditor/src/WinControls/AboutDlg/URLCtrl.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -31,37 +31,37 @@ static BYTE XORMask[128] = { 0xff, 0xff, 0xff, 0xff, - 0xf9, 0xff, 0xff, 0xff, - 0xf0, 0xff, 0xff, 0xff, - 0xf0, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, - 0xf0, 0xff, 0xff, 0xff, - 0xf0, 0x24, 0xff, 0xff, - 0xf0, 0x00, 0x7f, 0xff, + 0xf0, 0xff, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xff, + 0xf0, 0xff, 0xff, 0xff, + 0xf0, 0x24, 0xff, 0xff, + 0xf0, 0x00, 0x7f, 0xff, 0xc0, 0x00, 0x7f, 0xff, - 0x80, 0x00, 0x7f, 0xff, - 0x80, 0x00, 0x7f, 0xff, - 0x80, 0x00, 0x7f, 0xff, 0x80, 0x00, 0x7f, 0xff, - 0x80, 0x00, 0x7f, 0xff, - 0xc0, 0x00, 0x7f, 0xff, - 0xe0, 0x00, 0x7f, 0xff, + 0x80, 0x00, 0x7f, 0xff, + 0x80, 0x00, 0x7f, 0xff, + 0x80, 0x00, 0x7f, 0xff, + 0x80, 0x00, 0x7f, 0xff, + 0xc0, 0x00, 0x7f, 0xff, + 0xe0, 0x00, 0x7f, 0xff, + 0xf0, 0x00, 0xff, 0xff, + 0xf0, 0x00, 0xff, 0xff, 0xf0, 0x00, 0xff, 0xff, - 0xf0, 0x00, 0xff, 0xff, - 0xf0, 0x00, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, }; /* AND mask for hand cursor */ @@ -69,37 +69,37 @@ static BYTE XORMask[128] = static BYTE ANDMask[128] = { 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, + 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0xdb, 0x00, 0x00, - 0x06, 0xdb, 0x00, 0x00, - 0x36, 0xdb, 0x00, 0x00, - 0x36, 0xdb, 0x00, 0x00, - 0x37, 0xff, 0x00, 0x00, + 0x06, 0xdb, 0x00, 0x00, + 0x36, 0xdb, 0x00, 0x00, + 0x36, 0xdb, 0x00, 0x00, + 0x37, 0xff, 0x00, 0x00, 0x3f, 0xff, 0x00, 0x00, - 0x3f, 0xff, 0x00, 0x00, - 0x1f, 0xff, 0x00, 0x00, - 0x0f, 0xff, 0x00, 0x00, + 0x3f, 0xff, 0x00, 0x00, + 0x1f, 0xff, 0x00, 0x00, + 0x0f, 0xff, 0x00, 0x00, 0x07, 0xfe, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, }; @@ -165,7 +165,7 @@ void URLCtrl::action() else { _linkColor = _visitedColor; - + ::InvalidateRect(_hSelf, 0, 0); ::UpdateWindow(_hSelf); @@ -183,7 +183,7 @@ void URLCtrl::action() } } -LRESULT URLCtrl::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +LRESULT URLCtrl::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch(Message) { @@ -191,14 +191,14 @@ LRESULT URLCtrl::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) case WM_NCDESTROY: //HeapFree(GetProcessHeap(), 0, url); break; - + // Paint the static control using our custom // colours, and with an underline text style case WM_PAINT: { DWORD dwStyle = ::GetWindowLongPtr(hwnd, GWL_STYLE); DWORD dwDTStyle = DT_SINGLELINE; - + //Test if centered horizontally or vertically if(dwStyle & SS_CENTER) dwDTStyle |= DT_CENTER; if(dwStyle & SS_RIGHT) dwDTStyle |= DT_RIGHT; @@ -209,12 +209,12 @@ LRESULT URLCtrl::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) PAINTSTRUCT ps; HDC hdc = ::BeginPaint(hwnd, &ps); - + ::SetTextColor(hdc, _linkColor); ::SetBkColor(hdc, getCtrlBgColor(GetParent(hwnd))); ///*::GetSysColor(COLOR_3DFACE)*/); - - // Create an underline font + + // Create an underline font if(_hfUnderlined == 0) { // Get the default GUI font @@ -224,18 +224,18 @@ LRESULT URLCtrl::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) // Add UNDERLINE attribute GetObject(hf, sizeof lf, &lf); lf.lfUnderline = TRUE; - + // Create a new font _hfUnderlined = ::CreateFontIndirect(&lf); } - + HANDLE hOld = SelectObject(hdc, _hfUnderlined); // Draw the text! TCHAR szWinText[MAX_PATH]; ::GetWindowText(hwnd, szWinText, MAX_PATH); ::DrawText(hdc, szWinText, -1, &rect, dwDTStyle); - + ::SelectObject(hdc, hOld); ::EndPaint(hwnd, &ps); @@ -255,11 +255,11 @@ LRESULT URLCtrl::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { if (_hCursor == 0) _hCursor = ::CreateCursor(::GetModuleHandle(0), 5, 2, 32, 32, XORMask, ANDMask); - + SetCursor(_hCursor); return TRUE; } - + case WM_LBUTTONDOWN: _clicking = true; break; @@ -273,7 +273,7 @@ LRESULT URLCtrl::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) } break; - + //Support using space to activate this object case WM_KEYDOWN: if(wParam == VK_SPACE) diff --git a/PowerEditor/src/WinControls/AnsiCharPanel/ListView.cpp b/PowerEditor/src/WinControls/AnsiCharPanel/ListView.cpp index ea37f218e..c9f170427 100644 --- a/PowerEditor/src/WinControls/AnsiCharPanel/ListView.cpp +++ b/PowerEditor/src/WinControls/AnsiCharPanel/ListView.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -35,26 +35,26 @@ void ListView::init(HINSTANCE hInst, HWND parent) { Window::init(hInst, parent); INITCOMMONCONTROLSEX icex; - - // Ensure that the common control DLL is loaded. + + // Ensure that the common control DLL is loaded. icex.dwSize = sizeof(INITCOMMONCONTROLSEX); icex.dwICC = ICC_LISTVIEW_CLASSES; InitCommonControlsEx(&icex); - + // Create the list-view window in report view with label editing enabled. int listViewStyles = LVS_REPORT | LVS_NOSORTHEADER\ | LVS_SINGLESEL | LVS_AUTOARRANGE\ | LVS_SHAREIMAGELISTS | LVS_SHOWSELALWAYS; - _hSelf = ::CreateWindow(WC_LISTVIEW, - TEXT(""), + _hSelf = ::CreateWindow(WC_LISTVIEW, + TEXT(""), WS_CHILD | listViewStyles, 0, - 0, 0, 0, - _hParent, - (HMENU) NULL, + 0, + _hParent, + (HMENU) NULL, hInst, NULL); if (!_hSelf) @@ -80,7 +80,7 @@ void ListView::init(HINSTANCE hInst, HWND parent) lvColumn.cx = 45; lvColumn.pszText = (TCHAR *)valStr.c_str(); ListView_InsertColumn(_hSelf, 0, &lvColumn); - + lvColumn.cx = 45; lvColumn.pszText = (TCHAR *)hexStr.c_str(); ListView_InsertColumn(_hSelf, 1, &lvColumn); @@ -190,7 +190,7 @@ generic_string ListView::getAscii(unsigned char value) void ListView::setValues(int codepage) { _codepage = codepage; - + for (int i = 0 ; i < 256 ; ++i) { LVITEM item; diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingManager.cpp b/PowerEditor/src/WinControls/DockingWnd/DockingManager.cpp index 94d850697..3b4d4ae80 100644 --- a/PowerEditor/src/WinControls/DockingWnd/DockingManager.cpp +++ b/PowerEditor/src/WinControls/DockingWnd/DockingManager.cpp @@ -1,16 +1,16 @@ // this file is part of docking functionality for Notepad++ // Copyright (C)2006 Jens Lorenz -// +// // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. -// +// // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -20,7 +20,7 @@ // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. @@ -118,7 +118,7 @@ void DockingManager::init(HINSTANCE hInst, HWND hWnd, Window ** ppWin) clz.hInstance = _hInst; clz.hIcon = NULL; clz.hCursor = ::LoadCursor(NULL, IDC_ARROW); - clz.hbrBackground = NULL; + clz.hbrBackground = NULL; clz.lpszMenuName = NULL; clz.lpszClassName = DSPC_CLASS_NAME; @@ -177,7 +177,7 @@ void DockingManager::init(HINSTANCE hInst, HWND hWnd, Window ** ppWin) _isInitialized = TRUE; } -void DockingManager::destroy() +void DockingManager::destroy() { ::DestroyWindow(_hSelf); } @@ -186,7 +186,7 @@ LRESULT CALLBACK DockingManager::staticWinProc(HWND hwnd, UINT message, WPARAM w { DockingManager *pDockingManager = NULL; switch (message) - { + { case WM_NCCREATE : pDockingManager = (DockingManager *)(((LPCREATESTRUCT)lParam)->lpCreateParams); pDockingManager->_hSelf = hwnd; @@ -201,7 +201,7 @@ LRESULT CALLBACK DockingManager::staticWinProc(HWND hwnd, UINT message, WPARAM w } } -void DockingManager::updateContainerInfo(HWND hClient) +void DockingManager::updateContainerInfo(HWND hClient) { for (size_t iCont = 0, len = _vContainer.size(); iCont < len; ++iCont) { @@ -212,7 +212,7 @@ void DockingManager::updateContainerInfo(HWND hClient) } } -void DockingManager::showContainer(HWND hCont, BOOL view) +void DockingManager::showContainer(HWND hCont, BOOL view) { for (size_t iCont = 0, len = _vContainer.size(); iCont < len; ++iCont) { @@ -417,7 +417,7 @@ void DockingManager::reSizeTo(RECT & rc) _dockData.rcRegion[CONT_TOP].left = rc.left; _dockData.rcRegion[CONT_TOP].top = rc.top; _dockData.rcRegion[CONT_TOP].right = rc.right-rc.left; - + _vSplitter[CONT_TOP]->display(false); if (_vContainer[CONT_TOP]->isVisible()) @@ -519,7 +519,7 @@ void DockingManager::reSizeTo(RECT & rc) // set window positions of container if (_vContainer[CONT_BOTTOM]->isVisible()) { - ::SetWindowPos(_vContainer[CONT_BOTTOM]->getHSelf(), NULL, + ::SetWindowPos(_vContainer[CONT_BOTTOM]->getHSelf(), NULL, rcBottom.left , rcBottom.top , rcBottom.right , @@ -530,7 +530,7 @@ void DockingManager::reSizeTo(RECT & rc) if (_vContainer[CONT_TOP]->isVisible()) { - ::SetWindowPos(_vContainer[CONT_TOP]->getHSelf(), NULL, + ::SetWindowPos(_vContainer[CONT_TOP]->getHSelf(), NULL, _dockData.rcRegion[CONT_TOP].left , _dockData.rcRegion[CONT_TOP].top , _dockData.rcRegion[CONT_TOP].right , @@ -541,7 +541,7 @@ void DockingManager::reSizeTo(RECT & rc) if (_vContainer[CONT_RIGHT]->isVisible()) { - ::SetWindowPos(_vContainer[CONT_RIGHT]->getHSelf(), NULL, + ::SetWindowPos(_vContainer[CONT_RIGHT]->getHSelf(), NULL, rcRight.left , rcRight.top , rcRight.right , @@ -552,7 +552,7 @@ void DockingManager::reSizeTo(RECT & rc) if (_vContainer[CONT_LEFT]->isVisible()) { - ::SetWindowPos(_vContainer[CONT_LEFT]->getHSelf(), NULL, + ::SetWindowPos(_vContainer[CONT_LEFT]->getHSelf(), NULL, _dockData.rcRegion[CONT_LEFT].left , _dockData.rcRegion[CONT_LEFT].top , _dockData.rcRegion[CONT_LEFT].right , @@ -644,7 +644,7 @@ void DockingManager::createDockableDlg(tTbData data, int iCont, bool isVisible) // get current container from map iCont = _iContMap[iCont]; } - // previous container is in floating state + // previous container is in floating state else { // no mapping for available store mapping @@ -683,7 +683,7 @@ void DockingManager::setActiveTab(int iCont, int iItem) _vContainer[_iContMap[iCont]]->setActiveTb(iItem); } -void DockingManager::showDockableDlg(HWND hDlg, BOOL view) +void DockingManager::showDockableDlg(HWND hDlg, BOOL view) { for (size_t i = 0, len = _vContainer.size(); i < len; ++i) { @@ -710,7 +710,7 @@ void DockingManager::showDockableDlg(TCHAR* pszName, BOOL view) } } -LRESULT DockingManager::SendNotify(HWND hWnd, UINT message) +LRESULT DockingManager::SendNotify(HWND hWnd, UINT message) { NMHDR nmhdr; nmhdr.code = message; @@ -790,7 +790,7 @@ DockingCont* DockingManager::toggleActiveTb(DockingCont* pContSrc, UINT message, { // set new target pContTgt = _vContainer[iContPrev]; - + // change data normaly TbData.iPrevCont = iContSrc; pContTgt->createToolbar(TbData); @@ -868,7 +868,7 @@ void DockingManager::toggleActiveTb(DockingCont* pContSrc, DockingCont* pContTgt { tTbData TbData = *pContSrc->getDataOfActiveTb(); - toggleTb(pContSrc, pContTgt, TbData); + toggleTb(pContSrc, pContTgt, TbData); } void DockingManager::toggleVisTb(DockingCont* pContSrc, DockingCont* pContTgt) @@ -884,7 +884,7 @@ void DockingManager::toggleVisTb(DockingCont* pContSrc, DockingCont* pContTgt) { // get data one by another tTbData TbData = *vTbData[iTb]; - toggleTb(pContSrc, pContTgt, TbData); + toggleTb(pContSrc, pContTgt, TbData); } pContTgt->setActiveTb(pTbData); } @@ -909,7 +909,7 @@ void DockingManager::toggleTb(DockingCont* pContSrc, DockingCont* pContTgt, tTbD SendNotify(TbData.hClient, MAKELONG(DMN_FLOAT, iContTgt)); // create new toolbar - pContTgt->createToolbar(TbData); + pContTgt->createToolbar(TbData); // remove toolbar from source _vContainer[iContSrc]->removeToolbar(TbData); @@ -982,7 +982,7 @@ int DockingManager::FindEmptyContainer() delete [] pPrevDockList; // search for empty arrays - return iRetCont; + return iRetCont; } diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingSplitter.cpp b/PowerEditor/src/WinControls/DockingWnd/DockingSplitter.cpp index b628e0097..de016cf2e 100644 --- a/PowerEditor/src/WinControls/DockingWnd/DockingSplitter.cpp +++ b/PowerEditor/src/WinControls/DockingWnd/DockingSplitter.cpp @@ -1,16 +1,16 @@ // this file is part of docking functionality for Notepad++ // Copyright (C)2006 Jens Lorenz -// +// // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. -// +// // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -20,7 +20,7 @@ // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. @@ -55,7 +55,7 @@ static LRESULT CALLBACK hookProcMouse(UINT nCode, WPARAM wParam, LPARAM lParam) case WM_NCLBUTTONUP: ::PostMessage(hWndMouse, wParam, 0, 0); return TRUE; - default: + default: break; } } @@ -63,7 +63,7 @@ static LRESULT CALLBACK hookProcMouse(UINT nCode, WPARAM wParam, LPARAM lParam) return ::CallNextHookEx(hookMouse, nCode, wParam, lParam); } -void DockingSplitter::init(HINSTANCE hInst, HWND hWnd, HWND hMessage, UINT flags) +void DockingSplitter::init(HINSTANCE hInst, HWND hWnd, HWND hMessage, UINT flags) { Window::init(hInst, hWnd); _hMessage = hMessage; @@ -112,7 +112,7 @@ void DockingSplitter::init(HINSTANCE hInst, HWND hWnd, HWND hMessage, UINT flags /* create splitter windows and initialize it */ _hSelf = ::CreateWindowEx( 0, wc.lpszClassName, TEXT(""), WS_CHILD | WS_VISIBLE, - CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, _hParent, NULL, _hInst, (LPVOID)this); if (!_hSelf) @@ -127,7 +127,7 @@ LRESULT CALLBACK DockingSplitter::staticWinProc(HWND hwnd, UINT message, WPARAM { DockingSplitter *pDockingSplitter = NULL; switch (message) - { + { case WM_NCCREATE : pDockingSplitter = (DockingSplitter *)(((LPCREATESTRUCT)lParam)->lpCreateParams); pDockingSplitter->_hSelf = hwnd; @@ -186,7 +186,7 @@ LRESULT DockingSplitter::runProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM if (_isLeftButtonDown == TRUE) { POINT pt; - + ::GetCursorPos(&pt); if ((_flags & DMS_HORIZONTAL) && (_ptOldPos.y != pt.y)) diff --git a/PowerEditor/src/WinControls/DockingWnd/Gripper.cpp b/PowerEditor/src/WinControls/DockingWnd/Gripper.cpp index 2c64fec56..84cd39ef1 100644 --- a/PowerEditor/src/WinControls/DockingWnd/Gripper.cpp +++ b/PowerEditor/src/WinControls/DockingWnd/Gripper.cpp @@ -1,16 +1,16 @@ // this file is part of docking functionality for Notepad++ // Copyright (C)2006 Jens Lorenz -// +// // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. -// +// // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -20,12 +20,12 @@ // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. -// +// // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // -// Changed something around drawRectangle() (for details see there) to enhance +// Changed something around drawRectangle() (for details see there) to enhance // speed and consistency of the drag-rectangle - August 2010, Joern Gruel (jg) @@ -66,7 +66,7 @@ static LRESULT CALLBACK hookProcMouse(INT nCode, WPARAM wParam, LPARAM lParam) //::PostMessage(hWndServer, wParam, 0, 0); ::SendMessage(hWndServer, wParam, 0, 0); return TRUE; - default: + default: break; } } @@ -101,7 +101,7 @@ Gripper::Gripper() _ptOld.x = 0; _ptOld.y = 0; _bPtOldValid = FALSE; - + _hTab = NULL; _hTabSource = NULL; _startMovingFromTab = FALSE; @@ -137,7 +137,7 @@ void Gripper::startGrip(DockingCont* pCont, DockingManager* pDockMgr) clz.hIcon = NULL; clz.hCursor = ::LoadCursor(NULL, IDC_ARROW); - clz.hbrBackground = NULL; + clz.hbrBackground = NULL; clz.lpszMenuName = NULL; clz.lpszClassName = MDLG_CLASS_NAME; @@ -171,7 +171,7 @@ LRESULT CALLBACK Gripper::staticWinProc(HWND hwnd, UINT message, WPARAM wParam, { Gripper *pDlgMoving = NULL; switch (message) - { + { case WM_NCCREATE : pDlgMoving = (Gripper *)(((LPCREATESTRUCT)lParam)->lpCreateParams); pDlgMoving->_hSelf = hwnd; @@ -249,7 +249,7 @@ LRESULT Gripper::runProc(UINT message, WPARAM wParam, LPARAM lParam) return ::DefWindowProc(_hSelf, message, wParam, lParam); } - + void Gripper::create() { RECT rc = {0}; @@ -285,7 +285,7 @@ void Gripper::create() // calculate the mouse pt within dialog ::GetCursorPos(&pt); - + // get tab informations initTabInformation(); @@ -333,14 +333,14 @@ void Gripper::onButtonUp() ::GetCursorPos(&pt); getMousePoints(&pt, &ptBuf); - // do nothing, when old point is not valid + // do nothing, when old point is not valid if (_bPtOldValid == FALSE) return; // erase last drawn rectangle drawRectangle(NULL); - // look if current position is within dockable area + // look if current position is within dockable area DockingCont* pDockCont = contHitTest(pt); if (pDockCont == NULL) @@ -368,7 +368,7 @@ void Gripper::onButtonUp() if (_startMovingFromTab == TRUE) { /* when tab is moved */ - if ((!_pCont->isFloating()) || + if ((!_pCont->isFloating()) || ((_pCont->isFloating()) && (::SendMessage(_hTabSource, TCM_GETITEMCOUNT, 0, 0) > 1))) { pContMove = _pDockMgr->toggleActiveTb(_pCont, DMM_FLOAT, TRUE, &rc); @@ -527,28 +527,28 @@ void Gripper::doTabReordering(POINT pt) // Changed behaviour (jg): Now this function handles erasing of drag-rectangles and drawing of // new ones within one drawing step to the desktop. This is against flickering, but also it is // necessary for the Vista Aero style - because in this case the control is given so much to -// the graphics driver, that accesses (especially read accesses) to the desktop window become -// too expensive to access it more than absolutely necessary. Besides, usage of the function -// ::LockWindowUpdate() was added, because with often redrawn windows in the background we had -// inconsistencies while erasing our drag-rectangle (because it could already have been erased +// the graphics driver, that accesses (especially read accesses) to the desktop window become +// too expensive to access it more than absolutely necessary. Besides, usage of the function +// ::LockWindowUpdate() was added, because with often redrawn windows in the background we had +// inconsistencies while erasing our drag-rectangle (because it could already have been erased // on some places). // -// Parameter pPt==NULL says that only erasing is wanted and the drag-rectangle is no more needed, +// Parameter pPt==NULL says that only erasing is wanted and the drag-rectangle is no more needed, // thatswhy this also leads to a call of ::LockWindowUpdate(NULL) to enable drawing by others again. // The previously drawn rectangle is memoried within _rectPrev (and _bPtOldValid says if it already // is valid - did not change this members name because didn't want change too much at once). // // I was too lazy to always draw four rectangles for the four edges of the drag-rectangle - it seems // that drawing an outer rectangle first and then erasing the inner stuff by drawing a second, -// smaller rectangle inside seems to be not slower - wich comes not unawaited, because it is mostly +// smaller rectangle inside seems to be not slower - wich comes not unawaited, because it is mostly // hardware-driven and each single draw has its own fixed costs. -// -// For further solutions I think we should leave this classic way of dragging and better use -// alpha-blending and always move the whole content of the toolbars - so we could leave the +// +// For further solutions I think we should leave this classic way of dragging and better use +// alpha-blending and always move the whole content of the toolbars - so we could leave the // ::LockWindowUpdate() behind us. // // Besides, while debugging into the dragging process please let the ::LockWindowUpdate() out, -// by #undef the USE_LOCKWINDOWUPDATE in gripper.h, because it works for your debugging window +// by #undef the USE_LOCKWINDOWUPDATE in gripper.h, because it works for your debugging window // as well, of course. Or just try by this #define what difference it makes. // void Gripper::drawRectangle(const POINT* pPt) @@ -571,7 +571,7 @@ void Gripper::drawRectangle(const POINT* pPt) _hdc= ::GetDCEx(hWnd, NULL, DCX_WINDOW|DCX_CACHE); #endif } - + // Create a brush with the appropriate bitmap pattern to draw our drag rectangle if (!_hbm) _hbm = ::CreateBitmap(8, 8, 1, 1, DotPattern); @@ -581,24 +581,24 @@ void Gripper::drawRectangle(const POINT* pPt) if (pPt != NULL) { // Determine whether to draw a solid drag rectangle or checkered - // ???(jg) solid or checked ??? - must have been an old comment, I didn't + // ???(jg) solid or checked ??? - must have been an old comment, I didn't // find here this difference, but at least it's a question of drag-rects size // getMovingRect(*pPt, &rcNew); _rcPrev= rcNew; // save the new drawn rcNew - + // note that from here for handling purposes the right and bottom values of the rects // contain width and height - its handsome, but i find it dangerous, but didn't want to - // change that already this time. + // change that already this time. if (_bPtOldValid) { - // okay, there already a drag-rect has been drawn - and its position - // had been saved within the rectangle _rectPrev, wich already had been + // okay, there already a drag-rect has been drawn - and its position + // had been saved within the rectangle _rectPrev, wich already had been // copied into rcOld in the beginning, and a new drag position // is available, too. // If now rcOld and rcNew are the same, just stop further handling to not - // draw the same drag-rectangle twice (this really happens, it should be + // draw the same drag-rectangle twice (this really happens, it should be // better avoided anywhere earlier) // if (rcOld.left==rcNew.left && rcOld.right==rcNew.right && rcOld.top== rcNew.top && rcOld.bottom==rcNew.bottom) @@ -622,13 +622,13 @@ void Gripper::drawRectangle(const POINT* pPt) rcOld.left= rcOld.left - rc.left; rcOld.top = rcOld.top - rc.top; rcNew.left= rcNew.left - rc.left; - rcNew.top = rcNew.top - rc.top; + rcNew.top = rcNew.top - rc.top; HDC hdcMem= ::CreateCompatibleDC(_hdc); HBITMAP hBm= ::CreateCompatibleBitmap(_hdc, rc.right, rc.bottom); hbrushOrig= (HBRUSH)::SelectObject(hdcMem, hBm); - ::SetBrushOrgEx(hdcMem, rc.left%8, rc.top%8, 0); + ::SetBrushOrgEx(hdcMem, rc.left%8, rc.top%8, 0); hbmOrig= (HBITMAP)::SelectObject(hdcMem, _hbrush); ::BitBlt(hdcMem, 0, 0, rc.right, rc.bottom, _hdc, rc.left, rc.top, SRCCOPY); @@ -642,20 +642,20 @@ void Gripper::drawRectangle(const POINT* pPt) ::PatBlt(hdcMem, rcNew.left , rcNew.top , rcNew.right , rcNew.bottom , PATINVERT); ::PatBlt(hdcMem, rcNew.left+3, rcNew.top+3, rcNew.right-6, rcNew.bottom-6, PATINVERT); } - ::BitBlt(_hdc, rc.left, rc.top, rc.right, rc.bottom, hdcMem, 0, 0, SRCCOPY); - + ::BitBlt(_hdc, rc.left, rc.top, rc.right, rc.bottom, hdcMem, 0, 0, SRCCOPY); + SelectObject(hdcMem, hbrushOrig); SelectObject(hdcMem, hbmOrig); DeleteObject(hBm); DeleteDC(hdcMem); - + if (pPt == NULL) { #if defined(USE_LOCKWINDOWUPDATE) ::LockWindowUpdate(NULL); #endif _bPtOldValid= FALSE; - if (_hdc) + if (_hdc) { ::ReleaseDC(0, _hdc); _hdc= NULL; diff --git a/PowerEditor/src/WinControls/FunctionList/functionListPanel.cpp b/PowerEditor/src/WinControls/FunctionList/functionListPanel.cpp index c108db86e..c889bf422 100644 --- a/PowerEditor/src/WinControls/FunctionList/functionListPanel.cpp +++ b/PowerEditor/src/WinControls/FunctionList/functionListPanel.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -96,7 +96,7 @@ size_t FunctionListPanel::getBodyClosePos(size_t begin, const TCHAR *bodyOpenSym // Now we determinate the symbol (open or close) int tmpStart = (*_ppEditView)->searchInTarget(bodyOpenSymbol, lstrlen(bodyOpenSymbol), targetStart, targetEnd); - if (tmpStart != -1 && tmpStart != -2) // open symbol found + if (tmpStart != -1 && tmpStart != -2) // open symbol found { ++cntOpen; } @@ -241,7 +241,7 @@ void FunctionListPanel::reload() setSort(false); vector fi; - + const TCHAR *fn = ((*_ppEditView)->getCurrentBuffer())->getFileName(); LangType langID = ((*_ppEditView)->getCurrentBuffer())->getLangType(); const TCHAR *udln = NULL; @@ -292,7 +292,7 @@ void FunctionListPanel::reload() else { ::SendMessage(_hSearchEdit, WM_SETTEXT, 0, (LPARAM)(previousParams->_searchParameters)._text2Find.c_str()); - + _treeView.restoreFoldingStateFrom(previousParams->_treeState, root); bool isSort = (previousParams->_searchParameters)._doSort; @@ -318,7 +318,7 @@ void FunctionListPanel::init(HINSTANCE hInst, HWND hPere, ScintillaEditView **pp { generic_string funcListXmlPath = (NppParameters::getInstance())->getUserPath(); PathAppend(funcListXmlPath, TEXT("functionList.xml")); - + if (!PathFileExists(funcListXmlPath.c_str())) { generic_string funcListDefaultXmlPath = (NppParameters::getInstance())->getNppPath(); @@ -378,8 +378,8 @@ void FunctionListPanel::notified(LPNMHDR notification) { if (notification->code == TTN_GETDISPINFO) { - LPTOOLTIPTEXT lpttt = (LPTOOLTIPTEXT)notification; - lpttt->hinst = NULL; + LPTOOLTIPTEXT lpttt = (LPTOOLTIPTEXT)notification; + lpttt->hinst = NULL; if (notification->idFrom == IDC_SORTBUTTON_FUNCLIST) { @@ -400,11 +400,11 @@ void FunctionListPanel::notified(LPNMHDR notification) openSelection(treeView); } break; - + case TVN_KEYDOWN: { LPNMTVKEYDOWN ptvkd = (LPNMTVKEYDOWN)notification; - + if (ptvkd->wVKey == VK_RETURN) { if (!openSelection(treeView)) @@ -434,7 +434,7 @@ BOOL FunctionListPanel::setTreeViewImageList(int root_id, int node_id, int leaf_ const int nbBitmaps = 3; // Creation of image list - if ((_hTreeViewImaLst = ImageList_Create(CX_BITMAP, CY_BITMAP, ILC_COLOR32 | ILC_MASK, nbBitmaps, 0)) == NULL) + if ((_hTreeViewImaLst = ImageList_Create(CX_BITMAP, CY_BITMAP, ILC_COLOR32 | ILC_MASK, nbBitmaps, 0)) == NULL) return FALSE; // Add the bmp in the list @@ -516,7 +516,7 @@ static LRESULT CALLBACK funclstToolbarProc(HWND hwnd, UINT message, WPARAM wPara bool FunctionListPanel::shouldSort() { TBBUTTONINFO tbbuttonInfo; - tbbuttonInfo.cbSize = sizeof(TBBUTTONINFO); + tbbuttonInfo.cbSize = sizeof(TBBUTTONINFO); tbbuttonInfo.dwMask = TBIF_STATE; ::SendMessage(_hToolbarMenu, TB_GETBUTTONINFO, IDC_SORTBUTTON_FUNCLIST, (LPARAM)&tbbuttonInfo); @@ -527,7 +527,7 @@ bool FunctionListPanel::shouldSort() void FunctionListPanel::setSort(bool isEnabled) { TBBUTTONINFO tbbuttonInfo; - tbbuttonInfo.cbSize = sizeof(TBBUTTONINFO); + tbbuttonInfo.cbSize = sizeof(TBBUTTONINFO); tbbuttonInfo.dwMask = TBIF_STATE; tbbuttonInfo.fsState = isEnabled ? TBSTATE_ENABLED | TBSTATE_CHECKED : TBSTATE_ENABLED; ::SendMessage(_hToolbarMenu, TB_SETBUTTONINFO, IDC_SORTBUTTON_FUNCLIST, (LPARAM)&tbbuttonInfo); @@ -572,12 +572,12 @@ INT_PTR CALLBACK FunctionListPanel::run_dlgProc(UINT message, WPARAM wParam, LPA int style = WS_CHILD | WS_VISIBLE | CCS_ADJUSTABLE | TBSTYLE_AUTOSIZE | TBSTYLE_FLAT | TBSTYLE_LIST | TBSTYLE_TRANSPARENT | BTNS_AUTOSIZE | BTNS_SEP | TBSTYLE_TOOLTIPS; _hToolbarMenu = CreateWindowEx(0,TOOLBARCLASSNAME,NULL, style, 0,0,0,0,_hSelf,(HMENU)0, _hInst, NULL); - + //::GetWindowLongPtr(_hToolbarMenu, GWLP_WNDPROC); oldFunclstToolbarProc = (WNDPROC)::SetWindowLongPtr(_hToolbarMenu, GWLP_WNDPROC, (LONG_PTR)funclstToolbarProc); TBBUTTON tbButtons[3]; - // Add the bmap image into toolbar's imagelist + // Add the bmap image into toolbar's imagelist TBADDBITMAP addbmp = {_hInst, 0}; addbmp.nID = IDI_FUNCLIST_SORTBUTTON; ::SendMessage(_hToolbarMenu, TB_ADDBITMAP, 1, (LPARAM)&addbmp); @@ -590,7 +590,7 @@ INT_PTR CALLBACK FunctionListPanel::run_dlgProc(UINT message, WPARAM wParam, LPA tbButtons[0].fsState = TBSTATE_ENABLED; tbButtons[0].fsStyle = BTNS_SEP; tbButtons[0].iString = 0; - + tbButtons[1].idCommand = IDC_SORTBUTTON_FUNCLIST; tbButtons[1].iBitmap = 0; tbButtons[1].fsState = TBSTATE_ENABLED; @@ -614,10 +614,10 @@ INT_PTR CALLBACK FunctionListPanel::run_dlgProc(UINT message, WPARAM wParam, LPA NativeLangSpeaker *pNativeSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker(); _sortTipStr = pNativeSpeaker->getAttrNameStr(_sortTipStr.c_str(), FL_FUCTIONLISTROOTNODE, FL_SORTLOCALNODENAME); _reloadTipStr = pNativeSpeaker->getAttrNameStr(_reloadTipStr.c_str(), FL_FUCTIONLISTROOTNODE, FL_RELOADLOCALNODENAME); - - _hSearchEdit = CreateWindowEx(0L, L"Edit", NULL, - WS_CHILD | WS_BORDER | WS_VISIBLE | ES_AUTOVSCROLL, - 2, 2, editWidth, editHeight, + + _hSearchEdit = CreateWindowEx(0L, L"Edit", NULL, + WS_CHILD | WS_BORDER | WS_VISIBLE | ES_AUTOVSCROLL, + 2, 2, editWidth, editHeight, _hToolbarMenu, (HMENU) IDC_SEARCHFIELD_FUNCLIST, _hInst, 0 ); HFONT hf = (HFONT)::GetStockObject(DEFAULT_GUI_FONT); @@ -628,18 +628,18 @@ INT_PTR CALLBACK FunctionListPanel::run_dlgProc(UINT message, WPARAM wParam, LPA _treeViewSearchResult.init(_hInst, _hSelf, IDC_LIST_FUNCLIST_AUX); _treeView.init(_hInst, _hSelf, IDC_LIST_FUNCLIST); setTreeViewImageList(IDI_FUNCLIST_ROOT, IDI_FUNCLIST_NODE, IDI_FUNCLIST_LEAF); - + _treeView.display(); return TRUE; } - + case WM_DESTROY: _treeView.destroy(); _treeViewSearchResult.destroy(); ::DestroyWindow(_hToolbarMenu); break; - case WM_COMMAND : + case WM_COMMAND : { if (HIWORD(wParam) == EN_CHANGE) { @@ -669,7 +669,7 @@ INT_PTR CALLBACK FunctionListPanel::run_dlgProc(UINT message, WPARAM wParam, LPA } } break; - + case WM_NOTIFY: { notified((LPNMHDR)lParam); @@ -684,7 +684,7 @@ INT_PTR CALLBACK FunctionListPanel::run_dlgProc(UINT message, WPARAM wParam, LPA ::GetClientRect(_hToolbarMenu, &toolbarMenuRect); ::MoveWindow(_hToolbarMenu, 0, 0, width, toolbarMenuRect.bottom, TRUE); - + HWND hwnd = _treeView.getHSelf(); if (hwnd) ::MoveWindow(hwnd, 0, toolbarMenuRect.bottom + 2, width, height - toolbarMenuRect.bottom - 2, TRUE); @@ -692,7 +692,7 @@ INT_PTR CALLBACK FunctionListPanel::run_dlgProc(UINT message, WPARAM wParam, LPA HWND hwnd_aux = _treeViewSearchResult.getHSelf(); if (hwnd_aux) ::MoveWindow(hwnd_aux, 0, toolbarMenuRect.bottom + 2, width, height - toolbarMenuRect.bottom - 2, TRUE); - + break; } diff --git a/PowerEditor/src/WinControls/Grid/BabyGrid.cpp b/PowerEditor/src/WinControls/Grid/BabyGrid.cpp index 274c677cf..d334688da 100644 --- a/PowerEditor/src/WinControls/Grid/BabyGrid.cpp +++ b/PowerEditor/src/WinControls/Grid/BabyGrid.cpp @@ -5,7 +5,7 @@ //Printed BABYGRID message reference and tutorial available. //email: mudcat@mis.net for more information. -/* +/* Add WM_MOUSEWHEEL, WM_LBUTTONDBLCLK and WM_RBUTTONUP events Modified by Don HO */ @@ -27,7 +27,7 @@ HFONT hfontbody,hfontheader,hfonttitle; HFONT holdfont; -struct _gridhandlestruct +struct _gridhandlestruct { UINT gridmenu; HWND hlist1; @@ -124,7 +124,7 @@ int CountGrids(); //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// int HomeColumnNthVisible(int SI) - { + { int j,hc,count; count=0; hc=BGHS[SI].homecol; @@ -219,7 +219,7 @@ int GetColOfMouse(int SI,int x) j++; } j--; - + ReturnValue = j; if(BGHS[SI].EXTENDLASTCOLUMN) { @@ -340,7 +340,7 @@ void DisplayTitle(HWND hWnd,int SI,HFONT hfont) HFONT holdfont; GetClientRect(hWnd,&rect); - + gdc=GetDC(hWnd); @@ -368,7 +368,7 @@ void DisplayColumn(HWND hWnd,int SI,int c,int offset,HFONT hfont,HFONT hcolumnhe SetBkMode(gdc,TRANSPARENT); ShowHscroll(hWnd,SI); ShowVscroll(hWnd,SI); - + holdfont = (HFONT)SelectObject(gdc,hcolumnheadingfont); SetTextColor(gdc,BGHS[SI].textcolor); @@ -390,7 +390,7 @@ void DisplayColumn(HWND hWnd,int SI,int c,int offset,HFONT hfont,HFONT hcolumnhe //extend this column RECT trect; GetClientRect(hWnd,&trect); - + rect.right = offset + (trect.right - rect.left); } } @@ -412,7 +412,7 @@ void DisplayColumn(HWND hWnd,int SI,int c,int offset,HFONT hfont,HFONT hcolumnhe } } - + SetCell(&BGcell,r,c); lstrcpy(buffer, TEXT("")); SendMessage(hWnd,BGM_GETCELLDATA,(WPARAM)&BGcell,(LPARAM)buffer); @@ -470,7 +470,7 @@ void DisplayColumn(HWND hWnd,int SI,int c,int offset,HFONT hfont,HFONT hcolumnhe if(c==0) { DrawEdge(gdc,&rect,EDGE_ETCHED,BF_MIDDLE|BF_RECT|BF_ADJUST); - + } else { @@ -1189,7 +1189,7 @@ void DisplayEditString(HWND hWnd,int SI,TCHAR* tstring) ah=BGHS[SI].fontascentheight; SetCaretPos(rt.right-4,rt.top+(int)(rh/2)-ah+2); - + } SelectObject(cdc,holdfont); @@ -1207,7 +1207,7 @@ ATOM RegisterGridClass(HINSTANCE hInstance) for(int j = 0 ; j < MAX_GRIDS ; j++) { BGHS[j].gridmenu = 0; - BGHS[j].hlist1 = NULL; + BGHS[j].hlist1 = NULL; lstrcpy(BGHS[j].protect, TEXT("U")); BGHS[j].rows = 100; BGHS[j].cols = 255; @@ -1220,15 +1220,15 @@ ATOM RegisterGridClass(HINSTANCE hInstance) BGHS[j].EDITABLE = FALSE; BGHS[j].EDITING = FALSE; BGHS[j].AUTOROW = TRUE; - BGHS[j].cursorcol = 1; - BGHS[j].cursorrow = 1; + BGHS[j].cursorcol = 1; + BGHS[j].cursorrow = 1; BGHS[j].columnwidths[0]=50; BGHS[j].ADVANCEROW = TRUE; BGHS[j].DRAWHIGHLIGHT = TRUE; BGHS[j].cursorcolor = RGB(255,255,255); - BGHS[j].protectcolor = RGB(255,255,255); + BGHS[j].protectcolor = RGB(255,255,255); BGHS[j].unprotectcolor = RGB(255,255,255); - BGHS[j].highlightcolor = RGB(0,0,128); + BGHS[j].highlightcolor = RGB(0,0,128); BGHS[j].gridlinecolor = RGB(220,220,220); BGHS[j].highlighttextcolor = RGB(255,255,255); BGHS[j].textcolor = RGB(0,0,0); @@ -1249,7 +1249,7 @@ ATOM RegisterGridClass(HINSTANCE hInstance) { BGHS[j].columnwidths[k]=50; } - + } WNDCLASS wclass; @@ -1262,7 +1262,7 @@ ATOM RegisterGridClass(HINSTANCE hInstance) wclass.hInstance = hInstance; wclass.hIcon = NULL; wclass.hCursor = ::LoadCursor(NULL, IDC_ARROW); - + wclass.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH)); wclass.lpszClassName = TEXT("BABYGRID"); wclass.lpszMenuName = NULL; @@ -1275,7 +1275,7 @@ void SizeGrid(HWND hWnd,int SI) { SendMessage(hWnd,WM_SIZE,SIZE_MAXIMIZED,MAKELPARAM(BGHS[SI].wannabewidth,BGHS[SI].wannabeheight)); SendMessage(hWnd,WM_SIZE,SIZE_MAXIMIZED,MAKELPARAM(BGHS[SI].wannabewidth,BGHS[SI].wannabeheight)); - + } int FindLongestLine(HDC hdc,TCHAR* text,SIZE* size) @@ -1320,7 +1320,7 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) HINSTANCE hInst; int iDataType; static int ASCII; - + SelfIndex=FindGrid((UINT)GetMenu(hWnd)); SelfMenu=BGHS[SelfIndex].gridmenu; @@ -1328,7 +1328,7 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) //update the grid width and height variable { RECT rect; - + GetClientRect(hWnd,&rect); BGHS[SelfIndex].gridwidth = rect.right - rect.left; BGHS[SelfIndex].gridheight = rect.bottom - rect.top; @@ -1337,11 +1337,11 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) ReturnValue = 0; - switch (message) + switch (message) { case WM_COMMAND: - wmId = LOWORD(wParam); - wmEvent = HIWORD(wParam); + wmId = LOWORD(wParam); + wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { @@ -1371,7 +1371,7 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) DisplayColumn(hWnd,SelfIndex,c,offset,BGHS[SelfIndex].hfont,BGHS[SelfIndex].hcolumnheadingfont); offset+=BGHS[SelfIndex].columnwidths[c]; } - + } EndPaint(hWnd, &ps); // @@ -1393,8 +1393,8 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) MessageBeep(0); } break; - case WM_SETTEXT: - { + case WM_SETTEXT: + { int j,linecount; SIZE size; HDC gdc; @@ -1407,13 +1407,13 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { lstrcpy(BGHS[SelfIndex].title,(TCHAR*)lParam); } - + gdc=GetDC(hWnd); //get linecount of title; if(lstrlen(BGHS[SelfIndex].title) > 0) { linecount=1; - for(j=0;j<(int)lstrlen(BGHS[SelfIndex].title);j++) + for(j=0;j<(int)lstrlen(BGHS[SelfIndex].title);j++) { if(BGHS[SelfIndex].title[j]=='\n') { @@ -1433,10 +1433,10 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } ReleaseDC(hWnd,gdc); - + RefreshGrid(hWnd); SizeGrid(hWnd,SelfIndex); - + } break; case BGM_GETROWS: @@ -1565,8 +1565,8 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { lstrcpy(BGHS[SelfIndex].protect, TEXT("P")); } - else - { + else + { lstrcpy(BGHS[SelfIndex].protect, TEXT("U")); } break; @@ -1626,7 +1626,7 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) lstrcat(buffer, TEXT("|")); lstrcat(buffer, (TCHAR*)lParam); FindResult=SendMessage(BGHS[SelfIndex].hlist1,LB_ADDSTRING,0,(LPARAM)buffer); - + if(FindResult==LB_ERR) { MessageBeep(0); @@ -1847,13 +1847,13 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } break; case BGM_SETHEADERROWHEIGHT: - if(wParam >= 0) + if(wParam >= 0) { RECT rect; BGHS[SelfIndex].headerrowheight = wParam; SizeGrid(hWnd,SelfIndex); GetClientRect(hWnd,&rect); - InvalidateRect(hWnd,&rect,FALSE); + InvalidateRect(hWnd,&rect,FALSE); } break; @@ -2056,9 +2056,9 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) else { BGHS[SelfIndex].textcolor = RGB(0,0,0); - } + } - case WM_MOUSEMOVE: + case WM_MOUSEMOVE: int x,y,r,c,t,z; x=LOWORD(lParam); y=HIWORD(lParam); @@ -2146,7 +2146,7 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } BGHS[SelfIndex].columntoresize = c; } - + BGHS[SelfIndex].columntoresizeinitsize = BGHS[SelfIndex].columnwidths[c]; } @@ -2162,10 +2162,10 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) BOOL NRC,NCC; NRC=FALSE; NCC=FALSE; - + if(GetFocus()==hWnd) { - + x=LOWORD(lParam); y=HIWORD(lParam); r=GetRowOfMouse(SelfIndex,y); @@ -2191,11 +2191,11 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { BGHS[SelfIndex].cursorcol = c; } - + } if(NRC){NotifyRowChanged(hWnd,SelfIndex);} if(NCC){NotifyColChanged(hWnd,SelfIndex);} - + DrawCursor(hWnd,SelfIndex); SetCurrentCellStatus(hWnd,SelfIndex); SetHomeRow(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); @@ -2359,7 +2359,7 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) rpp = (gridrect.bottom - (BGHS[SelfIndex].headerrowheight+BGHS[SelfIndex].titleheight))/BGHS[SelfIndex].rowheight; DrawCursor(hWnd,SelfIndex); BGHS[SelfIndex].cursorrow += rpp; - + if(BGHS[SelfIndex].cursorrow > BGHS[SelfIndex].rows) { BGHS[SelfIndex].cursorrow = BGHS[SelfIndex].rows; @@ -2401,7 +2401,7 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) RefreshGrid(hWnd); break; } - if(wParam == VK_DOWN) + if(wParam == VK_DOWN) { if(BGHS[SelfIndex].EDITING) { @@ -2505,7 +2505,7 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) SetCurrentCellStatus(hWnd,SelfIndex); - + if((BGHS[SelfIndex].CURRENTCELLPROTECTED)&&(wParam == 13)) @@ -2555,11 +2555,11 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } } - + //if it's not an arrow key, make an edit box in the active cell rectangle if((BGHS[SelfIndex].EDITABLE)&&(BGHS[SelfIndex].rows > 0)) { - + SetHomeRow(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); DrawCursor(hWnd,SelfIndex); DrawCursor(hWnd,SelfIndex); @@ -2642,7 +2642,7 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) BGHS[SelfIndex].homecol = np; SetScrollPos(hWnd,SB_HORZ,cp,TRUE); RefreshGrid(hWnd); - } + } if((LOWORD(wParam==SB_LINELEFT))||(LOWORD(wParam)==SB_PAGELEFT)) { int cp,np; @@ -2653,7 +2653,7 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) BGHS[SelfIndex].homecol = np; SetScrollPos(hWnd,SB_HORZ,cp,TRUE); RefreshGrid(hWnd); - } + } if(LOWORD(wParam)==SB_THUMBTRACK) { int cp,np; @@ -2664,7 +2664,7 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) SetScrollPos(hWnd,SB_HORZ,cp,TRUE); RefreshGrid(hWnd); } - + break; @@ -2822,7 +2822,7 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) BGHS[SelfIndex].headerrowheight = 20; BGHS[SelfIndex].ROWSNUMBERED = TRUE; BGHS[SelfIndex].COLUMNSNUMBERED = TRUE; - BGHS[SelfIndex].DRAWHIGHLIGHT = TRUE; + BGHS[SelfIndex].DRAWHIGHLIGHT = TRUE; BGHS[SelfIndex].cursorcol = 1; BGHS[SelfIndex].cursorrow = 1; @@ -2839,7 +2839,7 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) break; case WM_SETFOCUS: DrawCursor(hWnd,SelfIndex); - BGHS[SelfIndex].GRIDHASFOCUS = TRUE; + BGHS[SelfIndex].GRIDHASFOCUS = TRUE; DrawCursor(hWnd,SelfIndex); SetCurrentCellStatus(hWnd,SelfIndex); SetHomeRow(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); @@ -2858,7 +2858,7 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) } RefreshGrid(hWnd); break; - case WM_KILLFOCUS: + case WM_KILLFOCUS: DestroyCaret(); DrawCursor(hWnd,SelfIndex); BGHS[SelfIndex].GRIDHASFOCUS = FALSE; @@ -2868,7 +2868,7 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); RefreshGrid(hWnd); - + break; case WM_SETFONT: BGHS[SelfIndex].hfont = (HFONT)wParam; @@ -2968,10 +2968,10 @@ LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case WM_CREATE: lpcs = &cs; lpcs = (LPCREATESTRUCT)lParam; - + hInst = lpcs->hInstance; - + BG_GridIndex = AddGrid((UINT)GetMenu(hWnd)); if(CountGrids()==1) @@ -3139,7 +3139,7 @@ int BinarySearchListBox(HWND lbhWnd,TCHAR* searchtext) return ReturnValue; } - + //is it the tail? SendMessage(lbhWnd,LB_GETTEXT,tail,(LPARAM)tailtext); @@ -3159,9 +3159,9 @@ int BinarySearchListBox(HWND lbhWnd,TCHAR* searchtext) } //is it the finger? - ReturnValue = LB_ERR; + ReturnValue = LB_ERR; FOUND=FALSE; - + while((!FOUND)&&((tail-head)>1)) { @@ -3175,13 +3175,13 @@ int BinarySearchListBox(HWND lbhWnd,TCHAR* searchtext) FOUND=TRUE; ReturnValue = finger; } - + if(p<0) { //change tail to finger head = finger; } - if(p>0) + if(p>0) { //change head to finger tail = finger; @@ -3191,4 +3191,4 @@ int BinarySearchListBox(HWND lbhWnd,TCHAR* searchtext) } return ReturnValue; } - + diff --git a/PowerEditor/src/WinControls/ProjectPanel/TreeView.cpp b/PowerEditor/src/WinControls/ProjectPanel/TreeView.cpp index 7aa100e8b..c5651c32d 100644 --- a/PowerEditor/src/WinControls/ProjectPanel/TreeView.cpp +++ b/PowerEditor/src/WinControls/ProjectPanel/TreeView.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -40,11 +40,11 @@ void TreeView::init(HINSTANCE hInst, HWND parent, int treeViewID) WC_TREEVIEW, TEXT("Tree View"), WS_CHILD | WS_BORDER | WS_HSCROLL | WS_TABSTOP | TVS_LINESATROOT | TVS_HASLINES | - TVS_HASBUTTONS | TVS_SHOWSELALWAYS | TVS_EDITLABELS | TVS_INFOTIP, + TVS_HASBUTTONS | TVS_SHOWSELALWAYS | TVS_EDITLABELS | TVS_INFOTIP, 0, 0, 0, 0, - _hParent, - NULL, - _hInst, + _hParent, + NULL, + _hInst, (LPVOID)0); TreeView_SetItemHeight(_hSelf, CY_ITEMHEIGHT); @@ -60,7 +60,7 @@ void TreeView::destroy() cleanSubEntries(root); ::DestroyWindow(_hSelf); _hSelf = NULL; -} +} LRESULT TreeView::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { @@ -78,8 +78,8 @@ bool TreeView::setItemParam(HTREEITEM Item2Set, const TCHAR *paramStr) tvItem.mask = TVIF_PARAM; SendMessage(_hSelf, TVM_GETITEM, 0,(LPARAM)&tvItem); - - if (!tvItem.lParam) + + if (!tvItem.lParam) tvItem.lParam = (LPARAM)(new generic_string(paramStr)); else { @@ -92,21 +92,21 @@ bool TreeView::setItemParam(HTREEITEM Item2Set, const TCHAR *paramStr) HTREEITEM TreeView::addItem(const TCHAR *itemName, HTREEITEM hParentItem, int iImage, const TCHAR *filePath) { TVITEM tvi; - tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; + tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; // Set the item label. - tvi.pszText = (LPTSTR)itemName; - tvi.cchTextMax = MAX_PATH; + tvi.pszText = (LPTSTR)itemName; + tvi.cchTextMax = MAX_PATH; // Set icon - tvi.iImage = iImage;//isNode?INDEX_CLOSED_NODE:INDEX_LEAF; - tvi.iSelectedImage = iImage;//isNode?INDEX_OPEN_NODE:INDEX_LEAF; + tvi.iImage = iImage;//isNode?INDEX_CLOSED_NODE:INDEX_LEAF; + tvi.iSelectedImage = iImage;//isNode?INDEX_OPEN_NODE:INDEX_LEAF; - // Save the full path of file in the item's application-defined data area. + // Save the full path of file in the item's application-defined data area. tvi.lParam = (filePath == NULL?0:(LPARAM)(new generic_string(filePath))); TVINSERTSTRUCT tvInsertStruct; - tvInsertStruct.item = tvi; + tvInsertStruct.item = tvi; tvInsertStruct.hInsertAfter = (HTREEITEM)TVI_LAST; tvInsertStruct.hParent = hParentItem; @@ -174,7 +174,7 @@ HTREEITEM TreeView::searchSubItemByName(const TCHAR *itemName, HTREEITEM hParent hItem = getChildFrom(hParentItem); else hItem = getRoot(); - + for ( ; hItem != NULL; hItem = getNextSibling(hItem)) { TCHAR textBuffer[MAX_PATH]; @@ -184,7 +184,7 @@ HTREEITEM TreeView::searchSubItemByName(const TCHAR *itemName, HTREEITEM hParent tvItem.cchTextMax = MAX_PATH; tvItem.mask = TVIF_TEXT; SendMessage(_hSelf, TVM_GETITEM, 0,(LPARAM)&tvItem); - + if (lstrcmp(itemName, tvItem.pszText) == 0) { return hItem; @@ -292,7 +292,7 @@ bool TreeView::dropItem() ::ImageList_Destroy(_draggedImageList); ::ReleaseCapture(); ::ShowCursor(true); - + SendMessage(_hSelf,TVM_SELECTITEM,TVGN_CARET,(LPARAM)targetItem); SendMessage(_hSelf,TVM_SELECTITEM,TVGN_DROPHILITE,0); @@ -333,7 +333,7 @@ bool TreeView::isDescendant(HTREEITEM targetItem, HTREEITEM draggedItem) HTREEITEM parent = getParent(targetItem); if (parent == draggedItem) return true; - + return isDescendant(parent, draggedItem); } @@ -509,7 +509,7 @@ bool TreeView::searchLeafRecusivelyAndBuildTree(HTREEITEM tree2Build, const gene tvItem.cchTextMax = MAX_PATH; tvItem.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE; SendMessage(_hSelf, TVM_GETITEM, 0,(LPARAM)&tvItem); - + if (tvItem.iImage == index2Search) { generic_string itemNameUpperCase = stringToUpper(tvItem.pszText); @@ -555,7 +555,7 @@ bool TreeView::retrieveFoldingStateTo(TreeStateNode & treeState2Construct, HTREE tvItem.cchTextMax = MAX_PATH; tvItem.mask = TVIF_TEXT | TVIF_PARAM | TVIF_STATE; SendMessage(_hSelf, TVM_GETITEM, 0,(LPARAM)&tvItem); - + treeState2Construct._label = textBuffer; treeState2Construct._isExpanded = (tvItem.state & TVIS_EXPANDED) != 0; treeState2Construct._isSelected = (tvItem.state & TVIS_SELECTED) != 0; @@ -587,7 +587,7 @@ bool TreeView::restoreFoldingStateFrom(const TreeStateNode & treeState2Compare, tvItem.cchTextMax = MAX_PATH; tvItem.mask = TVIF_TEXT | TVIF_PARAM | TVIF_STATE; SendMessage(_hSelf, TVM_GETITEM, 0,(LPARAM)&tvItem); - + if (treeState2Compare._label != textBuffer) return false; diff --git a/PowerEditor/src/WinControls/SplitterContainer/Splitter.cpp b/PowerEditor/src/WinControls/SplitterContainer/Splitter.cpp index 67aa70b3f..e7bb06a5b 100644 --- a/PowerEditor/src/WinControls/SplitterContainer/Splitter.cpp +++ b/PowerEditor/src/WinControls/SplitterContainer/Splitter.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -38,11 +38,11 @@ bool Splitter::_isVerticalFixedRegistered = false; #define SPLITTER_SIZE 8 -Splitter::Splitter() : Window() +Splitter::Splitter() : Window() { //hInstance = GetModuleHandle(NULL); - _rect.left = 0; // x axis - _rect.top = 0; // y axis + _rect.left = 0; // x axis + _rect.top = 0; // y axis _rect.right = 0; // Width of the spliter. _rect.bottom = 0; // Height of the spliter _isFixed = false; @@ -67,11 +67,11 @@ void Splitter::init( HINSTANCE hInst, HWND hPere, int splitterSize, WNDCLASSEX wcex; DWORD dwExStyle = 0L; DWORD dwStyle = WS_CHILD | WS_VISIBLE; - + _hParent = hPere; _dwFlags = dwFlags; - + if (_dwFlags & SV_FIXED) { //Fixed spliter @@ -81,49 +81,49 @@ void Splitter::init( HINSTANCE hInst, HWND hPere, int splitterSize, { if (iSplitRatio >= 100) { - //cant be 100 % or more + //cant be 100 % or more throw std::runtime_error("Splitter::init : Parameter iSplitRatio shoulds be 0 < ratio < 100"); } } _splitPercent = iSplitRatio; - - wcex.cbSize = sizeof(WNDCLASSEX); + + wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)staticWndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = _hInst; wcex.hIcon = NULL; - + ::GetClientRect(_hParent, &_rect); - + if (_dwFlags & SV_HORIZONTAL) //Horizontal spliter { _rect.top = (LONG)((_rect.bottom * _splitPercent)/100); // y axis determined by the split% of the parent windows height - + _rect.left = 0; // x axis is always 0 - + _rect.bottom = _spiltterSize; // the height of the spliter - + // the width of the splitter remains the same as the width of the parent window. } else //Vertical spliter { - // y axis is 0 always - - _rect.left = (LONG)((_rect.right * _splitPercent)/100); + // y axis is 0 always + + _rect.left = (LONG)((_rect.right * _splitPercent)/100); // x axis determined by split% of the parent windows width. - - _rect.right = _spiltterSize; - // width of the spliter. - + + _rect.right = _spiltterSize; + // width of the spliter. + //height of the spliter remains the same as the height of the parent window } - + if (!_isFixed) { if ((_dwFlags & SV_ENABLERDBLCLK) || (_dwFlags & SV_ENABLELDBLCLK)) @@ -132,7 +132,7 @@ void Splitter::init( HINSTANCE hInst, HWND hPere, int splitterSize, // enable mouse double click messages. } } - + if (_isFixed) { wcex.hCursor = ::LoadCursor(NULL, IDC_ARROW); @@ -157,11 +157,11 @@ void Splitter::init( HINSTANCE hInst, HWND hPere, int splitterSize, wcex.lpszClassName = TEXT("wespliter"); } } - + wcex.hbrBackground = (HBRUSH)(COLOR_3DFACE+1); wcex.lpszMenuName = NULL; wcex.hIconSm = NULL; - + if ((_dwFlags & SV_HORIZONTAL)&&(!_isHorizontalRegistered)) { RegisterClassEx(&wcex); @@ -188,15 +188,15 @@ void Splitter::init( HINSTANCE hInst, HWND hPere, int splitterSize, wcex.lpszClassName, TEXT(""), dwStyle, - _rect.left, - _rect.top, - _rect.right, - _rect.bottom, + _rect.left, + _rect.top, + _rect.right, + _rect.bottom, _hParent, NULL, _hInst, (LPVOID)this); - + if (!_hSelf) { throw std::runtime_error("Splitter::init : CreateWindowEx() function return null"); @@ -264,7 +264,7 @@ LRESULT CALLBACK Splitter::spliterWndProc(UINT uMsg, WPARAM wParam, LPARAM lPara { switch (uMsg) { -/* +/* case WM_LBUTTONDBLCLK: { ::MessageBox(NULL, TEXT(""), TEXT(""), MB_OK); @@ -416,13 +416,13 @@ void Splitter::resizeSpliter(RECT *pRect) rect = *pRect; else ::GetClientRect(_hParent,&rect); - + if (_dwFlags & SV_HORIZONTAL) { - // for a Horizontal spliter the width remains the same + // for a Horizontal spliter the width remains the same // as the width of the parent window, so get the new width of the parent. _rect.right = rect.right; - + //if resizeing should be done proportionately. if (_dwFlags & SV_RESIZEWTHPERCNT) _rect.top = (LONG)((rect.bottom * _splitPercent)/100); @@ -431,24 +431,24 @@ void Splitter::resizeSpliter(RECT *pRect) } else { - // for a (default) Vertical spliter the height remains the same + // for a (default) Vertical spliter the height remains the same // as the height of the parent window, so get the new height of the parent. _rect.bottom = rect.bottom; - + //if resizeing should be done proportionately. - if (_dwFlags & SV_RESIZEWTHPERCNT) + if (_dwFlags & SV_RESIZEWTHPERCNT) { _rect.left = (LONG)((rect.right * _splitPercent)/100); } else // soit la fenetre gauche soit la fenetre droit qui est fixee _rect.left = getSplitterFixPosX(); - + } ::MoveWindow(_hSelf, _rect.left, _rect.top, _rect.right, _rect.bottom, TRUE); ::SendMessage(_hParent, WM_RESIZE_CONTAINER, _rect.left, _rect.top); - + RECT rc; - getClientRect(rc); + getClientRect(rc); _clickZone2BR.right = getClickZone(WIDTH); _clickZone2BR.bottom = getClickZone(HEIGHT); _clickZone2BR.left = rc.right - _clickZone2BR.right; @@ -460,7 +460,7 @@ void Splitter::resizeSpliter(RECT *pRect) redraw(); } -void Splitter::gotoTopLeft() +void Splitter::gotoTopLeft() { if ((_dwFlags & SV_ENABLELDBLCLK) && (!_isFixed) && (_splitPercent > 1)) { @@ -469,34 +469,34 @@ void Splitter::gotoTopLeft() else _rect.left = 1; _splitPercent = 1; - + ::SendMessage(_hParent, WM_RESIZE_CONTAINER, _rect.left, _rect.top); ::MoveWindow(_hSelf, _rect.left, _rect.top, _rect.right, _rect.bottom, TRUE); redraw(); } } -void Splitter::gotoRightBouuom() +void Splitter::gotoRightBouuom() { if ((_dwFlags & SV_ENABLERDBLCLK) && (!_isFixed) && (_splitPercent < 99)) { RECT rt; GetClientRect(_hParent,&rt); - + if (_dwFlags & SV_HORIZONTAL) _rect.top = rt.bottom - _spiltterSize; else _rect.left = rt.right - _spiltterSize; _splitPercent = 99; - + ::SendMessage(_hParent, WM_RESIZE_CONTAINER, _rect.left, _rect.top); ::MoveWindow(_hSelf, _rect.left, _rect.top, _rect.right, _rect.bottom, TRUE); redraw(); } } -void Splitter::drawSplitter() +void Splitter::drawSplitter() { PAINTSTRUCT ps; RECT rc, rcToDraw1, rcToDraw2, TLrc, BRrc; @@ -648,7 +648,7 @@ void Splitter::paintArrow(HDC hdc, const RECT &rect, Arrow arrowDir) } } } -void Splitter::adjustZoneToDraw(RECT & rc2def, ZONE_TYPE whichZone) +void Splitter::adjustZoneToDraw(RECT & rc2def, ZONE_TYPE whichZone) { if (_spiltterSize < 4) return; int x0, y0, x1, y1, w, h; diff --git a/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.cpp b/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.cpp index 2d44ab9e8..1875f1621 100644 --- a/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.cpp +++ b/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -61,7 +61,7 @@ void SplitterContainer::create(Window *pWin0, Window *pWin1, int splitterSize, // hbrBackground must be NULL, // otherwise this window will hide some parts of 2 windows - splitterContainerClass.hbrBackground = NULL; + splitterContainerClass.hbrBackground = NULL; splitterContainerClass.lpszMenuName = NULL; splitterContainerClass.lpszClassName = SPC_CLASS_NAME; @@ -90,7 +90,7 @@ void SplitterContainer::create(Window *pWin0, Window *pWin1, int splitterSize, } } -void SplitterContainer::rotateTo(DIRECTION direction) +void SplitterContainer::rotateTo(DIRECTION direction) { bool doSwitchWindow = false; if (_dwSplitterStyle & SV_VERTICAL) @@ -119,7 +119,7 @@ LRESULT CALLBACK SplitterContainer::staticWinProc(HWND hwnd, UINT message, WPARA { SplitterContainer *pSplitterContainer = NULL; switch (message) - { + { case WM_NCCREATE : pSplitterContainer = (SplitterContainer *)(((LPCREATESTRUCT)lParam)->lpCreateParams); pSplitterContainer->_hSelf = hwnd; @@ -141,10 +141,10 @@ LRESULT SplitterContainer::runProc(UINT message, WPARAM wParam, LPARAM lParam) case WM_CREATE : _splitter.init(_hInst, _hSelf, _splitterSize, _ratio, _dwSplitterStyle); return TRUE; - + case WM_COMMAND : { - switch (LOWORD(wParam)) + switch (LOWORD(wParam)) { case ROTATION_A_GAUCHE: rotateTo(LEFT); @@ -179,7 +179,7 @@ LRESULT SplitterContainer::runProc(UINT message, WPARAM wParam, LPARAM lParam) { if (lParam != 0) { - rc0.bottom = int(lParam); + rc0.bottom = int(lParam); rc1.top = int(lParam) + _y + _splitter.getPhisicalSize(); rc1.bottom = rc1.bottom - rc1.top + _y; @@ -191,14 +191,14 @@ LRESULT SplitterContainer::runProc(UINT message, WPARAM wParam, LPARAM lParam) ::InvalidateRect(_splitter.getHSelf(), NULL, TRUE); return TRUE; } - + case WM_DOPOPUPMENU : { if ((_splitterMode != LEFT_FIX) && (_splitterMode != RIGHT_FIX) ) { POINT p; ::GetCursorPos(&p); - + if (!_hPopupMenu) { POINT p; @@ -207,7 +207,7 @@ LRESULT SplitterContainer::runProc(UINT message, WPARAM wParam, LPARAM lParam) ::InsertMenu(_hPopupMenu, 1, MF_BYPOSITION, ROTATION_A_GAUCHE, TEXT("Rotate to left")); ::InsertMenu(_hPopupMenu, 0, MF_BYPOSITION, ROTATION_A_DROITE, TEXT("Rotate to right")); } - + ::TrackPopupMenu(_hPopupMenu, TPM_LEFTALIGN, p.x, p.y, 0, _hSelf, NULL); } return TRUE; @@ -226,7 +226,7 @@ LRESULT SplitterContainer::runProc(UINT message, WPARAM wParam, LPARAM lParam) } else return MAKELONG(0, DYNAMIC); - + } case WM_GETSPLITTER_Y : @@ -245,20 +245,20 @@ LRESULT SplitterContainer::runProc(UINT message, WPARAM wParam, LPARAM lParam) } case WM_LBUTTONDBLCLK: - { + { POINT pt; ::GetCursorPos(&pt); ::ScreenToClient(_splitter.getHSelf(), &pt); - + Window* targetWindow; - + if(this->isVertical()) targetWindow = pt.x < 0?_pWin0:_pWin1; else targetWindow = pt.y < 0?_pWin0:_pWin1; - + HWND parent = ::GetParent(getHSelf()); - + ::SendMessage(parent, NPPM_INTERNAL_SWITCHVIEWFROMHWND, 0, (LPARAM)targetWindow->getHSelf()); ::SendMessage(parent, WM_COMMAND, IDM_FILE_NEW, 0); return TRUE; diff --git a/PowerEditor/src/WinControls/StaticDialog/StaticDialog.cpp b/PowerEditor/src/WinControls/StaticDialog/StaticDialog.cpp index d76a6d4ad..fc359adc3 100644 --- a/PowerEditor/src/WinControls/StaticDialog/StaticDialog.cpp +++ b/PowerEditor/src/WinControls/StaticDialog/StaticDialog.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -45,7 +45,7 @@ void StaticDialog::goToCenter() } -void StaticDialog::display(bool toShow) const +void StaticDialog::display(bool toShow) const { if (toShow) { // If the user has switched from a dual monitor to a single monitor since we last @@ -96,7 +96,7 @@ HGLOBAL StaticDialog::makeRTLResource(int dialogID, DLGTEMPLATE **ppMyDlgTemplat *ppMyDlgTemplate = (DLGTEMPLATE *)::GlobalLock(hMyDlgTemplate); ::memcpy(*ppMyDlgTemplate, pDlgTemplate, sizeDlg); - + DLGTEMPLATEEX *pMyDlgTemplateEx = (DLGTEMPLATEEX *)*ppMyDlgTemplate; if (pMyDlgTemplateEx->signature == 0xFFFF) pMyDlgTemplateEx->exStyle |= WS_EX_LAYOUTRTL; @@ -131,9 +131,9 @@ void StaticDialog::create(int dialogID, bool isRTL, bool msgDestParent) ::SendMessage(msgDestParent?_hParent:(::GetParent(_hParent)), NPPM_MODELESSDIALOG, MODELESSDIALOGADD, (WPARAM)_hSelf); } -INT_PTR CALLBACK StaticDialog::dlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +INT_PTR CALLBACK StaticDialog::dlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { - switch (message) + switch (message) { case WM_INITDIALOG : { @@ -142,7 +142,7 @@ INT_PTR CALLBACK StaticDialog::dlgProc(HWND hwnd, UINT message, WPARAM wParam, L ::SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)lParam); ::GetWindowRect(hwnd, &(pStaticDlg->_rc)); pStaticDlg->run_dlgProc(message, wParam, lParam); - + return TRUE; } @@ -186,6 +186,6 @@ void StaticDialog::alignWith(HWND handle, HWND handle2Align, PosAlign pos, POINT point.y += rc2.bottom - rc2.top; break; } - + ::ScreenToClient(_hSelf, &point); } diff --git a/PowerEditor/src/WinControls/StatusBar/StatusBar.cpp b/PowerEditor/src/WinControls/StatusBar/StatusBar.cpp index 97054d29b..4f6c63b7b 100644 --- a/PowerEditor/src/WinControls/StatusBar/StatusBar.cpp +++ b/PowerEditor/src/WinControls/StatusBar/StatusBar.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -29,42 +29,62 @@ #include #include #include "StatusBar.h" +#include +#include //#define IDC_STATUSBAR 789 -const int defaultPartWidth = 5; + + +enum +{ + defaultPartWidth = 5, +}; + + + + +StatusBar::~StatusBar() +{ + if (NULL != _hloc) + { + ::LocalUnlock(_hloc); + ::LocalFree(_hloc); + } +} + + +void StatusBar::init(HINSTANCE /*hInst*/, HWND /*hPere*/) +{ + assert(false and "should never be called"); +} + void StatusBar::init(HINSTANCE hInst, HWND hPere, int nbParts) { + assert(nbParts > 0); Window::init(hInst, hPere); InitCommonControls(); - _hSelf = //CreateStatusWindow(WS_CHILD | WS_CLIPSIBLINGS, NULL, _hParent, IDC_STATUSBAR); - ::CreateWindowEx( - 0, - STATUSCLASSNAME, - TEXT(""), - WS_CHILD | SBARS_SIZEGRIP , - 0, 0, 0, 0, - _hParent, - NULL, - _hInst, - 0); + // _hSelf = CreateStatusWindow(WS_CHILD | WS_CLIPSIBLINGS, NULL, _hParent, IDC_STATUSBAR); + _hSelf = ::CreateWindowEx( + 0, + STATUSCLASSNAME, + TEXT(""), + WS_CHILD | SBARS_SIZEGRIP , + 0, 0, 0, 0, + _hParent, nullptr, _hInst, 0); if (!_hSelf) - { throw std::runtime_error("StatusBar::init : CreateWindowEx() function return null"); - } - _nbParts = nbParts; - _partWidthArray = new int[_nbParts]; - // Set the default width - for (int i = 0 ; i < _nbParts ; ++i) - _partWidthArray[i] = defaultPartWidth; + _partWidthArray.clear(); + if (nbParts > 0) + _partWidthArray.resize(nbParts, (int) defaultPartWidth); // Allocate an array for holding the right edge coordinates. - _hloc = ::LocalAlloc(LHND, sizeof(int) * _nbParts); + _hloc = ::LocalAlloc(LHND, sizeof(int) * _partWidthArray.size()); _lpParts = (LPINT)::LocalLock(_hloc); RECT rc; @@ -72,31 +92,78 @@ void StatusBar::init(HINSTANCE hInst, HWND hPere, int nbParts) adjustParts(rc.right); } + +bool StatusBar::setPartWidth(int whichPart, int width) +{ + if ((size_t) whichPart < _partWidthArray.size()) + { + _partWidthArray[whichPart] = width; + return true; + } + assert(false and "invalid status bar index"); + return false; +} + + +void StatusBar::destroy() +{ + ::DestroyWindow(_hSelf); +} + + +void StatusBar::reSizeTo(const RECT& rc) +{ + ::MoveWindow(_hSelf, rc.left, rc.top, rc.right, rc.bottom, TRUE); + adjustParts(rc.right); + redraw(); +} + + +int StatusBar::getHeight() const +{ + return (FALSE != ::IsWindowVisible(_hSelf)) ? Window::getHeight() : 0; +} + + void StatusBar::adjustParts(int clientWidth) { // Calculate the right edge coordinate for each part, and // copy the coordinates to the array. - int nWidth = clientWidth - 20; - for (int i = _nbParts - 1 ; i >= 0 ; i--) - { - _lpParts[i] = nWidth; - nWidth -= _partWidthArray[i]; - } + int nWidth = std::max(clientWidth - 20, 0); + + for (int i = (int)_partWidthArray.size() - 1; i >= 0; i--) + { + _lpParts[i] = nWidth; + nWidth -= _partWidthArray[i]; + } // Tell the status bar to create the window parts. - ::SendMessage(_hSelf, SB_SETPARTS, (WPARAM)_nbParts, (LPARAM)_lpParts); + ::SendMessage(_hSelf, SB_SETPARTS, (WPARAM)_partWidthArray.size(), (LPARAM)_lpParts); } -bool StatusBar::setText(const TCHAR *str, int whichPart) + +bool StatusBar::setText(const TCHAR* str, int whichPart) { - if (whichPart > _nbParts) - return false; - _lastSetText = str; - return (::SendMessage(_hSelf, SB_SETTEXT, whichPart, (LPARAM)_lastSetText.c_str()) == TRUE); + if ((size_t) whichPart < _partWidthArray.size()) + { + if (str != nullptr) + _lastSetText = str; + else + _lastSetText.clear(); + + return (TRUE == ::SendMessage(_hSelf, SB_SETTEXT, whichPart, (LPARAM)_lastSetText.c_str())); + } + assert(false and "invalid status bar index"); + return false; } -bool StatusBar::setOwnerDrawText(const TCHAR *str) + +bool StatusBar::setOwnerDrawText(const TCHAR* str) { - _lastSetText = str; + if (str != nullptr) + _lastSetText = str; + else + _lastSetText.clear(); + return (::SendMessage(_hSelf, SB_SETTEXT, SBT_OWNERDRAW, (LPARAM)_lastSetText.c_str()) == TRUE); } diff --git a/PowerEditor/src/WinControls/StatusBar/StatusBar.h b/PowerEditor/src/WinControls/StatusBar/StatusBar.h index 9f2c2cad5..120bc493e 100644 --- a/PowerEditor/src/WinControls/StatusBar/StatusBar.h +++ b/PowerEditor/src/WinControls/StatusBar/StatusBar.h @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -24,10 +24,7 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - -#ifndef STATUS_BAR_H -#define STATUS_BAR_H +#pragma once #ifndef _WIN32_IE #define _WIN32_IE 0x0600 @@ -35,58 +32,35 @@ #include "Window.h" #include "Common.h" +#include -class StatusBar : public Window + + +class StatusBar final : public Window { -public : - StatusBar() : Window(), _partWidthArray(NULL), _hloc(NULL), _lpParts(NULL) {}; - virtual ~StatusBar(){ - if (_hloc) - { - ::LocalUnlock(_hloc); - ::LocalFree(_hloc); - } - if (_partWidthArray) - delete [] _partWidthArray; - }; +public: + virtual ~StatusBar(); - virtual void init(HINSTANCE hInst, HWND hPere, int nbParts); + void init(HINSTANCE hInst, HWND hPere, int nbParts); - bool setPartWidth(int whichPart, int width) { - if (whichPart >= _nbParts) - return false; + bool setPartWidth(int whichPart, int width); - _partWidthArray[whichPart] = width; - return true; - }; - virtual void destroy() { - ::DestroyWindow(_hSelf); - }; + virtual void destroy() override; + virtual void reSizeTo(const RECT& rc); - virtual void reSizeTo(RECT & rc) { - ::MoveWindow(_hSelf, rc.left, rc.top, rc.right, rc.bottom, TRUE); - adjustParts(rc.right); - redraw(); - }; + int getHeight() const; - - int getHeight() const { - if (!::IsWindowVisible(_hSelf)) - return 0; - return Window::getHeight(); - }; - - bool setText(const TCHAR *str, int whichPart); - bool setOwnerDrawText(const TCHAR *str); + bool setText(const TCHAR* str, int whichPart); + bool setOwnerDrawText(const TCHAR* str); void adjustParts(int clientWidth); -private : - int _nbParts; - int *_partWidthArray; - HLOCAL _hloc; - LPINT _lpParts; +private: + virtual void init(HINSTANCE hInst, HWND hPere) override; + +private: + std::vector _partWidthArray; + HLOCAL _hloc = NULL; + LPINT _lpParts = NULL; generic_string _lastSetText; -}; - -#endif // STATUS_BAR_H +}; \ No newline at end of file diff --git a/PowerEditor/src/WinControls/TabBar/ControlsTab.h b/PowerEditor/src/WinControls/TabBar/ControlsTab.h index 32aaa95bb..702f59441 100644 --- a/PowerEditor/src/WinControls/TabBar/ControlsTab.h +++ b/PowerEditor/src/WinControls/TabBar/ControlsTab.h @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -37,7 +37,8 @@ #include "window.h" #include "Common.h" -struct DlgInfo { +struct DlgInfo +{ Window *_dlg; generic_string _name; generic_string _internalName; @@ -47,22 +48,26 @@ struct DlgInfo { typedef std::vector WindowVector; -class ControlsTab : public TabBar + +class ControlsTab final : public TabBar { public : - ControlsTab() : TabBar(), _pWinVector(NULL), _current(0), _isVertical(false) {}; - ~ControlsTab(){}; + ControlsTab() = default; + virtual ~ControlsTab() = default; - virtual void init(HINSTANCE hInst, HWND hwnd, bool isVertical = false, bool isTraditional = false, bool isMultiLine = false) { + virtual void init(HINSTANCE hInst, HWND hwnd, bool isVertical = false, bool isTraditional = false, bool isMultiLine = false) + { _isVertical = isVertical; TabBar::init(hInst, hwnd, false, isTraditional, isMultiLine); - }; + } + void createTabs(WindowVector & winVector); - void destroy() { + void destroy() + { TabBar::destroy(); - }; - + } + virtual void reSizeTo(RECT & rc); void activateWindowAt(int index); @@ -74,10 +79,10 @@ public : void renameTab(int index, const TCHAR *newName); bool renameTab(const TCHAR *internalName, const TCHAR *newName); -private : - WindowVector *_pWinVector; - int _current; - bool _isVertical; +private: + WindowVector *_pWinVector = nullptr; + int _current = 0; + bool _isVertical = false; }; diff --git a/PowerEditor/src/WinControls/TabBar/TabBar.cpp b/PowerEditor/src/WinControls/TabBar/TabBar.cpp index 372dbf588..110cc0f64 100644 --- a/PowerEditor/src/WinControls/TabBar/TabBar.cpp +++ b/PowerEditor/src/WinControls/TabBar/TabBar.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -59,7 +59,7 @@ void TabBar::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isTraditio int vertical = isVertical?(TCS_VERTICAL | TCS_MULTILINE | TCS_RIGHTJUSTIFY):0; _isTraditional = isTraditional; _isVertical = isVertical; - _isMultiLine = isMultiLine; + _isMultiLine = isMultiLine; INITCOMMONCONTROLSEX icce; icce.dwSize = sizeof(icce); @@ -87,6 +87,7 @@ void TabBar::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isTraditio } } + void TabBar::destroy() { if (_hFont) @@ -105,34 +106,37 @@ void TabBar::destroy() _hSelf = NULL; } + int TabBar::insertAtEnd(const TCHAR *subTabName) { - TCITEM tie; + TCITEM tie; tie.mask = TCIF_TEXT | TCIF_IMAGE; int index = -1; if (_hasImgLst) index = 0; - tie.iImage = index; - tie.pszText = (TCHAR *)subTabName; + tie.iImage = index; + tie.pszText = (TCHAR *)subTabName; return int(::SendMessage(_hSelf, TCM_INSERTITEM, _nbItem++, reinterpret_cast(&tie))); } + void TabBar::getCurrentTitle(TCHAR *title, int titleLen) { TCITEM tci; tci.mask = TCIF_TEXT; - tci.pszText = title; + tci.pszText = title; tci.cchTextMax = titleLen-1; ::SendMessage(_hSelf, TCM_GETITEM, getCurrentTabIndex(), reinterpret_cast(&tci)); } + void TabBar::setFont(TCHAR *fontName, size_t fontSize) { if (_hFont) ::DeleteObject(_hFont); - _hFont = ::CreateFont( fontSize, 0, + _hFont = ::CreateFont( fontSize, 0, (_isVertical) ? 900:0, (_isVertical) ? 900:0, FW_NORMAL, @@ -143,12 +147,12 @@ void TabBar::setFont(TCHAR *fontName, size_t fontSize) ::SendMessage(_hSelf, WM_SETFONT, reinterpret_cast(_hFont), 0); } -void TabBar::activateAt(int index) const + +void TabBar::activateAt(int index) const { - if (getCurrentTabIndex() != index) - { + if (getCurrentTabIndex() != index) ::SendMessage(_hSelf, TCM_SETCURSEL, index, 0); - } + TBHDR nmhdr; nmhdr.hdr.hwndFrom = _hSelf; nmhdr.hdr.code = TCN_SELCHANGE; @@ -156,7 +160,8 @@ void TabBar::activateAt(int index) const nmhdr.tabOrigin = index; } -void TabBar::deletItemAt(size_t index) + +void TabBar::deletItemAt(size_t index) { if ((index == _nbItem-1)) { @@ -167,7 +172,7 @@ void TabBar::deletItemAt(size_t index) RECT itemRect; ::SendMessage(_hSelf, TCM_GETITEMRECT, (WPARAM)index, (LPARAM)&itemRect); if (itemRect.left < 5) //if last visible tab, scroll left once (no more than 5px away should be safe, usually 2px depending on the drawing) - { + { //To scroll the tab control to the left, use the WM_HSCROLL notification //Doesn't really seem to be documented anywhere, but the values do match the message parameters //The up/down control really is just some sort of scrollbar @@ -184,6 +189,14 @@ void TabBar::deletItemAt(size_t index) _nbItem--; } + +void TabBar::setImageList(HIMAGELIST himl) +{ + _hasImgLst = true; + ::SendMessage(_hSelf, TCM_SETIMAGELIST, 0, (LPARAM)himl); +} + + void TabBar::reSizeTo(RECT & rc2Ajust) { RECT RowRect; @@ -195,10 +208,10 @@ void TabBar::reSizeTo(RECT & rc2Ajust) display(rc2Ajust.right > 10); RECT rc = rc2Ajust; Window::reSizeTo(rc); - + // Do our own calculations because TabCtrl_AdjustRect doesn't work - // on vertical or multi-lined tab controls - + // on vertical or multi-lined tab controls + RowCount = TabCtrl_GetRowCount(_hSelf); TabCtrl_GetItemRect(_hSelf, 0, &RowRect); if (_isTraditional) @@ -206,12 +219,12 @@ void TabBar::reSizeTo(RECT & rc2Ajust) TabCtrl_AdjustRect(_hSelf, FALSE, &rc2Ajust); } else if (_isVertical) - { + { TabsLength = RowCount * (RowRect.right - RowRect.left); TabsLength += GetSystemMetrics(SM_CXEDGE); - + rc2Ajust.left += TabsLength; - rc2Ajust.right -= TabsLength; + rc2Ajust.right -= TabsLength; } else { @@ -223,21 +236,22 @@ void TabBar::reSizeTo(RECT & rc2Ajust) } } + void TabBarPlus::destroy() { TabBar::destroy(); - ::DestroyWindow(_tooltips); _tooltips = NULL; } + void TabBarPlus::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isTraditional, bool isMultiLine) { Window::init(hInst, parent); int vertical = isVertical?(TCS_VERTICAL | TCS_MULTILINE | TCS_RIGHTJUSTIFY):0; _isTraditional = isTraditional; _isVertical = isVertical; - _isMultiLine = isMultiLine; + _isMultiLine = isMultiLine; INITCOMMONCONTROLSEX icce; icce.dwSize = sizeof(icce); @@ -289,7 +303,7 @@ void TabBarPlus::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isTrad _hwndArray[_nbCtrl] = _hSelf; _ctrlID = _nbCtrl; } - else + else { int i = 0; bool found = false; @@ -314,25 +328,26 @@ void TabBarPlus::init(HINSTANCE hInst, HWND parent, bool isVertical, bool isTrad LOGFONT LogFont; _hFont = (HFONT)::SendMessage(_hSelf, WM_GETFONT, 0, 0); - + if (_hFont == NULL) _hFont = (HFONT)::GetStockObject(DEFAULT_GUI_FONT); if (_hLargeFont == NULL) - _hLargeFont = (HFONT)::GetStockObject(SYSTEM_FONT); + _hLargeFont = (HFONT)::GetStockObject(SYSTEM_FONT); if (::GetObject(_hFont, sizeof(LOGFONT), &LogFont) != 0) { LogFont.lfEscapement = 900; LogFont.lfOrientation = 900; - _hVerticalFont = CreateFontIndirect(&LogFont); - + _hVerticalFont = CreateFontIndirect(&LogFont); + LogFont.lfWeight = 900; _hVerticalLargeFont = CreateFontIndirect(&LogFont); } } -void TabBarPlus::doOwnerDrawTab() + +void TabBarPlus::doOwnerDrawTab() { ::SendMessage(_hwndArray[0], TCM_SETPADDING, 0, MAKELPARAM(6, 0)); for (int i = 0 ; i < _nbCtrl ; ++i) @@ -355,7 +370,8 @@ void TabBarPlus::doOwnerDrawTab() } } -void TabBarPlus::setColour(COLORREF colour2Set, tabColourIndex i) + +void TabBarPlus::setColour(COLORREF colour2Set, tabColourIndex i) { switch (i) { @@ -380,6 +396,7 @@ void TabBarPlus::setColour(COLORREF colour2Set, tabColourIndex i) doOwnerDrawTab(); } + void TabBarPlus::doVertical() { for (int i = 0 ; i < _nbCtrl ; ++i) @@ -389,6 +406,7 @@ void TabBarPlus::doVertical() } } + void TabBarPlus::doMultiLine() { for (int i = 0 ; i < _nbCtrl ; ++i) @@ -398,6 +416,7 @@ void TabBarPlus::doMultiLine() } } + LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch (Message) @@ -406,17 +425,17 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara case WM_TABSETSTYLE: { LONG_PTR style = ::GetWindowLongPtr(hwnd, GWL_STYLE); - + if (wParam > 0) style |= lParam; else style &= ~lParam; - + _isVertical = ((style & TCS_VERTICAL) != 0); _isMultiLine = ((style & TCS_MULTILINE) != 0); - + ::SetWindowLongPtr(hwnd, GWL_STYLE, style); - ::InvalidateRect(hwnd, NULL, TRUE); + ::InvalidateRect(hwnd, NULL, TRUE); return TRUE; } @@ -450,7 +469,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara point.x = LOWORD(lParam); point.y = HIWORD(lParam); ::ClientToScreen(hwnd, &point); - if(::DragDetect(hwnd, point)) + if(::DragDetect(hwnd, point)) { // Yes, we're beginning to drag, so capture the mouse... _isDragging = true; @@ -468,17 +487,19 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara return TRUE; } + case WM_RBUTTONDOWN : //rightclick selects tab aswell { ::CallWindowProc(_tabBarDefaultProc, hwnd, WM_LBUTTONDOWN, wParam, lParam); return TRUE; } -//#define NPPM_INTERNAL_ISDRAGGING 40926 + + //#define NPPM_INTERNAL_ISDRAGGING 40926 case WM_MOUSEMOVE : { if (_isDragging) { - POINT p; + POINT p; p.x = LOWORD(lParam); p.y = HIWORD(lParam); exchangeItemData(p); @@ -489,7 +510,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara draggingCursor(_draggingPoint); return TRUE; } - + if (_drawTabCloseButton) { int xPos = LOWORD(lParam); @@ -510,7 +531,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara SetRectEmpty(&_currentHoverTabRect); _isCloseHover = false; } - + if (_currentHoverTabItem != _currentHoverTabItemOld || _isCloseHover != _isCloseHoverOld) { if (_isCloseHoverOld && (_currentHoverTabItem != _currentHoverTabItemOld || !_isCloseHover)) @@ -532,12 +553,14 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara } case WM_MOUSELEAVE: + { if (_isCloseHover) InvalidateRect(hwnd, &_currentHoverTabRect, FALSE); _currentHoverTabItem = -1; SetRectEmpty(&_currentHoverTabRect); _isCloseHover = false; break; + } case WM_LBUTTONUP : { @@ -560,7 +583,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara nmhdr.tabOrigin = currentTabOn; ::SendMessage(_hParent, WM_NOTIFY, 0, reinterpret_cast(&nmhdr)); - return TRUE; + return TRUE; } if (_drawTabCloseButton) @@ -575,7 +598,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara ::SendMessage(_hParent, WM_NOTIFY, 0, reinterpret_cast(&nmhdr)); - _whichCloseClickDown = -1; + _whichCloseClickDown = -1; return TRUE; } _whichCloseClickDown = -1; @@ -622,7 +645,7 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara return TRUE; } - case WM_LBUTTONDBLCLK : + case WM_LBUTTONDBLCLK: { if (_isDbClk2Close) { @@ -640,13 +663,15 @@ LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPara return TRUE; } } + return ::CallWindowProc(_tabBarDefaultProc, hwnd, Message, wParam, lParam); } + void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct) { RECT rect = pDrawItemStruct->rcItem; - + int nTab = pDrawItemStruct->itemID; if (nTab < 0) { @@ -658,15 +683,15 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct) TCHAR label[MAX_PATH]; TCITEM tci; tci.mask = TCIF_TEXT|TCIF_IMAGE; - tci.pszText = label; + tci.pszText = label; tci.cchTextMax = MAX_PATH-1; - if (!::SendMessage(_hSelf, TCM_GETITEM, nTab, reinterpret_cast(&tci))) + if (!::SendMessage(_hSelf, TCM_GETITEM, nTab, reinterpret_cast(&tci))) { ::MessageBox(NULL, TEXT("! TCM_GETITEM"), TEXT(""), MB_OK); } HDC hDC = pDrawItemStruct->hDC; - + int nSavedDC = ::SaveDC(hDC); ::SetBkMode(hDC, TRANSPARENT); @@ -698,7 +723,7 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct) hBrush = ::CreateSolidBrush(_activeTopBarUnfocusedColour); // #FAD296 ::FillRect(hDC, &barRect, hBrush); - ::DeleteObject((HGDIOBJ)hBrush); + ::DeleteObject((HGDIOBJ)hBrush); } } else @@ -726,12 +751,12 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct) else { if (_isVertical) - closeButtonRect.left += 2; + closeButtonRect.left += 2; else closeButtonRect.left += NppParameters::getInstance()->_dpiManager.scaleX(2); } - + // 3 status for each inactive tab and selected tab close item : // normal / hover / pushed int idCloseImg; @@ -749,7 +774,7 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct) HBITMAP hBmp = ::LoadBitmap(_hInst, MAKEINTRESOURCE(idCloseImg)); BITMAP bmp; ::GetObject(hBmp, sizeof(bmp), &bmp); - + int bmDpiDynamicalWidth = NppParameters::getInstance()->_dpiManager.scaleX(bmp.bmWidth); int bmDpiDynamicalHeight = NppParameters::getInstance()->_dpiManager.scaleY(bmp.bmHeight); @@ -781,7 +806,7 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct) ImageList_GetImageInfo(hImgLst, tci.iImage, &info); RECT & imageRect = info.rcImage; - + if (_isVertical) xPos = (rect.left + (rect.right - rect.left) / 2 + NppParameters::getInstance()->_dpiManager.scaleX(2)) - (imageRect.right - imageRect.left) / 2; else @@ -791,7 +816,7 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct) if (_isVertical) { - rect.bottom -= imageRect.bottom - imageRect.top; + rect.bottom -= imageRect.bottom - imageRect.top; ImageList_Draw(hImgLst, tci.iImage, hDC, xPos, rect.bottom - marge, isSelected?ILD_TRANSPARENT:ILD_SELECTED); rect.bottom += marge; } @@ -850,10 +875,10 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct) if (!_isVertical) Flags |= DT_CENTER; } - - // the following uses pixel values the fix alignments issues with DrawText + + // the following uses pixel values the fix alignments issues with DrawText // and font's that are rotated 90 degrees - if (isSelected) + if (isSelected) { //COLORREF selectedColor = RGB(0, 0, 255); ::SetTextColor(hDC, _activeTextColour); @@ -874,8 +899,8 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct) Flags |= DT_VCENTER; } - } - else + } + else { ::SetTextColor(hDC, _inactiveTextColour); if (_isVertical) @@ -888,7 +913,7 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct) { rect.left += (_drawTabCloseButton)?spaceUnit:0; } - + Flags |= DT_BOTTOM; } ::DrawText(hDC, decodedLabel, lstrlen(decodedLabel), &rect, Flags); @@ -980,9 +1005,10 @@ void TabBarPlus::exchangeItemData(POINT point) //::SetCursor(::LoadCursor(_hInst, MAKEINTRESOURCE(IDC_DRAG_TAB))); _isDraggingInside = false; } - + } + CloseButtonZone::CloseButtonZone() { _width = NppParameters::getInstance()->_dpiManager.scaleX(11); @@ -991,7 +1017,8 @@ CloseButtonZone::CloseButtonZone() _fromRight = NppParameters::getInstance()->_dpiManager.scaleX(3); } -bool CloseButtonZone::isHit(int x, int y, const RECT & testZone) const + +bool CloseButtonZone::isHit(int x, int y, const RECT & testZone) const { if (((x + _width + _fromRight) < testZone.right) || (x > (testZone.right - _fromRight))) return false; @@ -1002,7 +1029,8 @@ bool CloseButtonZone::isHit(int x, int y, const RECT & testZone) const return true; } -RECT CloseButtonZone::getButtonRectFrom(const RECT & tabItemRect) const + +RECT CloseButtonZone::getButtonRectFrom(const RECT & tabItemRect) const { RECT rect; rect.right = tabItemRect.right - _fromRight; diff --git a/PowerEditor/src/WinControls/TabBar/TabBar.h b/PowerEditor/src/WinControls/TabBar/TabBar.h index 68c1f5623..c790d4861 100644 --- a/PowerEditor/src/WinControls/TabBar/TabBar.h +++ b/PowerEditor/src/WinControls/TabBar/TabBar.h @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -60,11 +60,14 @@ const TCHAR TABBAR_ACTIVEUNFOCUSEDINDCATOR[64] = TEXT("Active tab unfocused indi const TCHAR TABBAR_ACTIVETEXT[64] = TEXT("Active tab text"); const TCHAR TABBAR_INACTIVETEXT[64] = TEXT("Inactive tabs"); -struct TBHDR { +struct TBHDR +{ NMHDR hdr; int tabOrigin; }; + + class TabBar : public Window { public: @@ -92,21 +95,18 @@ public: _nbItem = 0; }; - void setImageList(HIMAGELIST himl) { - _hasImgLst = true; - ::SendMessage(_hSelf, TCM_SETIMAGELIST, 0, (LPARAM)himl); - }; - + void setImageList(HIMAGELIST himl); + int nbItem() const { return _nbItem; - }; + } void setFont(TCHAR *fontName, size_t fontSize); - + void setVertical(bool b) { _isVertical = b; }; - + void setMultiLine(bool b) { _isMultiLine = b; }; @@ -125,14 +125,15 @@ protected: bool _isVertical; bool _isMultiLine; - + long getRowCount() const { return long(::SendMessage(_hSelf, TCM_GETROWCOUNT, 0, 0)); - }; + } }; -struct CloseButtonZone { +struct CloseButtonZone +{ CloseButtonZone(); bool isHit(int x, int y, const RECT & testZone) const; RECT getButtonRectFrom(const RECT & tabItemRect) const; @@ -143,10 +144,11 @@ struct CloseButtonZone { int _fromRight; // distance from right in pixzl }; + + class TabBarPlus : public TabBar { public : - TabBarPlus() : TabBar(), _isDragging(false), _tabBarDefaultProc(NULL), _currentHoverTabItem(-1),\ _isCloseHover(false), _whichCloseClickDown(-1), _lmbdHit(false), _tooltips(NULL) {}; enum tabColourIndex { @@ -196,29 +198,31 @@ public : static void setDrawTopBar(bool b) { _drawTopBar = b; doOwnerDrawTab(); - }; + } + static void setDrawInactiveTab(bool b) { _drawInactiveTab = b; doOwnerDrawTab(); - }; + } + static void setDrawTabCloseButton(bool b) { _drawTabCloseButton = b; doOwnerDrawTab(); - }; + } static void setDbClk2Close(bool b) { _isDbClk2Close = b; - }; + } static void setVertical(bool b) { _isCtrlVertical = b; doVertical(); - }; + } static void setMultiLine(bool b) { _isCtrlMultiLine = b; doMultiLine(); - }; + } static void setColour(COLORREF colour2Set, tabColourIndex i); @@ -270,23 +274,26 @@ protected: void drawItem(DRAWITEMSTRUCT *pDrawItemStruct); void draggingCursor(POINT screenPoint); - int getTabIndexAt(const POINT & p) { + int getTabIndexAt(const POINT & p) + { return getTabIndexAt(p.x, p.y); - }; + } - int getTabIndexAt(int x, int y) { + int getTabIndexAt(int x, int y) + { TCHITTESTINFO hitInfo; hitInfo.pt.x = x; hitInfo.pt.y = y; return ::SendMessage(_hSelf, TCM_HITTEST, 0, (LPARAM)&hitInfo); - }; + } - bool isPointInParentZone(POINT screenPoint) const { + bool isPointInParentZone(POINT screenPoint) const + { RECT parentZone; ::GetWindowRect(_hParent, &parentZone); return (((screenPoint.x >= parentZone.left) && (screenPoint.x <= parentZone.right)) && (screenPoint.y >= parentZone.top) && (screenPoint.y <= parentZone.bottom)); - }; + } }; #endif // TAB_BAR_H diff --git a/PowerEditor/src/WinControls/TreeView/TreeView.cpp b/PowerEditor/src/WinControls/TreeView/TreeView.cpp index e2c524e08..158562998 100644 --- a/PowerEditor/src/WinControls/TreeView/TreeView.cpp +++ b/PowerEditor/src/WinControls/TreeView/TreeView.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -43,26 +43,26 @@ HTREEITEM TreeView::insertTo(HTREEITEM parent, TCHAR *itemStr, int imgIndex) void TreeView::init(HINSTANCE hInst, HWND pere) { Window::init(hInst, pere); - InitCommonControls(); + InitCommonControls(); HTREEITEM Parent; // Tree item handle HTREEITEM Before; // ....... - HTREEITEM Root; - - // Get the dimensions of the parent window's client area, and create - // the tree-view control. - + HTREEITEM Root; + + // Get the dimensions of the parent window's client area, and create + // the tree-view control. + _hSelf = CreateWindowEx(0, WC_TREEVIEW, TEXT("Tree View"), - WS_VISIBLE | WS_CHILD | WS_BORDER | - TVS_HASLINES | TVS_HASBUTTONS | TVS_SHOWSELALWAYS , + WS_VISIBLE | WS_CHILD | WS_BORDER | + TVS_HASLINES | TVS_HASBUTTONS | TVS_SHOWSELALWAYS , 0, 0, 0, 0, - _hParent, - NULL, - _hInst, - NULL); - + _hParent, + NULL, + _hInst, + NULL); + if (!_hSelf) throw int(56); @@ -78,7 +78,7 @@ void TreeView::init(HINSTANCE hInst, HWND pere) Parent = insertTo(Before, TEXT("Macro"), 0); insertTo(Parent, TEXT("ChangeCode"), 0); insertTo(Parent, TEXT("CipherData"), 0); - + insertTo(NULL, TEXT("Bla bla bla bla..."), 0); //display(); } \ No newline at end of file diff --git a/PowerEditor/src/WinControls/Window.h b/PowerEditor/src/WinControls/Window.h index 3e760aa5a..42b8dae61 100644 --- a/PowerEditor/src/WinControls/Window.h +++ b/PowerEditor/src/WinControls/Window.h @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -24,18 +24,16 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - -#ifndef WINDOW_CONTROL_H -#define WINDOW_CONTROL_H - +#pragma once #include + + + class Window { public: - Window(): _hInst(NULL), _hParent(NULL), _hSelf(NULL){}; - virtual ~Window() {}; + virtual ~Window() = default; virtual void init(HINSTANCE hInst, HWND parent) { @@ -45,77 +43,88 @@ public: virtual void destroy() = 0; - virtual void display(bool toShow = true) const { - ::ShowWindow(_hSelf, toShow?SW_SHOW:SW_HIDE); - }; - + virtual void display(bool toShow = true) const + { + ::ShowWindow(_hSelf, toShow ? SW_SHOW : SW_HIDE); + } + + virtual void reSizeTo(RECT & rc) // should NEVER be const !!! - { + { ::MoveWindow(_hSelf, rc.left, rc.top, rc.right, rc.bottom, TRUE); redraw(); - }; + } - virtual void reSizeToWH(RECT & rc) // should NEVER be const !!! - { + + virtual void reSizeToWH(RECT& rc) // should NEVER be const !!! + { ::MoveWindow(_hSelf, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE); redraw(); - }; + } - virtual void redraw(bool forceUpdate = false) const { - ::InvalidateRect(_hSelf, NULL, TRUE); + + virtual void redraw(bool forceUpdate = false) const + { + ::InvalidateRect(_hSelf, nullptr, TRUE); if (forceUpdate) ::UpdateWindow(_hSelf); - }; - - virtual void getClientRect(RECT & rc) const { + } + + + virtual void getClientRect(RECT & rc) const + { ::GetClientRect(_hSelf, &rc); - }; + } - virtual void getWindowRect(RECT & rc) const { + virtual void getWindowRect(RECT & rc) const + { ::GetWindowRect(_hSelf, &rc); - }; + } - virtual int getWidth() const { + virtual int getWidth() const + { RECT rc; ::GetClientRect(_hSelf, &rc); return (rc.right - rc.left); - }; + } - virtual int getHeight() const { + virtual int getHeight() const + { RECT rc; ::GetClientRect(_hSelf, &rc); if (::IsWindowVisible(_hSelf) == TRUE) return (rc.bottom - rc.top); return 0; - }; + } - virtual bool isVisible() const { + virtual bool isVisible() const + { return (::IsWindowVisible(_hSelf)?true:false); - }; + } - HWND getHSelf() const { + HWND getHSelf() const + { //assert(_hSelf != 0); return _hSelf; - }; + } HWND getHParent() const { return _hParent; - }; + } void getFocus() const { ::SetFocus(_hSelf); - }; + } - HINSTANCE getHinst() const { + HINSTANCE getHinst() const + { //assert(_hInst != 0); return _hInst; - }; + } + + protected: - HINSTANCE _hInst; - HWND _hParent; - HWND _hSelf; -}; - -#endif //WINDOW_CONTROL_H - - + HINSTANCE _hInst = NULL; + HWND _hParent = NULL; + HWND _hSelf = NULL; +}; \ No newline at end of file diff --git a/PowerEditor/src/WinControls/WindowsDlg/SizeableDlg.cpp b/PowerEditor/src/WinControls/WindowsDlg/SizeableDlg.cpp index 44a9cc8da..130f9dc24 100644 --- a/PowerEditor/src/WinControls/WindowsDlg/SizeableDlg.cpp +++ b/PowerEditor/src/WinControls/WindowsDlg/SizeableDlg.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -61,25 +61,30 @@ LRESULT SizeableDlg::onWinMgr(WPARAM, LPARAM) INT_PTR CALLBACK SizeableDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) { - switch (message) + switch (message) { - case WM_INITDIALOG : - return onInitDialog(); - - case WM_GETMINMAXINFO : - onGetMinMaxInfo((MINMAXINFO*)lParam); - return TRUE; - - case WM_SIZE: - onSize(wParam, LOWORD(lParam), HIWORD(lParam)); - return TRUE; - - default: - if (message == WM_WINMGR) + case WM_INITDIALOG: { - return (BOOL)onWinMgr(wParam, lParam); + return onInitDialog(); + } + case WM_GETMINMAXINFO: + { + onGetMinMaxInfo((MINMAXINFO*)lParam); + return TRUE; + } + case WM_SIZE: + { + onSize(wParam, LOWORD(lParam), HIWORD(lParam)); + return TRUE; + } + + default: + { + if (message == WM_WINMGR) + return (BOOL)onWinMgr(wParam, lParam); + + break; } - break; } return FALSE; } \ No newline at end of file diff --git a/PowerEditor/src/WinControls/WindowsDlg/WinMgr.cpp b/PowerEditor/src/WinControls/WindowsDlg/WinMgr.cpp index d4f378136..662a7c7d8 100644 --- a/PowerEditor/src/WinControls/WindowsDlg/WinMgr.cpp +++ b/PowerEditor/src/WinControls/WindowsDlg/WinMgr.cpp @@ -5,19 +5,19 @@ // Compiles with Visual C++ 6.0. Runs on Win 98 and probably Win 2000 too. // Set tabsize = 3 in your editor. // -// Theo - Heavily modified to remove MFC dependencies. +// Theo - Heavily modified to remove MFC dependencies. // Replaced CWnd*/HWND, CRect/RECT, CSize/SIZE, CPoint/POINT #include "WinMgr.h" // Theo - Style Helpers -inline static DWORD GetStyle(HWND hWnd) { - return (DWORD)GetWindowLongPtr(hWnd, GWL_STYLE); +inline static DWORD GetStyle(HWND hWnd) { + return (DWORD)GetWindowLongPtr(hWnd, GWL_STYLE); } -inline static DWORD GetExStyle(HWND hWnd) { - return (DWORD)GetWindowLongPtr(hWnd, GWL_EXSTYLE); +inline static DWORD GetExStyle(HWND hWnd) { + return (DWORD)GetWindowLongPtr(hWnd, GWL_EXSTYLE); } const UINT WM_WINMGR = RegisterWindowMessage(TEXT("WM_WINMGR")); @@ -147,7 +147,7 @@ CWinMgr::CalcGroup(WINRECT* pGroup, HWND hWnd) h = min(abs(h), RectHeight(rcTotal)/2); ::InflateRect(&rcTotal, -w, -h); } - + BOOL bRow = pGroup->IsRowGroup(); // Is this a row group? // Running height or width: start with total @@ -223,7 +223,7 @@ CWinMgr::AdjustSize(WINRECT* wrc, BOOL bRow, // int hwCurrent = wrc->GetHeightOrWidth(bRow); // current size int hwExtra = hw - hwCurrent; // amount extra - hwExtra = min(max(hwExtra, 0), hwRemaining); // truncate + hwExtra = min(max(hwExtra, 0), hwRemaining); // truncate hw = hwCurrent + hwExtra; // new height-or-width wrc->SetHeightOrWidth(hw, bRow); // set... hwRemaining -= hwExtra; // and adjust remaining @@ -274,7 +274,7 @@ CWinMgr::OnGetSizeInfo(SIZEINFO& szi, WINRECT* wrc, HWND hWnd) { szi.szMin = SIZEZERO; // default min size = zero szi.szMax = SIZEMAX; // default max size = infinite - szi.szDesired = RectToSize(wrc->GetRect()); // default desired size = current + szi.szDesired = RectToSize(wrc->GetRect()); // default desired size = current if (wrc->IsGroup()) { // For groups, calculate min, max, desired size as aggregate of children @@ -304,7 +304,7 @@ CWinMgr::OnGetSizeInfo(SIZEINFO& szi, WINRECT* wrc, HWND hWnd) } } - // Add margins. + // Add margins. int w2,h2; wrc->GetMargins(w2,h2); // get margins w2<<=1; h2<<=1; // double @@ -396,7 +396,7 @@ BOOL CWinMgr::SendGetSizeInfo(SIZEINFO& szi, HWND hWnd, UINT nID) szi = nmw.sizeinfo; // copy back to caller's struct return TRUE; } - + ////////////////// // Get min/max info. // @@ -410,7 +410,7 @@ CWinMgr::GetMinMaxInfo(HWND hWnd, MINMAXINFO* lpMMI) } ////////////////// -// Get min/max info. +// Get min/max info. // void CWinMgr::GetMinMaxInfo(HWND hWnd, SIZEINFO& szi) { diff --git a/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.cpp b/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.cpp index 96ea4a797..3319de594 100644 --- a/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.cpp +++ b/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -46,11 +46,11 @@ using namespace std; static const TCHAR *readonlyString = TEXT(" [Read Only]"); const UINT WDN_NOTIFY = RegisterWindowMessage(TEXT("WDN_NOTIFY")); -inline static DWORD GetStyle(HWND hWnd) { - return (DWORD)GetWindowLongPtr(hWnd, GWL_STYLE); +inline static DWORD GetStyle(HWND hWnd) { + return (DWORD)GetWindowLongPtr(hWnd, GWL_STYLE); } -inline static DWORD GetExStyle(HWND hWnd) { - return (DWORD)GetWindowLongPtr(hWnd, GWL_EXSTYLE); +inline static DWORD GetExStyle(HWND hWnd) { + return (DWORD)GetWindowLongPtr(hWnd, GWL_EXSTYLE); } inline static BOOL ModifyStyle(HWND hWnd, DWORD dwRemove, DWORD dwAdd) { @@ -97,21 +97,21 @@ struct NumericStringEquivalence break; } if (_istdigit(*str1) && _istdigit(*str2)) - { + { lcmp = generic_strtol(str1, &p1, 10) - generic_strtol(str2, &p2, 10); if ( lcmp == 0 ) lcmp = (p2 - str2) - (p1 - str1); if ( lcmp != 0 ) - break; + break; str1 = p1, str2 = p2; } - else + else { if (_istascii(*str1) && _istupper(*str1)) c1 = _totlower(*str1); else c1 = *str1; - if (_istascii(*str2) && _istupper(*str2)) + if (_istascii(*str2) && _istupper(*str2)) c2 = _totlower(*str2); else c2 = *str2; @@ -131,7 +131,7 @@ struct BufferEquivalent DocTabView *_pTab; int _iColumn; bool _reverse; - BufferEquivalent(DocTabView *pTab, int iColumn, bool reverse) + BufferEquivalent(DocTabView *pTab, int iColumn, bool reverse) : _pTab(pTab), _iColumn(iColumn), _reverse(reverse) {} @@ -143,7 +143,7 @@ struct BufferEquivalent } bool compare(int i1, int i2) const - { + { BufferID bid1 = _pTab->getBufferByIndex(i1); BufferID bid2 = _pTab->getBufferByIndex(i2); Buffer * b1 = MainFileManager->getBufferByID(bid1); @@ -164,7 +164,7 @@ struct BufferEquivalent { int t1 = (int)b1->getLangType(); int t2 = (int)b2->getLangType(); - return (t1 < t2); // yeah should be the name + return (t1 < t2); // yeah should be the name } return false; } @@ -220,51 +220,58 @@ void WindowsDlg::init(HINSTANCE hInst, HWND parent) INT_PTR CALLBACK WindowsDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) { - switch (message) + switch (message) { case WM_INITDIALOG : { changeDlgLang(); - return MyBaseClass::run_dlgProc(message, wParam, lParam); + return MyBaseClass::run_dlgProc(message, wParam, lParam); } - case WM_COMMAND : + + case WM_COMMAND : { switch (wParam) { - case IDOK : - activateCurrent(); - return TRUE; - - case IDCANCEL : - ::GetWindowRect(_hSelf, &_lastKnownLocation); - EndDialog(_hSelf, IDCANCEL); - return TRUE; - - case IDC_WINDOWS_SAVE: - doSave(); - return TRUE; - - case IDC_WINDOWS_CLOSE: - doClose(); - return TRUE; - - case IDC_WINDOWS_SORT: - doSortToTabs(); - _isSorted = false; - updateButtonState(); - break; - - default : - break; + case IDOK: + { + activateCurrent(); + return TRUE; + } + case IDCANCEL: + { + ::GetWindowRect(_hSelf, &_lastKnownLocation); + EndDialog(_hSelf, IDCANCEL); + return TRUE; + } + case IDC_WINDOWS_SAVE: + { + doSave(); + return TRUE; + } + case IDC_WINDOWS_CLOSE: + { + doClose(); + return TRUE; + } + case IDC_WINDOWS_SORT: + { + doSortToTabs(); + _isSorted = false; + updateButtonState(); + break; + } } + break; } - case WM_DESTROY : + case WM_DESTROY: + { //destroy(); return TRUE; + } case WM_NOTIFY : - { + { if (wParam == IDC_WINDOWS_LIST) { NMHDR* pNMHDR = (NMHDR*)lParam; @@ -272,7 +279,7 @@ INT_PTR CALLBACK WindowsDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lPa { NMLVDISPINFO *pLvdi = (NMLVDISPINFO *)pNMHDR; //if(pLvdi->item.mask & LVIF_IMAGE) - // ; + // ; if(pLvdi->item.mask & LVIF_TEXT) { pLvdi->item.pszText[0] = 0; @@ -388,12 +395,13 @@ INT_PTR CALLBACK WindowsDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lPa return TRUE; } } + break; } - break; } - return MyBaseClass::run_dlgProc(message, wParam, lParam); + return MyBaseClass::run_dlgProc(message, wParam, lParam); } + void WindowsDlg::updateButtonState() { int nSelection = ListView_GetSelectedCount(_hList); @@ -507,7 +515,7 @@ BOOL WindowsDlg::onInitDialog() if (_lastKnownLocation.bottom > 0 && _lastKnownLocation.right > 0) { - SetWindowPos(_hSelf, NULL, _lastKnownLocation.left, _lastKnownLocation.top, + SetWindowPos(_hSelf, NULL, _lastKnownLocation.left, _lastKnownLocation.top, _lastKnownLocation.right-_lastKnownLocation.left, _lastKnownLocation.bottom-_lastKnownLocation.top, SWP_SHOWWINDOW); } else @@ -549,7 +557,7 @@ LRESULT WindowsDlg::onWinMgr(WPARAM wp, LPARAM lp) nmw.sizeinfo.szMin = _szMinListCtrl; nmw.processed = TRUE; return TRUE; - } + } } return MyBaseClass::onWinMgr(wp, lp); } @@ -621,14 +629,14 @@ void WindowsDlg::doSave() { NMWINDLG nmdlg; nmdlg.type = WDT_SAVE; - nmdlg.curSel = ListView_GetNextItem(_hList, -1, LVNI_SELECTED); + nmdlg.curSel = ListView_GetNextItem(_hList, -1, LVNI_SELECTED); nmdlg.hwndFrom = _hSelf; nmdlg.code = WDN_NOTIFY; nmdlg.nItems = ListView_GetSelectedCount(_hList); nmdlg.Items = new UINT[nmdlg.nItems]; for (int i=-1, j=0;;++j) { - i = ListView_GetNextItem(_hList, i, LVNI_SELECTED); - if (i == -1) break; + i = ListView_GetNextItem(_hList, i, LVNI_SELECTED); + if (i == -1) break; nmdlg.Items[j] = _idxMap[i]; } SendMessage(_hParent, WDN_NOTIFY, 0, LPARAM(&nmdlg)); @@ -644,7 +652,7 @@ void WindowsDlg::destroy() HWND hSelf = _hSelf; _hSelf = NULL; ::DestroyWindow(hSelf); - + } void WindowsDlg::activateCurrent() @@ -669,7 +677,7 @@ void WindowsDlg::doClose() nmdlg.type = WDT_CLOSE; int index = ListView_GetNextItem(_hList, -1, LVNI_ALL|LVNI_SELECTED); if (index == -1) return; - + nmdlg.curSel = _idxMap[index]; nmdlg.hwndFrom = _hSelf; nmdlg.code = WDN_NOTIFY; @@ -678,7 +686,7 @@ void WindowsDlg::doClose() vector key; key.resize(n, 0x7fffffff); for(int i=-1, j=0;; ++j) { - i = ListView_GetNextItem(_hList, i, LVNI_SELECTED); + i = ListView_GetNextItem(_hList, i, LVNI_SELECTED); if (i == -1) break; ListView_SetItemState(_hList, i, 0, LVIS_SELECTED); // deselect nmdlg.Items[j] = _idxMap[i]; @@ -737,14 +745,14 @@ void WindowsDlg::doSortToTabs() vector key; key.resize(n, 0x7fffffff); for(int i=-1, j=0;; ++j) { - i = ListView_GetNextItem(_hList, i, LVNI_ALL); + i = ListView_GetNextItem(_hList, i, LVNI_ALL); if (i == -1) break; nmdlg.Items[j] = _idxMap[i]; if (i == curSel) nmdlg.curSel = j; key[j] = i; } - + SendMessage(_hParent, WDN_NOTIFY, 0, LPARAM(&nmdlg)); if (nmdlg.processed) { diff --git a/PowerEditor/src/winmain.cpp b/PowerEditor/src/winmain.cpp index 6a52e3a22..603873080 100644 --- a/PowerEditor/src/winmain.cpp +++ b/PowerEditor/src/winmain.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -47,7 +47,7 @@ bool checkSingleFile(const TCHAR *commandLine) if (fullpathResult > MAX_PATH) return false; - if (::PathFileExists(fullpath)) + if (::PathFileExists(fullpath)) return true; return false; @@ -55,7 +55,7 @@ bool checkSingleFile(const TCHAR *commandLine) //commandLine should contain path to n++ executable running void parseCommandLine(TCHAR * commandLine, ParamVector & paramVector) { - //params.erase(params.begin()); + //params.erase(params.begin()); //remove the first element, since thats the path the the executable (GetCommandLine does that) TCHAR stopChar = TEXT(' '); if (commandLine[0] == TEXT('\"')) { @@ -108,7 +108,7 @@ void parseCommandLine(TCHAR * commandLine, ParamVector & paramVector) { break; } default: { //default TCHAR, if beginning of word, add it if (!isInFile && isInWhiteSpace) { - paramVector.push_back(commandLine+i); //add next param + paramVector.push_back(commandLine+i); //add next param isInWhiteSpace = false; } break; } @@ -239,7 +239,32 @@ const TCHAR FLAG_ALWAYS_ON_TOP[] = TEXT("-alwaysOnTop"); const TCHAR FLAG_OPENSESSIONFILE[] = TEXT("-openSession"); const TCHAR FLAG_RECURSIVE[] = TEXT("-r"); -void doException(Notepad_plus_Window & notepad_plus_plus); + +static void doException(Notepad_plus_Window & notepad_plus_plus) +{ + Win32Exception::removeHandler(); //disable exception handler after excpetion, we dont want corrupt data structurs to crash the exception handler + ::MessageBox(Notepad_plus_Window::gNppHWND, TEXT("Notepad++ will attempt to save any unsaved data. However, dataloss is very likely."), TEXT("Recovery initiating"), MB_OK | MB_ICONINFORMATION); + + TCHAR tmpDir[1024]; + GetTempPath(1024, tmpDir); + generic_string emergencySavedDir = tmpDir; + emergencySavedDir += TEXT("\\N++RECOV"); + + bool res = notepad_plus_plus.emergency(emergencySavedDir); + if (res) + { + generic_string displayText = TEXT("Notepad++ was able to successfully recover some unsaved documents, or nothing to be saved could be found.\r\nYou can find the results at :\r\n"); + displayText += emergencySavedDir; + ::MessageBox(Notepad_plus_Window::gNppHWND, displayText.c_str(), TEXT("Recovery success"), MB_OK | MB_ICONINFORMATION); + } + else + ::MessageBox(Notepad_plus_Window::gNppHWND, TEXT("Unfortunatly, Notepad++ was not able to save your work. We are sorry for any lost data."), TEXT("Recovery failure"), MB_OK | MB_ICONERROR); +} + + + + + int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) { @@ -258,7 +283,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) bool isParamePresent; bool showHelp = isInList(FLAG_HELP, params); bool isMultiInst = isInList(FLAG_MULTI_INSTANCE, params); - + CmdLineParams cmdLineParams; cmdLineParams._isNoTab = isInList(FLAG_NOTABBAR, params); cmdLineParams._isNoPlugin = isInList(FLAG_NO_PLUGIN, params); @@ -276,15 +301,13 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) cmdLineParams._point.x = getNumberFromParam('x', params, cmdLineParams._isPointXValid); cmdLineParams._point.y = getNumberFromParam('y', params, cmdLineParams._isPointYValid); cmdLineParams._easterEggName = getEasterEggNameFromParam(params, cmdLineParams._quoteType); - - + + if (showHelp) - { ::MessageBox(NULL, COMMAND_ARG_HELP, TEXT("Notepad++ Command Argument Help"), MB_OK); - } NppParameters *pNppParameters = NppParameters::getInstance(); - + if (cmdLineParams._localizationPath != TEXT("")) { pNppParameters->setStartWithLocFileName(cmdLineParams._localizationPath); @@ -319,7 +342,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) if (currentFile[0]) { //check if relative or full path. Relative paths dont have a colon for driveletter - + quotFileName += TEXT("\""); quotFileName += relativeFilePathToFullFilePath(currentFile); quotFileName += TEXT("\" "); @@ -384,14 +407,14 @@ DEVOMER*/ } Notepad_plus_Window notepad_plus_plus; - + NppGUI & nppGui = (NppGUI &)pNppParameters->getNppGUI(); generic_string updaterDir = pNppParameters->getNppPath(); updaterDir += TEXT("\\updater\\"); generic_string updaterFullPath = updaterDir + TEXT("gup.exe"); - + generic_string version = TEXT("-v"); version += VERSION_VALUE; @@ -399,10 +422,10 @@ DEVOMER*/ bool doUpdate = nppGui._autoUpdateOpt._doAutoUpdate; - if (doUpdate) // check more detail + if (doUpdate) // check more detail { Date today(0); - + if (today < nppGui._autoUpdateOpt._nextUpdateDate) doUpdate = false; } @@ -414,7 +437,7 @@ DEVOMER*/ { Process updater(updaterFullPath.c_str(), version.c_str(), updaterDir.c_str()); updater.run(); - + // Update next update date if (nppGui._autoUpdateOpt._intervalDays < 0) // Make sure interval days value is positive nppGui._autoUpdateOpt._intervalDays = 0 - nppGui._autoUpdateOpt._intervalDays; @@ -424,7 +447,8 @@ DEVOMER*/ MSG msg; msg.wParam = 0; Win32Exception::installHandler(); - try { + try + { notepad_plus_plus.init(hInstance, NULL, quotFileName.c_str(), &cmdLineParams); // Tell UAC that lower integrity processes are allowed to send WM_COPYDATA messages to this process (or window) @@ -434,7 +458,7 @@ DEVOMER*/ HMODULE hDll = GetModuleHandle(TEXT("user32.dll")); if (hDll) { - // According to MSDN ChangeWindowMessageFilter may not be supported in future versions of Windows, + // According to MSDN ChangeWindowMessageFilter may not be supported in future versions of Windows, // that is why we use ChangeWindowMessageFilterEx if it is available (windows version >= Win7). if(pNppParameters->getWinVersion() == WV_VISTA) { @@ -444,9 +468,7 @@ DEVOMER*/ MESSAGEFILTERFUNC func = (MESSAGEFILTERFUNC)::GetProcAddress( hDll, "ChangeWindowMessageFilter" ); if (func) - { func(WM_COPYDATA, MSGFLT_ADD); - } } else { @@ -456,9 +478,7 @@ DEVOMER*/ MESSAGEFILTERFUNCEX func = (MESSAGEFILTERFUNCEX)::GetProcAddress( hDll, "ChangeWindowMessageFilterEx" ); if (func) - { func(notepad_plus_plus.getHSelf(), WM_COPYDATA, MSGFLT_ALLOW, NULL ); - } } } } @@ -480,48 +500,39 @@ DEVOMER*/ } } } - } catch(int i) { + } + catch (int i) + { TCHAR str[50] = TEXT("God Damned Exception : "); TCHAR code[10]; wsprintf(code, TEXT("%d"), i); ::MessageBox(Notepad_plus_Window::gNppHWND, lstrcat(str, code), TEXT("Int Exception"), MB_OK); doException(notepad_plus_plus); - } catch(std::runtime_error & ex) { + } + catch (std::runtime_error & ex) + { ::MessageBoxA(Notepad_plus_Window::gNppHWND, ex.what(), "Runtime Exception", MB_OK); doException(notepad_plus_plus); - } catch (const Win32Exception & ex) { + } + catch (const Win32Exception & ex) + { TCHAR message[1024]; //TODO: sane number wsprintf(message, TEXT("An exception occured. Notepad++ cannot recover and must be shut down.\r\nThe exception details are as follows:\r\n") TEXT("Code:\t0x%08X\r\nType:\t%S\r\nException address: 0x%08X"), ex.code(), ex.what(), (long)ex.where()); ::MessageBox(Notepad_plus_Window::gNppHWND, message, TEXT("Win32Exception"), MB_OK | MB_ICONERROR); mdump.writeDump(ex.info()); doException(notepad_plus_plus); - } catch(std::exception & ex) { + } + catch (std::exception & ex) + { ::MessageBoxA(Notepad_plus_Window::gNppHWND, ex.what(), "General Exception", MB_OK); doException(notepad_plus_plus); - } catch(...) { //this shouldnt ever have to happen + } + catch (...) // this shouldnt ever have to happen + { ::MessageBoxA(Notepad_plus_Window::gNppHWND, "An exception that we did not yet found its name is just caught", "Unknown Exception", MB_OK); doException(notepad_plus_plus); } return (UINT)msg.wParam; -} - -void doException(Notepad_plus_Window & notepad_plus_plus) { - Win32Exception::removeHandler(); //disable exception handler after excpetion, we dont want corrupt data structurs to crash the exception handler - ::MessageBox(Notepad_plus_Window::gNppHWND, TEXT("Notepad++ will attempt to save any unsaved data. However, dataloss is very likely."), TEXT("Recovery initiating"), MB_OK | MB_ICONINFORMATION); - - TCHAR tmpDir[1024]; - GetTempPath(1024, tmpDir); - generic_string emergencySavedDir = tmpDir; - emergencySavedDir += TEXT("\\N++RECOV"); - - bool res = notepad_plus_plus.emergency(emergencySavedDir); - if (res) { - generic_string displayText = TEXT("Notepad++ was able to successfully recover some unsaved documents, or nothing to be saved could be found.\r\nYou can find the results at :\r\n"); - displayText += emergencySavedDir; - ::MessageBox(Notepad_plus_Window::gNppHWND, displayText.c_str(), TEXT("Recovery success"), MB_OK | MB_ICONINFORMATION); - } else { - ::MessageBox(Notepad_plus_Window::gNppHWND, TEXT("Unfortunatly, Notepad++ was not able to save your work. We are sorry for any lost data."), TEXT("Recovery failure"), MB_OK | MB_ICONERROR); - } -} +} \ No newline at end of file From 05183aeec52d80a26668f91b8cf2936b4fa81f27 Mon Sep 17 00:00:00 2001 From: Damien GERARD Date: Tue, 4 Aug 2015 19:01:52 +0200 Subject: [PATCH 08/85] Avoid useless redraws at start up, especially useful when numerous tabs are opened --- PowerEditor/src/Notepad_plus_Window.cpp | 94 +++++++++++++++++-------- 1 file changed, 63 insertions(+), 31 deletions(-) diff --git a/PowerEditor/src/Notepad_plus_Window.cpp b/PowerEditor/src/Notepad_plus_Window.cpp index c0f7ae630..300cb7002 100644 --- a/PowerEditor/src/Notepad_plus_Window.cpp +++ b/PowerEditor/src/Notepad_plus_Window.cpp @@ -33,6 +33,39 @@ const TCHAR Notepad_plus_Window::_className[32] = TEXT("Notepad++"); HWND Notepad_plus_Window::gNppHWND = NULL; + + +namespace // anonymous +{ + + struct PaintLocker final + { + PaintLocker(HWND handle) + : handle(handle) + { + // disallow drawing on the window + LockWindowUpdate(handle); + } + + ~PaintLocker() + { + // re-allow drawing for the window + LockWindowUpdate(NULL); + + // force re-draw + InvalidateRect(handle, nullptr, TRUE); + RedrawWindow(handle, nullptr, NULL, RDW_ERASE | RDW_ALLCHILDREN | RDW_FRAME | RDW_INVALIDATE); + } + + HWND handle; + }; + +} // anonymous namespace + + + + + void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLine, CmdLineParams *cmdLineParams) { time_t timestampBegin = 0; @@ -67,40 +100,41 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin _notepad_plus_plus_core._pluginsManager.disable(); _hSelf = ::CreateWindowEx( - WS_EX_ACCEPTFILES | (_notepad_plus_plus_core._nativeLangSpeaker.isRTL()?WS_EX_LAYOUTRTL:0),\ - _className,\ - TEXT("Notepad++"),\ - WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,\ - // CreateWindowEx bug : set all 0 to walk around the pb - 0, 0, 0, 0,\ - _hParent,\ - NULL,\ - _hInst,\ - (LPVOID)this); // pass the ptr of this instantiated object - // for retrieve it in Notepad_plus_Proc from - // the CREATESTRUCT.lpCreateParams afterward. + WS_EX_ACCEPTFILES | (_notepad_plus_plus_core._nativeLangSpeaker.isRTL()?WS_EX_LAYOUTRTL:0), + _className, + TEXT("Notepad++"), + (WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN), + // CreateWindowEx bug : set all 0 to walk around the pb + 0, 0, 0, 0, + _hParent, nullptr, _hInst, + (LPVOID) this); // pass the ptr of this instantiated object + // for retrieve it in Notepad_plus_Proc from + // the CREATESTRUCT.lpCreateParams afterward. - if (!_hSelf) - { + if (NULL == _hSelf) throw std::runtime_error("Notepad_plus_Window::init : CreateWindowEx() function return null"); - } + + + PaintLocker paintLocker{_hSelf}; _notepad_plus_plus_core.staticCheckMenuAndTB(); gNppHWND = _hSelf; if (cmdLineParams->isPointValid()) + { ::MoveWindow(_hSelf, cmdLineParams->_point.x, cmdLineParams->_point.y, nppGUI._appPos.right, nppGUI._appPos.bottom, TRUE); + } else { WINDOWPLACEMENT posInfo; - posInfo.length = sizeof(WINDOWPLACEMENT); posInfo.flags = 0; if(_isPrelaunch) posInfo.showCmd = SW_HIDE; else - posInfo.showCmd = nppGUI._isMaximized?SW_SHOWMAXIMIZED:SW_SHOWNORMAL; + posInfo.showCmd = nppGUI._isMaximized ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL; + posInfo.ptMinPosition.x = (LONG)-1; posInfo.ptMinPosition.y = (LONG)-1; posInfo.ptMaxPosition.x = (LONG)-1; @@ -114,7 +148,11 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin ::SetWindowPlacement(_hSelf,&posInfo); } - if (nppGUI._tabStatus & TAB_MULTILINE) + + // avoid useless drawing + //PaintLocker paintLocker(_hSelf); + + if (0 != (nppGUI._tabStatus & TAB_MULTILINE)) ::SendMessage(_hSelf, WM_COMMAND, IDM_VIEW_DRAWTABBAR_MULTILINE, 0); if (!nppGUI._menuBarShow) @@ -132,22 +170,18 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin } if (cmdLineParams->_alwaysOnTop) - { ::SendMessage(_hSelf, WM_COMMAND, IDM_VIEW_ALWAYSONTOP, 0); - } nppGUI._isCmdlineNosessionActivated = cmdLineParams->_isNoSession; if (nppGUI._rememberLastSession && !cmdLineParams->_isNoSession) - { _notepad_plus_plus_core.loadLastSession(); - } - if (!cmdLineParams->_isPreLaunch) + if (not cmdLineParams->_isPreLaunch) { if (cmdLineParams->isPointValid()) ::ShowWindow(_hSelf, SW_SHOW); else - ::ShowWindow(_hSelf, nppGUI._isMaximized?SW_MAXIMIZE:SW_SHOW); + ::ShowWindow(_hSelf, nppGUI._isMaximized ? SW_MAXIMIZE : SW_SHOW); } else { @@ -155,10 +189,8 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin _notepad_plus_plus_core._pTrayIco->doTrayIcon(ADD); } - if (cmdLine) - { + if (cmdLine) _notepad_plus_plus_core.loadCommandlineParams(cmdLine, cmdLineParams); - } std::vector fileNames; std::vector patterns; @@ -171,10 +203,8 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin PathAppend(localizationDir, TEXT("localization\\")); _notepad_plus_plus_core.getMatchedFileNames(localizationDir.c_str(), patterns, fileNames, false, false); - for (size_t i = 0, len = fileNames.size(); i < len ; ++i) - { + for (size_t i = 0, len = fileNames.size(); i < len; ++i) localizationSwitcher.addLanguageFromXml(fileNames[i].c_str()); - } fileNames.clear(); ThemeSwitcher & themeSwitcher = pNppParams->getThemeSwitcher(); @@ -193,6 +223,7 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin themeSwitcher.addThemeFromXml(fileNames[i].c_str()); } } + fileNames.clear(); themeDir.clear(); themeDir = nppDir.c_str(); // <- should use the pointer to avoid the constructor of copy @@ -217,7 +248,7 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin scnN.nmhdr.idFrom = 0; _notepad_plus_plus_core._pluginsManager.notify(&scnN); - if (cmdLineParams->_easterEggName != TEXT("")) + if (not cmdLineParams->_easterEggName.empty()) { char dest[MAX_PATH]; wcstombs(dest, (cmdLineParams->_easterEggName).c_str(), sizeof(dest)); @@ -269,6 +300,7 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin } } + bool Notepad_plus_Window::isDlgsMsg(MSG *msg) const { for (size_t i = 0, len = _notepad_plus_plus_core._hModelessDlgs.size(); i < len; ++i) From ba5d36e2bfebc7325b6777ab2d0b54d7e49e2620 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Thu, 6 Aug 2015 01:18:43 +0200 Subject: [PATCH 09/85] [BUG_FIXED] Fix a visual glitch on exit Don't make Notepad++ redraw on exit. --- PowerEditor/src/NppBigSwitch.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/PowerEditor/src/NppBigSwitch.cpp b/PowerEditor/src/NppBigSwitch.cpp index c21962805..13026a734 100644 --- a/PowerEditor/src/NppBigSwitch.cpp +++ b/PowerEditor/src/NppBigSwitch.cpp @@ -1510,6 +1510,10 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa const NppGUI & nppgui = pNppParam->getNppGUI(); bool isSnapshotMode = nppgui.isSnapshotMode(); + + if (isSnapshotMode) + ::LockWindowUpdate(_pPublicInterface->getHSelf()); + if (isSnapshotMode) MainFileManager->backupCurrentBuffer(); @@ -1589,9 +1593,14 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa } } + if (not isSnapshotMode) + ::LockWindowUpdate(_pPublicInterface->getHSelf()); + //Sends WM_DESTROY, Notepad++ will end - if(Message == WM_CLOSE) + if (Message == WM_CLOSE) ::DestroyWindow(hwnd); + + ::LockWindowUpdate(NULL); } return TRUE; } From 366a393f1394675b2e708078f2b71a4c029fede1 Mon Sep 17 00:00:00 2001 From: Damien GERARD Date: Thu, 6 Aug 2015 11:03:57 +0200 Subject: [PATCH 10/85] minor code cleanup for future refactoring --- PowerEditor/src/MISC/Common/Common.h | 1 + PowerEditor/src/Notepad_plus.cpp | 4 +- PowerEditor/src/Notepad_plus_Window.h | 70 +- PowerEditor/src/NppBigSwitch.cpp | 749 ++++---- PowerEditor/src/NppCommands.cpp | 206 +-- PowerEditor/src/NppNotification.cpp | 1525 +++++++++-------- .../ScitillaComponent/UserDefineResource.h | 6 +- .../WinControls/ColourPicker/ColourPicker.cpp | 120 +- .../WinControls/ColourPicker/ColourPopup.h | 72 +- .../ColourPicker/ColourPopupResource.h | 16 +- .../WinControls/ColourPicker/WordStyleDlg.cpp | 173 +- .../SplitterContainer/Splitter.cpp | 281 +-- .../WinControls/SplitterContainer/Splitter.h | 114 +- .../SplitterContainer/SplitterContainer.cpp | 195 ++- .../SplitterContainer/SplitterContainer.h | 106 +- .../WinControls/StaticDialog/StaticDialog.cpp | 119 +- .../WinControls/StaticDialog/StaticDialog.h | 71 +- PowerEditor/src/WinControls/Window.h | 9 + PowerEditor/src/resource.h | 566 +++--- 19 files changed, 2251 insertions(+), 2152 deletions(-) diff --git a/PowerEditor/src/MISC/Common/Common.h b/PowerEditor/src/MISC/Common/Common.h index 895e668bb..e1a2a79f6 100644 --- a/PowerEditor/src/MISC/Common/Common.h +++ b/PowerEditor/src/MISC/Common/Common.h @@ -29,6 +29,7 @@ #include #include #include +#include const bool dirUp = true; diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index e3eddbe52..89b9aedbc 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -362,7 +362,7 @@ LRESULT Notepad_plus::init(HWND hwnd) bool isVertical = (nppGUI._splitterPos == POS_VERTICAL); _subSplitter.init(_pPublicInterface->getHinst(), hwnd); - _subSplitter.create(&_mainDocTab, &_subDocTab, 8, DYNAMIC, 50, isVertical); + _subSplitter.create(&_mainDocTab, &_subDocTab, 8, SplitterMode::DYNAMIC, 50, isVertical); //--Status Bar Section--// bool willBeShown = nppGUI._statusBarShow; @@ -3240,7 +3240,7 @@ void Notepad_plus::dockUserDlg() else pWindow = _pDocTab; - _pMainSplitter->create(pWindow, ScintillaEditView::getUserDefineDlg(), 8, RIGHT_FIX, 45); + _pMainSplitter->create(pWindow, ScintillaEditView::getUserDefineDlg(), 8, SplitterMode::RIGHT_FIX, 45); } if (bothActive()) diff --git a/PowerEditor/src/Notepad_plus_Window.h b/PowerEditor/src/Notepad_plus_Window.h index 30bc76d6d..3bc3522c2 100644 --- a/PowerEditor/src/Notepad_plus_Window.h +++ b/PowerEditor/src/Notepad_plus_Window.h @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -24,13 +24,11 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - -#ifndef NOTEPAD_PLUS_WINDOW_H -#define NOTEPAD_PLUS_WINDOW_H - +#pragma once #include "Notepad_plus.h" + + const TCHAR COMMAND_ARG_HELP[] = TEXT("Usage :\r\ \r\ notepad++ [--help] [-multiInst] [-noPlugin] [-lLanguage] [-LlangCode] [-nLineNumber] [-cColumnNumber] [-xLeftPos] [-yTopPos] [-nosession] [-notabbar] [-ro] [-systemtray] [-loadingTime] [-alwaysOnTop] [-openSession] [-r] [-qnEsterEggName | -qtText | -qfCntentFileName] [filePath]\r\ @@ -59,47 +57,57 @@ notepad++ [--help] [-multiInst] [-noPlugin] [-lLanguage] [-LlangCode] [-nLineNum filePath : file or folder name to open (absolute or relative path name)\r\ "); -class Notepad_plus_Window : public Window { + + + + +class Notepad_plus_Window : public Window +{ public: - Notepad_plus_Window() : _isPrelaunch(false), _disablePluginsManager(false) {}; void init(HINSTANCE, HWND, const TCHAR *cmdLine, CmdLineParams *cmdLineParams); bool isDlgsMsg(MSG *msg) const; - - HACCEL getAccTable() const { + + HACCEL getAccTable() const + { return _notepad_plus_plus_core.getAccTable(); - }; - - bool emergency(generic_string emergencySavedDir) { + } + + bool emergency(generic_string emergencySavedDir) + { return _notepad_plus_plus_core.emergency(emergencySavedDir); - }; + } - bool isPrelaunch() const { + bool isPrelaunch() const + { return _isPrelaunch; - }; + } - void setIsPrelaunch(bool val) { + void setIsPrelaunch(bool val) + { _isPrelaunch = val; - }; + } - virtual void destroy(){ - ::DestroyWindow(_hSelf); - }; + virtual void destroy() + { + ::DestroyWindow(_hSelf); + } - static const TCHAR * getClassName() { + static const TCHAR * getClassName() + { return _className; - }; + } + static HWND gNppHWND; //static handle to Notepad++ window, NULL if non-existant - + + private: Notepad_plus _notepad_plus_plus_core; static LRESULT CALLBACK Notepad_plus_Proc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); LRESULT runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); static const TCHAR _className[32]; - bool _isPrelaunch; - bool _disablePluginsManager; - std::string _userQuote; // keep the availability of this string for thread using + bool _isPrelaunch = false; + bool _disablePluginsManager = false; + std::string _userQuote; // keep the availability of this string for thread using }; - -#endif //NOTEPAD_PLUS_WINDOW_H diff --git a/PowerEditor/src/NppBigSwitch.cpp b/PowerEditor/src/NppBigSwitch.cpp index 13026a734..81e2b3c4b 100644 --- a/PowerEditor/src/NppBigSwitch.cpp +++ b/PowerEditor/src/NppBigSwitch.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -43,7 +43,10 @@ using namespace std; #define WM_DPICHANGED 0x02E0 -struct SortTaskListPred + + + +struct SortTaskListPred final { DocTabView *_views[2]; @@ -70,44 +73,49 @@ LRESULT CALLBACK Notepad_plus_Window::Notepad_plus_Proc(HWND hwnd, UINT Message, switch(Message) { - case WM_NCCREATE : // First message we get the ptr of instantiated object - // then stock it into GWLP_USERDATA index in order to retrieve afterward + case WM_NCCREATE: { + // First message we get the ptr of instantiated object + // then stock it into GWLP_USERDATA index in order to retrieve afterward Notepad_plus_Window *pM30ide = (Notepad_plus_Window *)(((LPCREATESTRUCT)lParam)->lpCreateParams); pM30ide->_hSelf = hwnd; ::SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pM30ide); - return TRUE; } - default : + default: { return ((Notepad_plus_Window *)::GetWindowLongPtr(hwnd, GWLP_USERDATA))->runProc(hwnd, Message, wParam, lParam); } } } + LRESULT Notepad_plus_Window::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { - LRESULT result = FALSE; switch (Message) { case WM_CREATE: { - try{ + try + { _notepad_plus_plus_core._pPublicInterface = this; - result = _notepad_plus_plus_core.init(hwnd); - } catch (std::exception ex) { + return _notepad_plus_plus_core.init(hwnd); + } + catch (std::exception ex) + { ::MessageBoxA(_notepad_plus_plus_core._pPublicInterface->getHSelf(), ex.what(), "Exception On WM_CREATE", MB_OK); exit(-1); } + break; } - break; - default: + default: + { if (this) return _notepad_plus_plus_core.process(hwnd, Message, wParam, lParam); + } } - return result; + return FALSE; } @@ -125,13 +133,12 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return ::DefWindowProc(hwnd, Message, wParam, lParam); } - case WM_DRAWITEM : + case WM_DRAWITEM: { DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *)lParam; if (dis->CtlType == ODT_TAB) - { return ::SendMessage(dis->hwndItem, WM_DRAWITEM, wParam, lParam); - } + break; } case WM_DOCK_USERDEFINE_DLG: @@ -140,9 +147,9 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return TRUE; } - case WM_UNDOCK_USERDEFINE_DLG: + case WM_UNDOCK_USERDEFINE_DLG: { - undockUserDlg(); + undockUserDlg(); return TRUE; } @@ -151,80 +158,80 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa TCHAR *userLangName = (TCHAR *)lParam; if (!userLangName || !userLangName[0]) return FALSE; - generic_string name(userLangName); + + generic_string name{userLangName}; //loop through buffers and reset the language (L_USER, TEXT("")) if (L_USER, name) - Buffer * buf; - for(int i = 0; i < MainFileManager->getNrBuffers(); ++i) + for (int i = 0; i < MainFileManager->getNrBuffers(); ++i) { - buf = MainFileManager->getBufferByIndex(i); + Buffer* buf = MainFileManager->getBufferByIndex(i); if (buf->getLangType() == L_USER && name == buf->getUserDefineLangName()) buf->setLangType(L_USER, TEXT("")); } return TRUE; } - case WM_RENAME_USERLANG: + case WM_RENAME_USERLANG: { if (!lParam || !(((TCHAR *)lParam)[0]) || !wParam || !(((TCHAR *)wParam)[0])) return FALSE; - generic_string oldName((TCHAR *)lParam); - generic_string newName((TCHAR *)wParam); + generic_string oldName{(TCHAR *)lParam}; + generic_string newName{(TCHAR *)wParam}; //loop through buffers and reset the language (L_USER, newName) if (L_USER, oldName) - Buffer * buf; - for(int i = 0; i < MainFileManager->getNrBuffers(); ++i) + for (int i = 0; i < MainFileManager->getNrBuffers(); ++i) { - buf = MainFileManager->getBufferByIndex(i); + Buffer* buf = MainFileManager->getBufferByIndex(i); if (buf->getLangType() == L_USER && oldName == buf->getUserDefineLangName()) buf->setLangType(L_USER, newName.c_str()); } return TRUE; } - case WM_CLOSE_USERDEFINE_DLG : + case WM_CLOSE_USERDEFINE_DLG: { checkMenuItem(IDM_LANG_USER_DLG, false); _toolBar.setCheck(IDM_LANG_USER_DLG, false); return TRUE; } - case WM_REPLACEALL_INOPENEDDOC : + case WM_REPLACEALL_INOPENEDDOC: { replaceInOpenedFiles(); return TRUE; } - case WM_FINDALL_INOPENEDDOC : + case WM_FINDALL_INOPENEDDOC: { findInOpenedFiles(); return TRUE; } - case WM_FINDALL_INCURRENTDOC : + case WM_FINDALL_INCURRENTDOC: { findInCurrentFile(); return TRUE; } - - case WM_FINDINFILES : + + case WM_FINDINFILES: { return findInFiles(); } - case WM_REPLACEINFILES : + case WM_REPLACEINFILES: { replaceInFiles(); return TRUE; } - case NPPM_LAUNCHFINDINFILESDLG : + + case NPPM_LAUNCHFINDINFILESDLG: { // Find in files function code should be here due to the number of parameters (2) cannot be passed via WM_COMMAND const int strSize = FINDREPLACE_MAXLENGTH; TCHAR str[strSize]; - bool isFirstTime = !_findReplaceDlg.isCreated(); + bool isFirstTime = not _findReplaceDlg.isCreated(); _findReplaceDlg.doDialog(FIND_DLG, _nativeLangSpeaker.isRTL()); _pEditView->getGenericSelectedText(str, strSize); @@ -233,6 +240,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa _nativeLangSpeaker.changeDlgLang(_findReplaceDlg.getHSelf(), "Find"); _findReplaceDlg.launchFindInFilesDlg(); setFindReplaceFolderFilter((const TCHAR*) wParam, (const TCHAR*) lParam); + return TRUE; } @@ -241,11 +249,9 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa { BufferID id = doOpen((const TCHAR *)lParam); if (id != BUFFER_INVALID) - { return switchToFile(id); - } + break; } - break; case NPPM_INTERNAL_SETFILENAME: { @@ -259,7 +265,6 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa } return FALSE; } - break; case NPPM_GETBUFFERLANGTYPE: { @@ -269,7 +274,6 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa Buffer * b = MainFileManager->getBufferByID(id); return b->getLangType(); } - break; case NPPM_SETBUFFERLANGTYPE: { @@ -283,7 +287,6 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa b->setLangType((LangType)lParam); return TRUE; } - break; case NPPM_GETBUFFERENCODING: { @@ -293,7 +296,6 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa Buffer * b = MainFileManager->getBufferByID(id); return b->getUnicodeMode(); } - break; case NPPM_SETBUFFERENCODING: { @@ -309,7 +311,6 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa b->setUnicodeMode((UniMode)lParam); return TRUE; } - break; case NPPM_GETBUFFERFORMAT: { @@ -319,7 +320,6 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa Buffer * b = MainFileManager->getBufferByID(id); return b->getFormat(); } - break; case NPPM_SETBUFFERFORMAT: { @@ -333,30 +333,27 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa b->setFormat((formatType)lParam); return TRUE; } - break; case NPPM_GETBUFFERIDFROMPOS: { - DocTabView * pView = NULL; - if (lParam == MAIN_VIEW) { + DocTabView* pView = nullptr; + if (lParam == MAIN_VIEW) pView = &_mainDocTab; - } else if (lParam == SUB_VIEW) { + else if (lParam == SUB_VIEW) pView = &_subDocTab; - } else { + else return (LRESULT)BUFFER_INVALID; - } - if ((int)wParam < pView->nbItem()) { + + if ((int)wParam < pView->nbItem()) return (LRESULT)(pView->getBufferByIndex((int)wParam)); - } + return (LRESULT)BUFFER_INVALID; } - break; case NPPM_GETCURRENTBUFFERID: { return (LRESULT)(_pEditView->getCurrentBufferID()); } - break; case NPPM_RELOADBUFFERID: { @@ -364,15 +361,14 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return FALSE; return doReload((BufferID)wParam, lParam != 0); } - break; case NPPM_RELOADFILE: { BufferID id = MainFileManager->getBufferFromName((const TCHAR *)lParam); if (id != BUFFER_INVALID) doReload(id, wParam != 0); + break; } - break; case NPPM_SWITCHTOFILE : { @@ -386,7 +382,6 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa { return fileSave(); } - break; case NPPM_SAVECURRENTFILEAS: { @@ -396,19 +391,16 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa if (!filename) return FALSE; return doSave(currentBufferID, filename, asCopy); } - break; case NPPM_SAVEALLFILES: { return fileSaveAll(); } - break; case NPPM_GETCURRENTNATIVELANGENCODING: { return _nativeLangSpeaker.getLangEncoding(); } - break; case NPPM_INTERNAL_DOCORDERCHANGED : { @@ -422,15 +414,13 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa _pluginsManager.notify(&scnN); return TRUE; } - break; case WM_SIZE: { RECT rc; _pPublicInterface->getClientRect(rc); - if (lParam == 0) { + if (lParam == 0) lParam = MAKELPARAM(rc.right - rc.left, rc.bottom - rc.top); - } ::MoveWindow(_rebarTop.getHSelf(), 0, 0, rc.right, _rebarTop.getHeight(), TRUE); _statusBar.adjustParts(rc.right); @@ -439,7 +429,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa int rebarBottomHeight = _rebarBottom.getHeight(); int statusBarHeight = _statusBar.getHeight(); ::MoveWindow(_rebarBottom.getHSelf(), 0, rc.bottom - rebarBottomHeight - statusBarHeight, rc.right, rebarBottomHeight, TRUE); - + getMainClientRect(rc); _dockingManager.reSizeTo(rc); @@ -450,14 +440,14 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa } result = TRUE; + break; } - break; case WM_MOVE: { result = TRUE; + break; } - break; case WM_MOVING: { @@ -466,31 +456,31 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa _pDocMap->doMove(); } result = FALSE; + break; } - break; case WM_SIZING: { result = FALSE; + break; } - break; - - case WM_COPYDATA : - { - COPYDATASTRUCT *pCopyData = (COPYDATASTRUCT *)lParam; + + case WM_COPYDATA: + { + COPYDATASTRUCT *pCopyData = (COPYDATASTRUCT *)lParam; switch (pCopyData->dwData) { - case COPYDATA_PARAMS : + case COPYDATA_PARAMS: { - CmdLineParams *cmdLineParam = (CmdLineParams *)pCopyData->lpData; + CmdLineParams *cmdLineParam = (CmdLineParams *)pCopyData->lpData; pNppParam->setCmdlineParam(*cmdLineParam); NppGUI nppGui = (NppGUI)pNppParam->getNppGUI(); nppGui._isCmdlineNosessionActivated = cmdLineParam->_isNoSession; break; } - case COPYDATA_FILENAMESA : + case COPYDATA_FILENAMESA: { char *fileNamesA = (char *)pCopyData->lpData; CmdLineParams & cmdLineParams = pNppParam->getCmdLineParams(); @@ -500,7 +490,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa break; } - case COPYDATA_FILENAMESW : + case COPYDATA_FILENAMESW: { wchar_t *fileNamesW = (wchar_t *)pCopyData->lpData; CmdLineParams & cmdLineParams = pNppParam->getCmdLineParams(); @@ -509,13 +499,13 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa } } - return TRUE; - } + return TRUE; + } case WM_COMMAND: { - if (HIWORD(wParam) == SCEN_SETFOCUS) - { + if (HIWORD(wParam) == SCEN_SETFOCUS) + { HWND hMain = _mainEditView.getHSelf(), hSec = _subEditView.getHSelf(); HWND hFocus = (HWND)lParam; if (hMain == hFocus) @@ -526,13 +516,13 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa //Other Scintilla, ignore } return TRUE; - } - else + } + else { command(LOWORD(wParam)); } + return TRUE; } - return TRUE; case NPPM_INTERNAL_SAVECURRENTSESSION: { @@ -544,21 +534,21 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa Session currentSession; getCurrentOpenedFiles(currentSession, true); nppParam->writeSession(currentSession); - } + } + return TRUE; } - return TRUE; case NPPM_INTERNAL_RELOADNATIVELANG: { reloadLang(); + return TRUE; } - return TRUE; case NPPM_INTERNAL_RELOADSTYLERS: { loadStyles(); + return TRUE; } - return TRUE; case NPPM_INTERNAL_PLUGINSHORTCUTMOTIFIED: { @@ -567,8 +557,8 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa scnN.nmhdr.hwndFrom = (void *)lParam; // ShortcutKey structure scnN.nmhdr.idFrom = (uptr_t)wParam; // cmdID _pluginsManager.notify(&scnN); + return TRUE; } - return TRUE; case NPPM_GETSHORTCUTBYCMDID: { @@ -578,15 +568,17 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return _pluginsManager.getShortcutByCmdID(cmdID, sk); } - case NPPM_MENUCOMMAND : + case NPPM_MENUCOMMAND: + { command(lParam); return TRUE; + } - case NPPM_GETFULLCURRENTPATH : - case NPPM_GETCURRENTDIRECTORY : - case NPPM_GETFILENAME : - case NPPM_GETNAMEPART : - case NPPM_GETEXTPART : + case NPPM_GETFULLCURRENTPATH: + case NPPM_GETCURRENTDIRECTORY: + case NPPM_GETFILENAME: + case NPPM_GETNAMEPART: + case NPPM_GETEXTPART: { TCHAR str[MAX_PATH]; // par defaut : NPPM_GETCURRENTDIRECTORY @@ -619,9 +611,9 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return TRUE; } - case NPPM_GETCURRENTWORD : + case NPPM_GETCURRENTWORD: { - const int strSize = CURRENTWORD_MAXLENGTH; + const int strSize = CURRENTWORD_MAXLENGTH; TCHAR str[strSize]; _pEditView->getGenericSelectedText((TCHAR *)str, strSize); @@ -645,7 +637,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return TRUE; } - case NPPM_GETNPPDIRECTORY : + case NPPM_GETNPPDIRECTORY: { const int strSize = MAX_PATH; TCHAR str[strSize]; @@ -668,62 +660,64 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return TRUE; } - case NPPM_GETCURRENTLINE : + case NPPM_GETCURRENTLINE: { return _pEditView->getCurrentLineNumber(); } - case NPPM_GETCURRENTCOLUMN : + case NPPM_GETCURRENTCOLUMN: { return _pEditView->getCurrentColumnNumber(); } - case NPPM_GETCURRENTSCINTILLA : - { - if (_pEditView == &_mainEditView) - *((int *)lParam) = MAIN_VIEW; - else if (_pEditView == &_subEditView) - *((int *)lParam) = SUB_VIEW; - else - *((int *)lParam) = -1; - return TRUE; - } + case NPPM_GETCURRENTSCINTILLA: + { + if (_pEditView == &_mainEditView) + *((int *)lParam) = MAIN_VIEW; + else if (_pEditView == &_subEditView) + *((int *)lParam) = SUB_VIEW; + else + *((int *)lParam) = -1; + return TRUE; + } - case NPPM_GETCURRENTLANGTYPE : + case NPPM_GETCURRENTLANGTYPE: { *((LangType *)lParam) = _pEditView->getCurrentBuffer()->getLangType(); return TRUE; } - case NPPM_SETCURRENTLANGTYPE : + case NPPM_SETCURRENTLANGTYPE: { _pEditView->getCurrentBuffer()->setLangType((LangType)lParam); return TRUE; } - case NPPM_GETNBOPENFILES : + case NPPM_GETNBOPENFILES: { int nbDocPrimary = _mainDocTab.nbItem(); int nbDocSecond = _subDocTab.nbItem(); if (lParam == ALL_OPEN_FILES) return nbDocPrimary + nbDocSecond; else if (lParam == PRIMARY_VIEW) - return nbDocPrimary; + return nbDocPrimary; else if (lParam == SECOND_VIEW) - return nbDocSecond; + return nbDocSecond; } - case NPPM_GETOPENFILENAMESPRIMARY : - case NPPM_GETOPENFILENAMESSECOND : - case NPPM_GETOPENFILENAMES : + case NPPM_GETOPENFILENAMESPRIMARY: + case NPPM_GETOPENFILENAMESSECOND: + case NPPM_GETOPENFILENAMES: { - if (!wParam) return 0; + if (!wParam) + return 0; - TCHAR **fileNames = (TCHAR **)wParam; + TCHAR** fileNames = (TCHAR**) wParam; int nbFileNames = lParam; int j = 0; - if (Message != NPPM_GETOPENFILENAMESSECOND) { + if (Message != NPPM_GETOPENFILENAMESSECOND) + { for (int i = 0 ; i < _mainDocTab.nbItem() && j < nbFileNames ; ++i) { BufferID id = _mainDocTab.getBufferByIndex(i); @@ -731,7 +725,9 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa lstrcpy(fileNames[j++], buf->getFullPathName()); } } - if (Message != NPPM_GETOPENFILENAMESPRIMARY) { + + if (Message != NPPM_GETOPENFILENAMESPRIMARY) + { for (int i = 0 ; i < _subDocTab.nbItem() && j < nbFileNames ; ++i) { BufferID id = _subDocTab.getBufferByIndex(i); @@ -742,9 +738,11 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return j; } - case WM_GETTASKLISTINFO : + case WM_GETTASKLISTINFO: { - if (!wParam) return 0; + if (!wParam) + return 0; + TaskListInfo * tli = (TaskListInfo *)wParam; getTaskListInfo(tli); @@ -761,6 +759,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa } return TRUE; } + if (NppParameters::getInstance()->getNppGUI()._styleMRU) { tli->_currentIndex = 0; @@ -768,10 +767,10 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa } else { - for(int idx = 0; idx < (int)tli->_tlfsLst.size(); ++idx) + for (int idx = 0; idx < (int)tli->_tlfsLst.size(); ++idx) { if(tli->_tlfsLst[idx]._iView == currentView() && - tli->_tlfsLst[idx]._docIndex == _pDocTab->getCurrentTabIndex()) + tli->_tlfsLst[idx]._docIndex == _pDocTab->getCurrentTabIndex()) { tli->_currentIndex = idx; break; @@ -781,9 +780,9 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return TRUE; } - case WM_MOUSEWHEEL : + case WM_MOUSEWHEEL: { - if (LOWORD(wParam) & MK_RBUTTON) + if (0 != (LOWORD(wParam) & MK_RBUTTON)) { // redirect to the IDC_PREV_DOC or IDC_NEXT_DOC so that we have the unified process @@ -793,40 +792,43 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa } return TRUE; } - - case WM_APPCOMMAND : + + case WM_APPCOMMAND: { switch(GET_APPCOMMAND_LPARAM(lParam)) { - case APPCOMMAND_BROWSER_BACKWARD : - case APPCOMMAND_BROWSER_FORWARD : + case APPCOMMAND_BROWSER_BACKWARD: + case APPCOMMAND_BROWSER_FORWARD: + { int nbDoc = viewVisible(MAIN_VIEW)?_mainDocTab.nbItem():0; nbDoc += viewVisible(SUB_VIEW)?_subDocTab.nbItem():0; if (nbDoc > 1) activateNextDoc((GET_APPCOMMAND_LPARAM(lParam) == APPCOMMAND_BROWSER_FORWARD)?dirDown:dirUp); _linkTriggered = true; + break; + } } return ::DefWindowProc(hwnd, Message, wParam, lParam); } - case NPPM_GETNBSESSIONFILES : + case NPPM_GETNBSESSIONFILES: { const TCHAR *sessionFileName = (const TCHAR *)lParam; - if ((!sessionFileName) || (sessionFileName[0] == '\0')) return 0; + if ((!sessionFileName) || (sessionFileName[0] == '\0')) + return 0; Session session2Load; if (pNppParam->loadSession(session2Load, sessionFileName)) - { return session2Load.nbMainFiles() + session2Load.nbSubFiles(); - } return 0; } - - case NPPM_GETSESSIONFILES : + + case NPPM_GETSESSIONFILES: { const TCHAR *sessionFileName = (const TCHAR *)lParam; TCHAR **sessionFileArray = (TCHAR **)wParam; - if ((!sessionFileName) || (sessionFileName[0] == '\0')) return FALSE; + if ((!sessionFileName) || (sessionFileName[0] == '\0')) + return FALSE; Session session2Load; if (pNppParam->loadSession(session2Load, sessionFileName)) @@ -851,26 +853,22 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa case NPPM_DECODESCI: { // convert to ASCII - Utf8_16_Write UnicodeConvertor; - UINT length = 0; - char* buffer = NULL; ScintillaEditView *pSci; - if (wParam == MAIN_VIEW) pSci = &_mainEditView; else if (wParam == SUB_VIEW) pSci = &_subEditView; else return -1; - // get text of current scintilla - length = pSci->execute(SCI_GETTEXTLENGTH, 0, 0) + 1; - buffer = new char[length]; + UINT length = pSci->execute(SCI_GETTEXTLENGTH, 0, 0) + 1; + char* buffer = new char[length]; pSci->execute(SCI_GETTEXT, length, (LPARAM)buffer); - // convert here + // convert here UniMode unicodeMode = pSci->getCurrentBuffer()->getUnicodeMode(); + Utf8_16_Write UnicodeConvertor; UnicodeConvertor.setEncoding(unicodeMode); length = UnicodeConvertor.convert(buffer, length-1); @@ -893,11 +891,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa case NPPM_ENCODESCI: { // convert - Utf8_16_Read UnicodeConvertor; - UINT length = 0; - char* buffer = NULL; ScintillaEditView *pSci; - if (wParam == MAIN_VIEW) pSci = &_mainEditView; else if (wParam == SUB_VIEW) @@ -906,18 +900,17 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return -1; // get text of current scintilla - length = pSci->execute(SCI_GETTEXTLENGTH, 0, 0) + 1; - buffer = new char[length]; + UINT length = pSci->execute(SCI_GETTEXTLENGTH, 0, 0) + 1; + char* buffer = new char[length]; pSci->execute(SCI_GETTEXT, length, (LPARAM)buffer); + Utf8_16_Read UnicodeConvertor; length = UnicodeConvertor.convert(buffer, length-1); // set text in target pSci->execute(SCI_CLEARALL); pSci->addText(length, UnicodeConvertor.getNewBuf()); - - pSci->execute(SCI_EMPTYUNDOBUFFER); // set cursor position @@ -933,7 +926,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return um; } - case NPPM_ACTIVATEDOC : + case NPPM_ACTIVATEDOC: case NPPM_TRIGGERTABBARCONTEXTMENU: { // similar to NPPM_ACTIVEDOC @@ -968,7 +961,9 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa for (int i = 0 ; verStr[i] ; ++i) { if (verStr[i] == '.') + { isDot = true; + } else { if (!isDot) @@ -977,6 +972,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa auxVerStr[k++] = verStr[i]; } } + mainVerStr[j] = '\0'; auxVerStr[k] = '\0'; @@ -990,17 +986,24 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return MAKELONG(auxVer, mainVer); } - case WM_GETCURRENTMACROSTATUS : - if (_recordingMacro) return MACRO_RECORDING_IN_PROGRESS; + case WM_GETCURRENTMACROSTATUS: + { + if (_recordingMacro) + return MACRO_RECORDING_IN_PROGRESS; return (_macro.empty())?0:MACRO_RECORDING_HAS_STOPPED; + } case WM_FRSAVE_INT: + { _macro.push_back(recordedMacroStep(wParam, 0, lParam, NULL, recordedMacroStep::mtSavedSnR)); break; + } case WM_FRSAVE_STR: + { _macro.push_back(recordedMacroStep(wParam, 0, 0, (const TCHAR *)lParam, recordedMacroStep::mtSavedSnR)); break; + } case WM_MACRODLGRUNMACRO: { @@ -1008,18 +1011,12 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa { int times = 1; if (_runMacroDlg.getMode() == RM_RUN_MULTI) - { times = _runMacroDlg.getTimes(); - } else if (_runMacroDlg.getMode() == RM_RUN_EOF) - { times = -1; - } else - { break; - } - + int counter = 0; int lastLine = int(_pEditView->execute(SCI_GETLINECOUNT)) - 1; int currLine = _pEditView->getCurrentLineNumber(); @@ -1036,13 +1033,14 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa } _pEditView->execute(SCI_BEGINUNDOACTION); - for(;;) + for (;;) { macroPlayback(m); ++counter; if ( times >= 0 ) { - if ( counter >= times ) break; + if ( counter >= times ) + break; } else // run until eof { @@ -1063,17 +1061,19 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa currLine += deltaCurrLine; // eof? - if ((currLine >= lastLine) || (currLine < 0) + if ((currLine >= lastLine) || (currLine < 0) || ((deltaCurrLine == 0) && (currLine == 0) && ((deltaLastLine >= 0) || cursorMovedUp))) + { break; + } } } _pEditView->execute(SCI_ENDUNDOACTION); } + break; } - break; - case NPPM_CREATESCINTILLAHANDLE : + case NPPM_CREATESCINTILLAHANDLE: { return (LRESULT)_scintillaCtrls4Plugins.createSintilla((lParam == NULL?_pPublicInterface->getHSelf():(HWND)lParam)); } @@ -1089,20 +1089,19 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return TRUE; } - - case NPPM_DESTROYSCINTILLAHANDLE : + case NPPM_DESTROYSCINTILLAHANDLE: { return _scintillaCtrls4Plugins.destroyScintilla((HWND)lParam); } - case NPPM_GETNBUSERLANG : + case NPPM_GETNBUSERLANG: { if (lParam) *((int *)lParam) = IDM_LANG_USER; return pNppParam->getNbUserLang(); } - case NPPM_GETCURRENTDOCINDEX : + case NPPM_GETCURRENTDOCINDEX: { if (lParam == SUB_VIEW) { @@ -1118,7 +1117,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa } } - case NPPM_SETSTATUSBAR : + case NPPM_SETSTATUSBAR: { TCHAR *str2set = (TCHAR *)lParam; if (!str2set || !str2set[0]) @@ -1126,12 +1125,12 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa switch (wParam) { - case STATUSBAR_DOC_TYPE : - case STATUSBAR_DOC_SIZE : - case STATUSBAR_CUR_POS : - case STATUSBAR_EOF_FORMAT : - case STATUSBAR_UNICODE_TYPE : - case STATUSBAR_TYPING_MODE : + case STATUSBAR_DOC_TYPE: + case STATUSBAR_DOC_SIZE: + case STATUSBAR_CUR_POS: + case STATUSBAR_EOF_FORMAT: + case STATUSBAR_UNICODE_TYPE: + case STATUSBAR_TYPING_MODE: _statusBar.setText(str2set, wParam); return TRUE; default : @@ -1139,7 +1138,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa } } - case NPPM_GETMENUHANDLE : + case NPPM_GETMENUHANDLE: { if (wParam == NPPPLUGINMENU) return (LRESULT)_pluginsManager.getMenuHandle(); @@ -1149,54 +1148,54 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return NULL; } - case NPPM_LOADSESSION : + case NPPM_LOADSESSION: { fileLoadSession((const TCHAR *)lParam); return TRUE; } - case NPPM_SAVECURRENTSESSION : + case NPPM_SAVECURRENTSESSION: { return (LRESULT)fileSaveSession(0, NULL, (const TCHAR *)lParam); } - case NPPM_SAVESESSION : + case NPPM_SAVESESSION: { sessionInfo *pSi = (sessionInfo *)lParam; return (LRESULT)fileSaveSession(pSi->nbFile, pSi->files, pSi->sessionFilePathName); } - case NPPM_INTERNAL_CLEARSCINTILLAKEY : + case NPPM_INTERNAL_CLEARSCINTILLAKEY: { _mainEditView.execute(SCI_CLEARCMDKEY, wParam); _subEditView.execute(SCI_CLEARCMDKEY, wParam); - return TRUE; + return TRUE; } - case NPPM_INTERNAL_BINDSCINTILLAKEY : + case NPPM_INTERNAL_BINDSCINTILLAKEY: { _mainEditView.execute(SCI_ASSIGNCMDKEY, wParam, lParam); _subEditView.execute(SCI_ASSIGNCMDKEY, wParam, lParam); - return TRUE; } - case NPPM_INTERNAL_CMDLIST_MODIFIED : + + case NPPM_INTERNAL_CMDLIST_MODIFIED: { //changeMenuShortcut(lParam, (const TCHAR *)wParam); ::DrawMenuBar(_pPublicInterface->getHSelf()); return TRUE; } - case NPPM_INTERNAL_MACROLIST_MODIFIED : + case NPPM_INTERNAL_MACROLIST_MODIFIED: { return TRUE; } - case NPPM_INTERNAL_USERCMDLIST_MODIFIED : + case NPPM_INTERNAL_USERCMDLIST_MODIFIED: { return TRUE; } - case NPPM_INTERNAL_SETCARETWIDTH : + case NPPM_INTERNAL_SETCARETWIDTH: { NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); @@ -1225,15 +1224,15 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return TRUE; } - case NPPM_INTERNAL_SETMULTISELCTION : - { - NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); - _mainEditView.execute(SCI_SETMULTIPLESELECTION, nppGUI._enableMultiSelection); + case NPPM_INTERNAL_SETMULTISELCTION: + { + NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); + _mainEditView.execute(SCI_SETMULTIPLESELECTION, nppGUI._enableMultiSelection); _subEditView.execute(SCI_SETMULTIPLESELECTION, nppGUI._enableMultiSelection); - return TRUE; - } + return TRUE; + } - case NPPM_INTERNAL_SETCARETBLINKRATE : + case NPPM_INTERNAL_SETCARETBLINKRATE: { NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); _mainEditView.execute(SCI_SETCARETPERIOD, nppGUI._caretBlinkRate); @@ -1241,38 +1240,46 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return TRUE; } - case NPPM_INTERNAL_ISTABBARREDUCED : + case NPPM_INTERNAL_ISTABBARREDUCED: { return _toReduceTabBar?TRUE:FALSE; } // ADD: success->hwnd; failure->NULL // REMOVE: success->NULL; failure->hwnd - case NPPM_MODELESSDIALOG : + case NPPM_MODELESSDIALOG: { if (wParam == MODELESSDIALOGADD) { for (size_t i = 0, len = _hModelessDlgs.size() ; i < len ; ++i) + { if (_hModelessDlgs[i] == (HWND)lParam) return NULL; + } + _hModelessDlgs.push_back((HWND)lParam); return lParam; } - else if (wParam == MODELESSDIALOGREMOVE) + else { - for (size_t i = 0, len = _hModelessDlgs.size(); i < len ; ++i) - if (_hModelessDlgs[i] == (HWND)lParam) + if (wParam == MODELESSDIALOGREMOVE) + { + for (size_t i = 0, len = _hModelessDlgs.size(); i < len ; ++i) { - vector::iterator hDlg = _hModelessDlgs.begin() + i; - _hModelessDlgs.erase(hDlg); - return NULL; + if (_hModelessDlgs[i] == (HWND)lParam) + { + vector::iterator hDlg = _hModelessDlgs.begin() + i; + _hModelessDlgs.erase(hDlg); + return NULL; + } } - return lParam; + return lParam; + } } return TRUE; } - case WM_CONTEXTMENU : + case WM_CONTEXTMENU: { if (pNppParam->_isTaskListRBUTTONUP_Active) { @@ -1282,15 +1289,15 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa { if ((HWND(wParam) == _mainEditView.getHSelf()) || (HWND(wParam) == _subEditView.getHSelf())) { - if ((HWND(wParam) == _mainEditView.getHSelf())) { + if ((HWND(wParam) == _mainEditView.getHSelf())) switchEditViewTo(MAIN_VIEW); - } else { + else switchEditViewTo(SUB_VIEW); - } + POINT p; ::GetCursorPos(&p); ContextMenu scintillaContextmenu; - vector & tmp = pNppParam->getContextMenuItems(); + std::vector& tmp = pNppParam->getContextMenuItems(); scintillaContextmenu.create(_pPublicInterface->getHSelf(), tmp, _mainMenuHandle); scintillaContextmenu.display(p); return TRUE; @@ -1314,12 +1321,12 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa notification->wParam = LINKTRIGGERED; _pluginsManager.notify(notification); - + return notify(notification); } - case NPPM_INTERNAL_CHECKDOCSTATUS : - case WM_ACTIVATEAPP : + case NPPM_INTERNAL_CHECKDOCSTATUS: + case WM_ACTIVATEAPP: { if (wParam == TRUE) // if npp is about to be activated { @@ -1334,12 +1341,12 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa break; } - case NPPM_INTERNAL_GETCHECKDOCOPT : + case NPPM_INTERNAL_GETCHECKDOCOPT: { return (LRESULT)((NppGUI &)(pNppParam->getNppGUI()))._fileAutoDetection; } - case NPPM_INTERNAL_SETCHECKDOCOPT : + case NPPM_INTERNAL_SETCHECKDOCOPT: { // If nothing is changed by user, then we allow to set this value if (((NppGUI &)(pNppParam->getNppGUI()))._fileAutoDetection == ((NppGUI &)(pNppParam->getNppGUI()))._fileAutoDetectionOriginalValue) @@ -1347,7 +1354,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return TRUE; } - case NPPM_GETPOSFROMBUFFERID : + case NPPM_GETPOSFROMBUFFERID: { int i; @@ -1384,11 +1391,11 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return -1; } - case NPPM_GETFULLPATHFROMBUFFERID : + case NPPM_GETFULLPATHFROMBUFFERID: { return MainFileManager->getFileNameFromBuffer((BufferID)wParam, (TCHAR *)lParam); } - + case NPPM_INTERNAL_ENABLECHECKDOCOPT: { NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); @@ -1403,10 +1410,12 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return TRUE; } - - case WM_ACTIVATE : + + case WM_ACTIVATE: + { _pEditView->getFocus(); return TRUE; + } case WM_DROPFILES: { @@ -1422,7 +1431,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa _subEditView.defineDocType(_subEditView.getCurrentBuffer()->getLangType()); _subEditView.performGlobalStyles(); - + _findReplaceDlg.updateFinderScintilla(); drawTabbarColoursFromStylerArray(); @@ -1465,20 +1474,21 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa _pProjectPanel_1->setBackgroundColor(style._bgColor); _pProjectPanel_1->setForegroundColor(style._fgColor); } + if (_pProjectPanel_2) { _pProjectPanel_2->setBackgroundColor(style._bgColor); _pProjectPanel_2->setForegroundColor(style._fgColor); } + if (_pProjectPanel_3) { _pProjectPanel_3->setBackgroundColor(style._bgColor); _pProjectPanel_3->setForegroundColor(style._fgColor); } + if (_pDocMap) - { _pDocMap->setSyntaxHiliting(); - } // Notify plugins of update to styles xml SCNotification scnN; @@ -1496,87 +1506,84 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa { SendMessage(_pPublicInterface->getHSelf(), WM_SYSCOMMAND, SC_MINIMIZE, 0); } - else - { + else + { SCNotification scnN; scnN.nmhdr.code = NPPN_BEFORESHUTDOWN; scnN.nmhdr.hwndFrom = _pPublicInterface->getHSelf(); scnN.nmhdr.idFrom = 0; _pluginsManager.notify(&scnN); - if (_pTrayIco) - _pTrayIco->doTrayIcon(REMOVE); + if (_pTrayIco) + _pTrayIco->doTrayIcon(REMOVE); + + const NppGUI & nppgui = pNppParam->getNppGUI(); - const NppGUI & nppgui = pNppParam->getNppGUI(); - bool isSnapshotMode = nppgui.isSnapshotMode(); if (isSnapshotMode) + { ::LockWindowUpdate(_pPublicInterface->getHSelf()); - - if (isSnapshotMode) MainFileManager->backupCurrentBuffer(); + } - Session currentSession; - if (nppgui._rememberLastSession) - { - getCurrentOpenedFiles(currentSession, true); - //Lock the recent file list so it isnt populated with opened files - //Causing them to show on restart even though they are loaded by session - _lastRecentFileList.setLock(true); //only lock when the session is remembered - } + Session currentSession; + if (nppgui._rememberLastSession) + { + getCurrentOpenedFiles(currentSession, true); + //Lock the recent file list so it isnt populated with opened files + //Causing them to show on restart even though they are loaded by session + _lastRecentFileList.setLock(true); //only lock when the session is remembered + } bool allClosed = fileCloseAll(false, isSnapshotMode); //try closing files before doing anything else - - if (nppgui._rememberLastSession) - { - _lastRecentFileList.setLock(false); //only lock when the session is remembered - } - if (!allClosed) - { - //User cancelled the shutdown + if (nppgui._rememberLastSession) + _lastRecentFileList.setLock(false); //only lock when the session is remembered + + if (!allClosed) + { + //User cancelled the shutdown scnN.nmhdr.code = NPPN_CANCELSHUTDOWN; _pluginsManager.notify(&scnN); + return FALSE; + } - return FALSE; - } + if (_beforeSpecialView.isFullScreen) //closing, return to windowed mode + fullScreenToggle(); + if (_beforeSpecialView.isPostIt) //closing, return to windowed mode + postItToggle(); - if (_beforeSpecialView.isFullScreen) //closing, return to windowed mode - fullScreenToggle(); - if (_beforeSpecialView.isPostIt) //closing, return to windowed mode - postItToggle(); + if (_configStyleDlg.isCreated() && ::IsWindowVisible(_configStyleDlg.getHSelf())) + _configStyleDlg.restoreGlobalOverrideValues(); - if (_configStyleDlg.isCreated() && ::IsWindowVisible(_configStyleDlg.getHSelf())) - _configStyleDlg.restoreGlobalOverrideValues(); + scnN.nmhdr.code = NPPN_SHUTDOWN; + _pluginsManager.notify(&scnN); - scnN.nmhdr.code = NPPN_SHUTDOWN; - _pluginsManager.notify(&scnN); - - saveFindHistory(); //writeFindHistory - _lastRecentFileList.saveLRFL(); //writeRecentFileHistorySettings, writeHistory - saveScintillaParams(); //writeScintillaParams - saveGUIParams(); //writeGUIParams + saveFindHistory(); //writeFindHistory + _lastRecentFileList.saveLRFL(); //writeRecentFileHistorySettings, writeHistory + saveScintillaParams(); //writeScintillaParams + saveGUIParams(); //writeGUIParams saveProjectPanelsParams(); //writeProjectPanelsSettings // // saving config.xml // pNppParam->saveConfig_xml(); - + // // saving userDefineLang.xml // - saveUserDefineLangs(); - + saveUserDefineLangs(); + // // saving shortcuts.xml // - saveShortcuts(); + saveShortcuts(); // // saving session.xml // - if (nppgui._rememberLastSession && !nppgui._isCmdlineNosessionActivated) - saveSession(currentSession); + if (nppgui._rememberLastSession && !nppgui._isCmdlineNosessionActivated) + saveSession(currentSession); // write settings on cloud if enabled, if the settings files don't exist if (nppgui._cloudPath != TEXT("") && pNppParam->isCloudPathChanged()) @@ -1596,11 +1603,12 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa if (not isSnapshotMode) ::LockWindowUpdate(_pPublicInterface->getHSelf()); - //Sends WM_DESTROY, Notepad++ will end + //Sends WM_DESTROY, Notepad++ will end if (Message == WM_CLOSE) ::DestroyWindow(hwnd); - ::LockWindowUpdate(NULL); + if (not isSnapshotMode) + ::LockWindowUpdate(NULL); } return TRUE; } @@ -1613,8 +1621,8 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa } case WM_DESTROY: - { - killAllChildren(); + { + killAllChildren(); ::PostQuitMessage(0); _pPublicInterface->gNppHWND = NULL; return TRUE; @@ -1625,14 +1633,14 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); if ((nppgui._isMinimizedToTray || _pPublicInterface->isPrelaunch()) && (wParam == SC_MINIMIZE)) { - if (!_pTrayIco) + if (nullptr == _pTrayIco) _pTrayIco = new trayIconControler(_pPublicInterface->getHSelf(), IDI_M30ICON, IDC_MINIMIZED_TRAY, ::LoadIcon(_pPublicInterface->getHinst(), MAKEINTRESOURCE(IDI_M30ICON)), TEXT("")); _pTrayIco->doTrayIcon(ADD); ::ShowWindow(hwnd, SW_HIDE); return TRUE; } - + if (wParam == SC_KEYMENU && lParam == VK_SPACE) { _sysMenuEntering = true; @@ -1657,33 +1665,36 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa { //case WM_LBUTTONDBLCLK: case WM_LBUTTONUP : + { _pEditView->getFocus(); ::ShowWindow(_pPublicInterface->getHSelf(), SW_SHOW); if (!_pPublicInterface->isPrelaunch()) _pTrayIco->doTrayIcon(REMOVE); ::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, 0, 0); return TRUE; + } case WM_MBUTTONUP: + { command(IDM_SYSTRAYPOPUP_NEW_AND_PASTE); return TRUE; + } - case WM_RBUTTONUP: - { - POINT p; - GetCursorPos(&p); + case WM_RBUTTONUP: + { + POINT p; + GetCursorPos(&p); - HMENU hmenu; // menu template - HMENU hTrayIconMenu; // shortcut menu + HMENU hmenu; // menu template + HMENU hTrayIconMenu; // shortcut menu hmenu = ::LoadMenu(_pPublicInterface->getHinst(), MAKEINTRESOURCE(IDR_SYSTRAYPOPUP_MENU)); - hTrayIconMenu = ::GetSubMenu(hmenu, 0); + hTrayIconMenu = ::GetSubMenu(hmenu, 0); SetForegroundWindow(_pPublicInterface->getHSelf()); TrackPopupMenu(hTrayIconMenu, TPM_LEFTALIGN, p.x, p.y, 0, _pPublicInterface->getHSelf(), NULL); PostMessage(_pPublicInterface->getHSelf(), WM_NULL, 0, 0); - DestroyMenu(hmenu); - return TRUE; - } - + DestroyMenu(hmenu); + return TRUE; + } } return TRUE; } @@ -1726,21 +1737,24 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa case NPPM_DMMGETPLUGINHWNDBYNAME : //(const TCHAR *windowName, const TCHAR *moduleName) { - if (!lParam) return NULL; + if (!lParam) + return NULL; TCHAR *moduleName = (TCHAR *)lParam; TCHAR *windowName = (TCHAR *)wParam; - vector dockContainer = _dockingManager.getContainerInfo(); + std::vector dockContainer = _dockingManager.getContainerInfo(); + for (size_t i = 0, len = dockContainer.size(); i < len ; ++i) { - vector tbData = dockContainer[i]->getDataOfAllTb(); + std::vector tbData = dockContainer[i]->getDataOfAllTb(); for (size_t j = 0, len2 = tbData.size() ; j < len2 ; ++j) { if (generic_stricmp(moduleName, tbData[j]->pszModuleName) == 0) { if (!windowName) return (LRESULT)tbData[j]->hClient; - else if (generic_stricmp(windowName, tbData[j]->pszName) == 0) + + if (generic_stricmp(windowName, tbData[j]->pszName) == 0) return (LRESULT)tbData[j]->hClient; } } @@ -1766,34 +1780,34 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return (NppParameters::getInstance())->getWinVersion(); } - case NPPM_MAKECURRENTBUFFERDIRTY : + case NPPM_MAKECURRENTBUFFERDIRTY: { _pEditView->getCurrentBuffer()->setDirty(true); return TRUE; } - case NPPM_GETENABLETHEMETEXTUREFUNC : + case NPPM_GETENABLETHEMETEXTUREFUNC: { return (LRESULT)pNppParam->getEnableThemeDlgTexture(); } - case NPPM_GETPLUGINSCONFIGDIR : + case NPPM_GETPLUGINSCONFIGDIR: { if (!lParam || !wParam) return FALSE; generic_string pluginsConfigDirPrefix = pNppParam->getAppDataNppDir(); - + if (pluginsConfigDirPrefix == TEXT("")) pluginsConfigDirPrefix = pNppParam->getNppPath(); const TCHAR *secondPart = TEXT("plugins\\Config"); - + size_t len = wParam; if (len < pluginsConfigDirPrefix.length() + lstrlen(secondPart)) return FALSE; - TCHAR *pluginsConfigDir = (TCHAR *)lParam; + TCHAR *pluginsConfigDir = (TCHAR *)lParam; lstrcpy(pluginsConfigDir, pluginsConfigDirPrefix.c_str()); ::PathAppend(pluginsConfigDir, secondPart); @@ -1806,15 +1820,21 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa } case NPPM_ALLOCATESUPPORTED: + { return TRUE; + } case NPPM_ALLOCATECMDID: + { return _pluginsManager.allocateCmdID(wParam, reinterpret_cast(lParam)); + } case NPPM_ALLOCATEMARKER: + { return _pluginsManager.allocateMarker(wParam, reinterpret_cast(lParam)); + } - case NPPM_HIDETABBAR : + case NPPM_HIDETABBAR: { bool hide = (lParam != 0); bool oldVal = DocTabView::getHideTabBarStatus(); @@ -1831,13 +1851,13 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return oldVal; } - case NPPM_ISTABBARHIDDEN : + + case NPPM_ISTABBARHIDDEN: { return _mainDocTab.getHideTabBarStatus(); } - - case NPPM_HIDETOOLBAR : + case NPPM_HIDETOOLBAR: { bool show = (lParam != TRUE); bool currentStatus = _rebarTop.getIDVisible(REBAR_BAR_TOOLBAR); @@ -1845,12 +1865,13 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa _rebarTop.setIDVisible(REBAR_BAR_TOOLBAR, show); return currentStatus; } + case NPPM_ISTOOLBARHIDDEN : { return !_rebarTop.getIDVisible(REBAR_BAR_TOOLBAR); } - case NPPM_HIDEMENU : + case NPPM_HIDEMENU: { bool hide = (lParam == TRUE); bool isHidden = ::GetMenu(_pPublicInterface->getHSelf()) == NULL; @@ -1866,7 +1887,8 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return isHidden; } - case NPPM_ISMENUHIDDEN : + + case NPPM_ISMENUHIDDEN: { return (::GetMenu(_pPublicInterface->getHSelf()) == NULL); } @@ -1877,82 +1899,59 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); bool oldVal = nppGUI._statusBarShow; if (show == oldVal) - { return oldVal; - } - RECT rc; + + RECT rc; _pPublicInterface->getClientRect(rc); - + nppGUI._statusBarShow = show; _statusBar.display(nppGUI._statusBarShow); - ::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); - return oldVal; - } + ::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); + return oldVal; + } - case NPPM_ISSTATUSBARHIDDEN : + case NPPM_ISSTATUSBARHIDDEN: { NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); return !nppGUI._statusBarShow; } - case NPPM_GETCURRENTVIEW : + case NPPM_GETCURRENTVIEW: { return _activeView; } -/* - case NPPM_ADDREBAR : - { - if (!lParam) - return FALSE; - _rebarTop.addBand((REBARBANDINFO*)lParam, false); - return TRUE; - } - case NPPM_UPDATEREBAR : - { - if (!lParam || wParam < REBAR_BAR_EXTERNAL) - return FALSE; - _rebarTop.reNew((int)wParam, (REBARBANDINFO*)lParam); - return TRUE; - } - - case NPPM_REMOVEREBAR : - { - if (wParam < REBAR_BAR_EXTERNAL) - return FALSE; - _rebarTop.removeBand((int)wParam); - return TRUE; - } -*/ - case NPPM_INTERNAL_ISFOCUSEDTAB : + case NPPM_INTERNAL_ISFOCUSEDTAB: { HWND hTabToTest = (currentView() == MAIN_VIEW)?_mainDocTab.getHSelf():_subDocTab.getHSelf(); return (HWND)lParam == hTabToTest; } - case NPPM_INTERNAL_GETMENU : + case NPPM_INTERNAL_GETMENU: { return (LRESULT)_mainMenuHandle; } - - case NPPM_INTERNAL_CLEARINDICATOR : + + case NPPM_INTERNAL_CLEARINDICATOR: { _pEditView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_SMART); return TRUE; } - case NPPM_INTERNAL_CLEARINDICATORTAGMATCH : + + case NPPM_INTERNAL_CLEARINDICATORTAGMATCH: { _pEditView->clearIndicator(SCE_UNIVERSAL_TAGMATCH); _pEditView->clearIndicator(SCE_UNIVERSAL_TAGATTR); return TRUE; } - case NPPM_INTERNAL_CLEARINDICATORTAGATTR : + + case NPPM_INTERNAL_CLEARINDICATORTAGATTR: { _pEditView->clearIndicator(SCE_UNIVERSAL_TAGATTR); return TRUE; } - case NPPM_INTERNAL_SWITCHVIEWFROMHWND : + case NPPM_INTERNAL_SWITCHVIEWFROMHWND: { HWND handle = (HWND)lParam; if (_mainEditView.getHSelf() == handle || _mainDocTab.getHSelf() == handle) @@ -1966,20 +1965,20 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return TRUE; } - case NPPM_INTERNAL_UPDATETITLEBAR : + case NPPM_INTERNAL_UPDATETITLEBAR: { setTitle(); return TRUE; } - case NPPM_INTERNAL_DISABLEAUTOUPDATE : + case NPPM_INTERNAL_DISABLEAUTOUPDATE: { //printStr(TEXT("you've got me")); NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); nppGUI._autoUpdateOpt._doAutoUpdate = false; return TRUE; } - + case NPPM_GETLANGUAGENAME: { generic_string langName = getLangDesc((LangType)wParam, true); @@ -2013,13 +2012,9 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa case NPPM_GETEDITORDEFAULTFOREGROUNDCOLOR: case NPPM_GETEDITORDEFAULTBACKGROUNDCOLOR: { - return (Message == NPPM_GETEDITORDEFAULTFOREGROUNDCOLOR?(NppParameters::getInstance())->getCurrentDefaultFgColor():(NppParameters::getInstance())->getCurrentDefaultBgColor()); - /* - StyleArray & globalStyles = (NppParameters::getInstance())->getGlobalStylers(); - int i = globalStyles.getStylerIndexByID(STYLE_DEFAULT); - Style & style = globalStyles.getStyler(i); - return (Message == NPPM_GETEDITORDEFAULTFOREGROUNDCOLOR?style._fgColor:style._bgColor); - */ + return (Message == NPPM_GETEDITORDEFAULTFOREGROUNDCOLOR + ?(NppParameters::getInstance())->getCurrentDefaultFgColor() + :(NppParameters::getInstance())->getCurrentDefaultBgColor()); } case NPPM_SHOWDOCSWITCHER: @@ -2067,8 +2062,8 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa _lastRecentFileList.setUserMaxNbLRF(pNppParam->getNbMaxRecentFile()); break; } - - case NPPM_INTERNAL_SETTING_EDGE_SIZE : + + case NPPM_INTERNAL_SETTING_EDGE_SIZE: { ScintillaViewParams & svp = (ScintillaViewParams &)(NppParameters::getInstance())->getSVP(); _mainEditView.execute(SCI_SETEDGECOLUMN, svp._edgeNbColumn); @@ -2079,7 +2074,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa case NPPM_INTERNAL_SETTING_TAB_REPLCESPACE: case NPPM_INTERNAL_SETTING_TAB_SIZE: { - _pEditView->setTabSettings(_pEditView->getCurrentBuffer()->getCurrentLang()); + _pEditView->setTabSettings(_pEditView->getCurrentBuffer()->getCurrentLang()); break; } @@ -2107,7 +2102,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); if (!nppgui._menuBarShow && !wParam && !_sysMenuEntering) ::SetMenu(_pPublicInterface->getHSelf(), _mainMenuHandle); - + return TRUE; } @@ -2122,8 +2117,6 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa case WM_DPICHANGED: { - //printInt(LOWORD(wParam)); - //printInt(HIWORD(wParam)); return TRUE; } @@ -2135,9 +2128,12 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa switch (nmdlg->type) { case WDT_ACTIVATE: + { activateDoc(nmdlg->curSel); nmdlg->processed = TRUE; break; + } + case WDT_SAVE: { //loop through nmdlg->nItems, get index and save it @@ -2146,51 +2142,52 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa fileSave(_pDocTab->getBufferByIndex(i)); } nmdlg->processed = TRUE; + break; } - break; + case WDT_CLOSE: { - bool closed; - //loop through nmdlg->nItems, get index and close it for (int i = 0; i < (int)nmdlg->nItems; ++i) - { - closed = fileClose(_pDocTab->getBufferByIndex(nmdlg->Items[i]), currentView()); + { + bool closed = fileClose(_pDocTab->getBufferByIndex(nmdlg->Items[i]), currentView()); UINT pos = nmdlg->Items[i]; // The window list only needs to be rearranged when the file was actually closed if (closed) - { + { nmdlg->Items[i] = 0xFFFFFFFF; // indicate file was closed // Shift the remaining items downward to fill the gap for (int j = i + 1; j < (int)nmdlg->nItems; ++j) - { + { if (nmdlg->Items[j] > pos) - { nmdlg->Items[j]--; - } } } } nmdlg->processed = TRUE; + break; } - break; + case WDT_SORT: + { if (nmdlg->nItems != (unsigned int)_pDocTab->nbItem()) //sanity check, if mismatch just abort break; + //Collect all buffers std::vector tempBufs; - for(int i = 0; i < (int)nmdlg->nItems; ++i) + for (int i = 0; i < (int)nmdlg->nItems; ++i) { tempBufs.push_back(_pDocTab->getBufferByIndex(i)); } //Reset buffers - for(int i = 0; i < (int)nmdlg->nItems; ++i) + for (int i = 0; i < (int)nmdlg->nItems; ++i) { _pDocTab->setBuffer(i, tempBufs[nmdlg->Items[i]]); } activateBuffer(_pDocTab->getBufferByIndex(_pDocTab->getCurrentTabIndex()), currentView()); break; + } } return TRUE; } diff --git a/PowerEditor/src/NppCommands.cpp b/PowerEditor/src/NppCommands.cpp index cc1d328d9..af04ab025 100644 --- a/PowerEditor/src/NppCommands.cpp +++ b/PowerEditor/src/NppCommands.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -55,7 +55,7 @@ void Notepad_plus::macroPlayback(Macro macro) _pEditView->execute(SCI_ENDUNDOACTION); } -void Notepad_plus::command(int id) +void Notepad_plus::command(int id) { switch (id) { @@ -127,7 +127,7 @@ void Notepad_plus::command(int id) checkDocState(); break; } - + case IDM_FILE_CLOSEALL_BUT_CURRENT : fileCloseAllButCurrent(); checkDocState(); @@ -234,12 +234,12 @@ void Notepad_plus::command(int id) unsigned char *lpucharCopy = (unsigned char *)GlobalLock(hglbCopy); memcpy(lpucharCopy, pBinText, textLen * sizeof(unsigned char)); lpucharCopy[textLen] = 0; // null character - + GlobalUnlock(hglbCopy); - + // Place the handle on the clipboard. SetClipboardData(CF_TEXT, hglbCopy); - + // Allocate a global memory object for the text length. HGLOBAL hglbLenCopy = GlobalAlloc(GMEM_MOVEABLE, sizeof(unsigned long)); @@ -248,13 +248,13 @@ void Notepad_plus::command(int id) CloseClipboard(); return; } - - // Lock the handle and copy the text to the buffer. - unsigned long *lpLenCopy = (unsigned long *)GlobalLock(hglbLenCopy); + + // Lock the handle and copy the text to the buffer. + unsigned long *lpLenCopy = (unsigned long *)GlobalLock(hglbLenCopy); *lpLenCopy = textLen; - - GlobalUnlock(hglbLenCopy); - + + GlobalUnlock(hglbLenCopy); + // Place the handle on the clipboard. UINT f = RegisterClipboardFormat(CF_NPPTEXTLEN); SetClipboardData(f, hglbLenCopy); @@ -276,33 +276,33 @@ void Notepad_plus::command(int id) break; case IDM_EDIT_PASTE_BINARY: - { + { LongRunningOperation op; if (!IsClipboardFormatAvailable(CF_TEXT)) return; if (!OpenClipboard(NULL)) - return; - - HGLOBAL hglb = GetClipboardData(CF_TEXT); - if (hglb != NULL) - { - char *lpchar = (char *)GlobalLock(hglb); - if (lpchar != NULL) + return; + + HGLOBAL hglb = GetClipboardData(CF_TEXT); + if (hglb != NULL) + { + char *lpchar = (char *)GlobalLock(hglb); + if (lpchar != NULL) { UINT cf_nppTextLen = RegisterClipboardFormat(CF_NPPTEXTLEN); if (IsClipboardFormatAvailable(cf_nppTextLen)) { - HGLOBAL hglbLen = GetClipboardData(cf_nppTextLen); - if (hglbLen != NULL) - { - unsigned long *lpLen = (unsigned long *)GlobalLock(hglbLen); - if (lpLen != NULL) + HGLOBAL hglbLen = GetClipboardData(cf_nppTextLen); + if (hglbLen != NULL) + { + unsigned long *lpLen = (unsigned long *)GlobalLock(hglbLen); + if (lpLen != NULL) { _pEditView->execute(SCI_REPLACESEL, 0, (LPARAM)""); _pEditView->execute(SCI_ADDTEXT, *lpLen, (LPARAM)lpchar); - GlobalUnlock(hglb); + GlobalUnlock(hglb); } } } @@ -311,7 +311,7 @@ void Notepad_plus::command(int id) _pEditView->execute(SCI_REPLACESEL, 0, (LPARAM)lpchar); } - GlobalUnlock(hglb); + GlobalUnlock(hglb); } } CloseClipboard(); @@ -325,27 +325,27 @@ void Notepad_plus::command(int id) LongRunningOperation op; UINT f = RegisterClipboardFormat(id==IDM_EDIT_PASTE_AS_HTML?CF_HTML:CF_RTF); - if (!IsClipboardFormatAvailable(f)) + if (!IsClipboardFormatAvailable(f)) return; - + if (!OpenClipboard(NULL)) - return; - - HGLOBAL hglb = GetClipboardData(f); - if (hglb != NULL) - { - LPSTR lptstr = (LPSTR)GlobalLock(hglb); - if (lptstr != NULL) - { - // Call the application-defined ReplaceSelection - // function to insert the text and repaint the - // window. + return; + + HGLOBAL hglb = GetClipboardData(f); + if (hglb != NULL) + { + LPSTR lptstr = (LPSTR)GlobalLock(hglb); + if (lptstr != NULL) + { + // Call the application-defined ReplaceSelection + // function to insert the text and repaint the + // window. _pEditView->execute(SCI_REPLACESEL, 0, (LPARAM)lptstr); - GlobalUnlock(hglb); + GlobalUnlock(hglb); } } - CloseClipboard(); + CloseClipboard(); } break; @@ -551,7 +551,7 @@ void Notepad_plus::command(int id) } } break; - + case IDM_VIEW_TAB1: case IDM_VIEW_TAB2: case IDM_VIEW_TAB3: @@ -613,10 +613,10 @@ void Notepad_plus::command(int id) // STOP !!! _mainEditView.execute(SCI_STOPRECORD); _subEditView.execute(SCI_STOPRECORD); - + _mainEditView.execute(SCI_SETCURSOR, (WPARAM)SC_CURSORNORMAL); _subEditView.execute(SCI_SETCURSOR, (WPARAM)SC_CURSORNORMAL); - + _recordingMacro = false; _runMacroDlg.initMacroList(); } @@ -646,13 +646,13 @@ void Notepad_plus::command(int id) { bool isFirstTime = !_runMacroDlg.isCreated(); _runMacroDlg.doDialog(_nativeLangSpeaker.isRTL()); - + if (isFirstTime) { _nativeLangSpeaker.changeDlgLang(_runMacroDlg.getHSelf(), "MultiMacro"); } break; - + } } break; @@ -693,7 +693,7 @@ void Notepad_plus::command(int id) TCHAR str[strSize]; bool isFirstTime = !_findReplaceDlg.isCreated(); - + DIALOG_TYPE dlgID = FIND_DLG; if (id == IDM_SEARCH_REPLACE) dlgID = REPLACE_DLG; @@ -898,7 +898,7 @@ void Notepad_plus::command(int id) break; } - + case IDM_SEARCH_GOPREVMARKER1 : case IDM_SEARCH_GOPREVMARKER2 : case IDM_SEARCH_GOPREVMARKER3 : @@ -1004,11 +1004,11 @@ void Notepad_plus::command(int id) case IDM_SEARCH_CLEAR_BOOKMARKS: bookmarkClearAll(); break; - + case IDM_LANG_USER_DLG : { bool isUDDlgVisible = false; - + UserDefineDialog *udd = _pEditView->getUserDefineDlg(); if (!udd->isCreated()) @@ -1034,7 +1034,7 @@ void Notepad_plus::command(int id) _pMainWindow = _pDocTab; ::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, 0, 0); - + udd->display(false); _mainWindowStatus &= ~WindowUserActive; } @@ -1051,7 +1051,7 @@ void Notepad_plus::command(int id) else pWindow = _pDocTab; - _pMainSplitter->create(pWindow, ScintillaEditView::getUserDefineDlg(), 8, RIGHT_FIX, 45); + _pMainSplitter->create(pWindow, ScintillaEditView::getUserDefineDlg(), 8, SplitterMode::RIGHT_FIX, 45); } _pMainWindow = _pMainSplitter; @@ -1137,7 +1137,7 @@ void Notepad_plus::command(int id) case IDM_EDIT_BLOCK_COMMENT: doBlockComment(cm_toggle); break; - + case IDM_EDIT_BLOCK_COMMENT_SET: doBlockComment(cm_comment); break; @@ -1213,11 +1213,11 @@ void Notepad_plus::command(int id) case IDM_EDIT_CLEARREADONLY: { Buffer * buf = _pEditView->getCurrentBuffer(); - - DWORD dwFileAttribs = ::GetFileAttributes(buf->getFullPathName()); - dwFileAttribs ^= FILE_ATTRIBUTE_READONLY; - ::SetFileAttributes(buf->getFullPathName(), dwFileAttribs); + DWORD dwFileAttribs = ::GetFileAttributes(buf->getFullPathName()); + dwFileAttribs ^= FILE_ATTRIBUTE_READONLY; + + ::SetFileAttributes(buf->getFullPathName(), dwFileAttribs); buf->setFileReadOnly(false); } break; @@ -1367,7 +1367,7 @@ void Notepad_plus::command(int id) ::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, 0, 0); break; } - + case IDM_VIEW_REFRESHTABAR : { ::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, 0, 0); @@ -1397,7 +1397,7 @@ void Notepad_plus::command(int id) TabBarPlus::setDrawTabCloseButton(!TabBarPlus::drawTabCloseButton()); // This part is just for updating (redraw) the tabs - { + { int tabDpiDynamicalHeight = NppParameters::getInstance()->_dpiManager.scaleY(TabBarPlus::drawTabCloseButton()?21:20); int tabDpiDynamicalWidth = NppParameters::getInstance()->_dpiManager.scaleX(TabBarPlus::drawTabCloseButton() ? 60:45); TabCtrl_SetItemSize(_mainDocTab.getHSelf(), tabDpiDynamicalWidth, tabDpiDynamicalHeight); @@ -1412,18 +1412,18 @@ void Notepad_plus::command(int id) TabBarPlus::setDbClk2Close(!TabBarPlus::isDbClk2Close()); break; } - + case IDM_VIEW_DRAWTABBAR_VERTICAL : { TabBarPlus::setVertical(!TabBarPlus::isVertical()); ::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, 0, 0); break; } - + case IDM_VIEW_DRAWTABBAR_MULTILINE : { TabBarPlus::setMultiLine(!TabBarPlus::isMultiLine()); - ::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, 0, 0); + ::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, 0, 0); break; } @@ -1555,7 +1555,7 @@ void Notepad_plus::command(int id) case IDM_VIEW_SYNSCROLLV: { bool isSynScollV = !_syncInfo._isSynScollV; - + checkMenuItem(IDM_VIEW_SYNSCROLLV, isSynScollV); _toolBar.setCheck(IDM_VIEW_SYNSCROLLV, isSynScollV); @@ -1566,7 +1566,7 @@ void Notepad_plus::command(int id) int subCurrentLine = _subEditView.execute(SCI_GETFIRSTVISIBLELINE); _syncInfo._line = mainCurrentLine - subCurrentLine; } - + } break; @@ -1699,7 +1699,7 @@ void Notepad_plus::command(int id) case IDM_FORMAT_TOMAC : { Buffer * buf = _pEditView->getCurrentBuffer(); - + int f = int((id == IDM_FORMAT_TODOS)?SC_EOL_CRLF:(id == IDM_FORMAT_TOUNIX)?SC_EOL_LF:SC_EOL_CR); buf->setFormat((formatType)f); @@ -1708,7 +1708,7 @@ void Notepad_plus::command(int id) } case IDM_FORMAT_ANSI : - case IDM_FORMAT_UTF_8 : + case IDM_FORMAT_UTF_8 : case IDM_FORMAT_UCS_2BE : case IDM_FORMAT_UCS_2LE : case IDM_FORMAT_AS_UTF_8 : @@ -1723,7 +1723,7 @@ void Notepad_plus::command(int id) shoulBeDirty = buf->getUnicodeMode() != uni8Bit; um = uniCookie; break; - + case IDM_FORMAT_UTF_8: um = uniUTF8; break; @@ -1842,7 +1842,7 @@ void Notepad_plus::command(int id) case IDM_FORMAT_KOREAN_WIN : case IDM_FORMAT_EUC_KR : case IDM_FORMAT_TIS_620 : - case IDM_FORMAT_MAC_CYRILLIC : + case IDM_FORMAT_MAC_CYRILLIC : case IDM_FORMAT_KOI8U_CYRILLIC : case IDM_FORMAT_KOI8R_CYRILLIC : { @@ -1883,7 +1883,7 @@ void Notepad_plus::command(int id) TEXT("You should save the current modification.\rAll the saved modifications can not be undone.\r\rContinue?"), TEXT("Lose Undo Ability Waning"), MB_YESNO); - + if (answer == IDYES) { // Do nothing @@ -1906,7 +1906,7 @@ void Notepad_plus::command(int id) case IDM_FORMAT_CONV2_ANSI: case IDM_FORMAT_CONV2_AS_UTF_8: case IDM_FORMAT_CONV2_UTF_8: - case IDM_FORMAT_CONV2_UCS_2BE: + case IDM_FORMAT_CONV2_UCS_2BE: case IDM_FORMAT_CONV2_UCS_2LE: { int idEncoding = -1; @@ -1927,7 +1927,7 @@ void Notepad_plus::command(int id) { if (um == uni8Bit) return; - + // set scintilla to ANSI idEncoding = IDM_FORMAT_ANSI; } @@ -1978,7 +1978,7 @@ void Notepad_plus::command(int id) } break; } - + case IDM_FORMAT_CONV2_UCS_2BE: { if (encoding != -1) @@ -2001,7 +2001,7 @@ void Notepad_plus::command(int id) } break; } - + case IDM_FORMAT_CONV2_UCS_2LE: { if (encoding != -1) @@ -2037,8 +2037,8 @@ void Notepad_plus::command(int id) LPVOID clipboardData2 = ::GlobalLock(allocClipboardData); ::memcpy(clipboardData2, clipboardDataPtr, len); - ::GlobalUnlock(clipboardData); - ::GlobalUnlock(allocClipboardData); + ::GlobalUnlock(clipboardData); + ::GlobalUnlock(allocClipboardData); ::CloseClipboard(); _pEditView->saveCurrentPos(); @@ -2049,7 +2049,7 @@ void Notepad_plus::command(int id) _pEditView->execute(SCI_CLEARALL); // Change to the proper buffer, save buffer status - + ::SendMessage(_pPublicInterface->getHSelf(), WM_COMMAND, idEncoding, 0); // Paste the texte, restore buffer status @@ -2058,7 +2058,7 @@ void Notepad_plus::command(int id) // Restore the previous clipboard data ::OpenClipboard(_pPublicInterface->getHSelf()); - ::EmptyClipboard(); + ::EmptyClipboard(); ::SetClipboardData(CF_TEXT, clipboardData2); ::CloseClipboard(); @@ -2106,7 +2106,7 @@ void Notepad_plus::command(int id) for (size_t i = 0, len = copiedFiles.size(); i < len ; ++i) { generic_string themeName(themeSwitcher.getThemeFromXmlFileName(copiedFiles[i].c_str())); - if (!themeSwitcher.themeNameExists(themeName.c_str())) + if (!themeSwitcher.themeNameExists(themeName.c_str())) { themeSwitcher.addThemeFromXml(copiedFiles[i].c_str()); if (_configStyleDlg.isCreated()) @@ -2134,7 +2134,7 @@ void Notepad_plus::command(int id) { bool isFirstTime = !_preference.isCreated(); _preference.doDialog(_nativeLangSpeaker.isRTL()); - + if (isFirstTime) { _nativeLangSpeaker.changePrefereceDlgLang(_preference); @@ -2209,7 +2209,7 @@ void Notepad_plus::command(int id) char author[maxSelLen+1] = ""; _pEditView->getSelectedText(author, maxSelLen + 1); int iQuote = getQuoteIndexFrom(author); - + if (iQuote == -1) { doAboutDlg = true; @@ -2229,7 +2229,7 @@ void Notepad_plus::command(int id) if (!::PathFileExists(noEasterEggsPath.c_str())) showQuoteFromIndex(iQuote); return; - } + } } if (doAboutDlg) { @@ -2444,7 +2444,7 @@ void Notepad_plus::command(int id) { int nbDoc = viewVisible(MAIN_VIEW)?_mainDocTab.nbItem():0; nbDoc += viewVisible(SUB_VIEW)?_subDocTab.nbItem():0; - + bool doTaskList = ((NppParameters::getInstance())->getNppGUI())._doTaskList; if (nbDoc > 1) { @@ -2455,7 +2455,7 @@ void Notepad_plus::command(int id) activateNextDoc(direction); } else - { + { TaskListDlg tld; HIMAGELIST hImgLst = _docTabIconList.getHandle(); tld.init(_pPublicInterface->getHinst(), _pPublicInterface->getHSelf(), hImgLst, direction); @@ -2507,7 +2507,7 @@ void Notepad_plus::command(int id) { WindowsDlg _windowsDlg; _windowsDlg.init(_pPublicInterface->getHinst(), _pPublicInterface->getHSelf(), _pDocTab); - + const TiXmlNodeA *nativeLangA = _nativeLangSpeaker.getNativeLangA(); TiXmlNodeA *dlgNode = NULL; if (nativeLangA) @@ -2545,11 +2545,11 @@ void Notepad_plus::command(int id) if (!buf->isUntitled() || buf->docLength() != 0) { fileNew(); - } + } command(IDM_EDIT_PASTE); } break; - + case IDM_SYSTRAYPOPUP_OPENFILE: { NppGUI & nppGUI = (NppGUI &)((NppParameters::getInstance())->getNppGUI()); @@ -2687,7 +2687,7 @@ void Notepad_plus::command(int id) { int i = id - ID_MACRO; vector & theMacros = (NppParameters::getInstance())->getMacroList(); - macroPlayback(theMacros[i].getMacro()); + macroPlayback(theMacros[i].getMacro()); } else if ((id >= ID_USER_CMD) && (id < ID_USER_CMD_LIMIT)) { @@ -2707,7 +2707,7 @@ void Notepad_plus::command(int id) { _pluginsManager.relayNppMessages(WM_COMMAND, id, 0); } -/*UNLOAD +/*UNLOAD else if ((id >= ID_PLUGINS_REMOVING) && (id < ID_PLUGINS_REMOVING_END)) { int i = id - ID_PLUGINS_REMOVING; @@ -2716,11 +2716,11 @@ void Notepad_plus::command(int id) */ else if ((id >= IDM_WINDOW_MRU_FIRST) && (id <= IDM_WINDOW_MRU_LIMIT)) { - activateDoc(id-IDM_WINDOW_MRU_FIRST); + activateDoc(id-IDM_WINDOW_MRU_FIRST); } } - - if (_recordingMacro) + + if (_recordingMacro) switch (id) { case IDM_FILE_NEW : @@ -2817,15 +2817,15 @@ void Notepad_plus::command(int id) case IDM_VIEW_GOTO_ANOTHER_VIEW: case IDM_VIEW_SYNSCROLLV: case IDM_VIEW_SYNSCROLLH: - case IDM_VIEW_TAB1: - case IDM_VIEW_TAB2: - case IDM_VIEW_TAB3: - case IDM_VIEW_TAB4: - case IDM_VIEW_TAB5: - case IDM_VIEW_TAB6: - case IDM_VIEW_TAB7: - case IDM_VIEW_TAB8: - case IDM_VIEW_TAB9: + case IDM_VIEW_TAB1: + case IDM_VIEW_TAB2: + case IDM_VIEW_TAB3: + case IDM_VIEW_TAB4: + case IDM_VIEW_TAB5: + case IDM_VIEW_TAB6: + case IDM_VIEW_TAB7: + case IDM_VIEW_TAB8: + case IDM_VIEW_TAB9: case IDM_VIEW_TAB_NEXT: case IDM_VIEW_TAB_PREV: case IDC_PREV_DOC : diff --git a/PowerEditor/src/NppNotification.cpp b/PowerEditor/src/NppNotification.cpp index 9e35b8681..42fa84130 100644 --- a/PowerEditor/src/NppNotification.cpp +++ b/PowerEditor/src/NppNotification.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -36,6 +36,10 @@ using namespace std; + + + + BOOL Notepad_plus::notify(SCNotification *notification) { //Important, keep track of which element generated the message @@ -44,7 +48,7 @@ BOOL Notepad_plus::notify(SCNotification *notification) ScintillaEditView * notifyView = isFromPrimary?&_mainEditView:&_subEditView; DocTabView *notifyDocTab = isFromPrimary?&_mainDocTab:&_subDocTab; TBHDR * tabNotification = (TBHDR*) notification; - switch (notification->nmhdr.code) + switch (notification->nmhdr.code) { case SCN_MODIFIED: { @@ -65,7 +69,7 @@ BOOL Notepad_plus::notify(SCNotification *notification) if (notification->modificationType & SC_MOD_CHANGEFOLD) { - if (prevWasEdit) + if (prevWasEdit) { notifyView->foldChanged(notification->line, notification->foldLevelNow, notification->foldLevelPrev); prevWasEdit = false; @@ -76,9 +80,8 @@ BOOL Notepad_plus::notify(SCNotification *notification) prevWasEdit = false; } - + break; } - break; case SCN_SAVEPOINTREACHED: case SCN_SAVEPOINTLEFT: @@ -96,7 +99,7 @@ BOOL Notepad_plus::notify(SCNotification *notification) { //Done by invisibleEditView? BufferID id = BUFFER_INVALID; - if (notification->nmhdr.hwndFrom == _invisibleEditView.getHSelf()) + if (notification->nmhdr.hwndFrom == _invisibleEditView.getHSelf()) { id = MainFileManager->getBufferFromDocument(_invisibleEditView.execute(SCI_GETDOCPOINTER)); } @@ -104,20 +107,17 @@ BOOL Notepad_plus::notify(SCNotification *notification) { id = MainFileManager->getBufferFromDocument(_fileEditView.execute(SCI_GETDOCPOINTER)); } - else - { + else break; //wrong scintilla - } if (id != BUFFER_INVALID) { buf = MainFileManager->getBufferByID(id); } else - { break; - } } + bool isDirty = notification->nmhdr.code == SCN_SAVEPOINTLEFT; bool isSnapshotMode = NppParameters::getInstance()->getNppGUI().isSnapshotMode(); if (isSnapshotMode && !isDirty) @@ -127,805 +127,814 @@ BOOL Notepad_plus::notify(SCNotification *notification) isDirty = true; } buf->setDirty(isDirty); - break; + break; } - case SCN_MODIFYATTEMPTRO : - // on fout rien + case SCN_MODIFYATTEMPTRO: + { + // nothing to do break; + } case SCN_KEY: + { break; + } - case TCN_TABDROPPEDOUTSIDE: - case TCN_TABDROPPED: - { - TabBarPlus *sender = reinterpret_cast(notification->nmhdr.idFrom); - bool isInCtrlStat = (::GetKeyState(VK_LCONTROL) & 0x80000000) != 0; - if (notification->nmhdr.code == TCN_TABDROPPEDOUTSIDE) - { - POINT p = sender->getDraggingPoint(); - - //It's the coordinate of screen, so we can call - //"WindowFromPoint" function without converting the point - HWND hWin = ::WindowFromPoint(p); - if (hWin == _pEditView->getHSelf()) // In the same view group + case TCN_TABDROPPEDOUTSIDE: + case TCN_TABDROPPED: + { + TabBarPlus *sender = reinterpret_cast(notification->nmhdr.idFrom); + bool isInCtrlStat = (::GetKeyState(VK_LCONTROL) & 0x80000000) != 0; + if (notification->nmhdr.code == TCN_TABDROPPEDOUTSIDE) { - if (!_tabPopupDropMenu.isCreated()) + POINT p = sender->getDraggingPoint(); + + //It's the coordinate of screen, so we can call + //"WindowFromPoint" function without converting the point + HWND hWin = ::WindowFromPoint(p); + if (hWin == _pEditView->getHSelf()) // In the same view group { - TCHAR goToView[32] = TEXT("Move to other view"); - TCHAR cloneToView[32] = TEXT("Clone to other View"); - vector itemUnitArray; - itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_GOTO_ANOTHER_VIEW, goToView)); - itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_CLONE_TO_ANOTHER_VIEW, cloneToView)); - _tabPopupDropMenu.create(_pPublicInterface->getHSelf(), itemUnitArray, _mainMenuHandle); - _nativeLangSpeaker.changeLangTabDrapContextMenu(_tabPopupDropMenu.getMenuHandle()); + if (!_tabPopupDropMenu.isCreated()) + { + TCHAR goToView[32] = TEXT("Move to other view"); + TCHAR cloneToView[32] = TEXT("Clone to other View"); + vector itemUnitArray; + itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_GOTO_ANOTHER_VIEW, goToView)); + itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_CLONE_TO_ANOTHER_VIEW, cloneToView)); + _tabPopupDropMenu.create(_pPublicInterface->getHSelf(), itemUnitArray, _mainMenuHandle); + _nativeLangSpeaker.changeLangTabDrapContextMenu(_tabPopupDropMenu.getMenuHandle()); + } + _tabPopupDropMenu.display(p); + } + else if ((hWin == _pNonDocTab->getHSelf()) || + (hWin == _pNonEditView->getHSelf())) // In the another view group + { + docGotoAnotherEditView(isInCtrlStat?TransferClone:TransferMove); + } + else + { + RECT nppZone; + ::GetWindowRect(_pPublicInterface->getHSelf(), &nppZone); + bool isInNppZone = (((p.x >= nppZone.left) && (p.x <= nppZone.right)) && (p.y >= nppZone.top) && (p.y <= nppZone.bottom)); + if (isInNppZone) + { + // Do nothing + return TRUE; + } + generic_string quotFileName = TEXT("\""); + quotFileName += _pEditView->getCurrentBuffer()->getFullPathName(); + quotFileName += TEXT("\""); + COPYDATASTRUCT fileNamesData; + fileNamesData.dwData = COPYDATA_FILENAMES; + fileNamesData.lpData = (void *)quotFileName.c_str(); + fileNamesData.cbData = long(quotFileName.length() + 1)*(sizeof(TCHAR)); + + HWND hWinParent = ::GetParent(hWin); + const rsize_t classNameBufferSize = MAX_PATH; + TCHAR className[classNameBufferSize]; + ::GetClassName(hWinParent,className, classNameBufferSize); + if (lstrcmp(className, _pPublicInterface->getClassName()) == 0 && hWinParent != _pPublicInterface->getHSelf()) // another Notepad++ + { + int index = _pDocTab->getCurrentTabIndex(); + BufferID bufferToClose = notifyDocTab->getBufferByIndex(index); + Buffer * buf = MainFileManager->getBufferByID(bufferToClose); + int iView = isFromPrimary?MAIN_VIEW:SUB_VIEW; + if (buf->isDirty()) + { + generic_string msg, title; + _nativeLangSpeaker.messageBox("CannotMoveDoc", + _pPublicInterface->getHSelf(), + TEXT("Document is modified, save it then try again."), + TEXT("Move to new Notepad++ Instance"), + MB_OK); + } + else + { + ::SendMessage(hWinParent, NPPM_INTERNAL_SWITCHVIEWFROMHWND, 0, (LPARAM)hWin); + ::SendMessage(hWinParent, WM_COPYDATA, (WPARAM)_pPublicInterface->getHinst(), (LPARAM)&fileNamesData); + if (!isInCtrlStat) + { + fileClose(bufferToClose, iView); + if (noOpenedDoc()) + ::SendMessage(_pPublicInterface->getHSelf(), WM_CLOSE, 0, 0); + } + } + } + else // Not Notepad++, we open it here + { + docOpenInNewInstance(isInCtrlStat?TransferClone:TransferMove, p.x, p.y); + } } - _tabPopupDropMenu.display(p); } - else if ((hWin == _pNonDocTab->getHSelf()) || - (hWin == _pNonEditView->getHSelf())) // In the another view group + //break; + sender->resetDraggingPoint(); + return TRUE; + } + + case TCN_TABDELETE: + { + int index = tabNotification->tabOrigin; + BufferID bufferToClose = notifyDocTab->getBufferByIndex(index); + Buffer * buf = MainFileManager->getBufferByID(bufferToClose); + int iView = isFromPrimary?MAIN_VIEW:SUB_VIEW; + if (buf->isDirty()) { - docGotoAnotherEditView(isInCtrlStat?TransferClone:TransferMove); + activateBuffer(bufferToClose, iView); + } + fileClose(bufferToClose, iView); + break; + } + + case TCN_SELCHANGE: + { + int iView = -1; + if (notification->nmhdr.hwndFrom == _mainDocTab.getHSelf()) + { + iView = MAIN_VIEW; + } + else if (notification->nmhdr.hwndFrom == _subDocTab.getHSelf()) + { + iView = SUB_VIEW; } else + break; + + switchEditViewTo(iView); + BufferID bufid = _pDocTab->getBufferByIndex(_pDocTab->getCurrentTabIndex()); + if (bufid != BUFFER_INVALID) + activateBuffer(bufid, iView); + + break; + } + + case NM_CLICK : + { + if (notification->nmhdr.hwndFrom == _statusBar.getHSelf()) { - RECT nppZone; - ::GetWindowRect(_pPublicInterface->getHSelf(), &nppZone); - bool isInNppZone = (((p.x >= nppZone.left) && (p.x <= nppZone.right)) && (p.y >= nppZone.top) && (p.y <= nppZone.bottom)); - if (isInNppZone) + LPNMMOUSE lpnm = (LPNMMOUSE)notification; + if (lpnm->dwItemSpec == DWORD(STATUSBAR_TYPING_MODE)) { - // Do nothing + bool isOverTypeMode = (_pEditView->execute(SCI_GETOVERTYPE) != 0); + _pEditView->execute(SCI_SETOVERTYPE, !isOverTypeMode); + _statusBar.setText((_pEditView->execute(SCI_GETOVERTYPE))?TEXT("OVR"):TEXT("INS"), STATUSBAR_TYPING_MODE); + } + } + else if (notification->nmhdr.hwndFrom == _mainDocTab.getHSelf() && _activeView == SUB_VIEW) + { + bool isSnapshotMode = NppParameters::getInstance()->getNppGUI().isSnapshotMode(); + if (isSnapshotMode) + { + // Before switching off, synchronize backup file + MainFileManager->backupCurrentBuffer(); + } + // Switch off + switchEditViewTo(MAIN_VIEW); + } + else if (notification->nmhdr.hwndFrom == _subDocTab.getHSelf() && _activeView == MAIN_VIEW) + { + bool isSnapshotMode = NppParameters::getInstance()->getNppGUI().isSnapshotMode(); + if (isSnapshotMode) + { + // Before switching off, synchronize backup file + MainFileManager->backupCurrentBuffer(); + } + // Switch off + switchEditViewTo(SUB_VIEW); + } + + break; + } + + case NM_DBLCLK : + { + if (notification->nmhdr.hwndFrom == _statusBar.getHSelf()) + { + LPNMMOUSE lpnm = (LPNMMOUSE)notification; + if (lpnm->dwItemSpec == DWORD(STATUSBAR_CUR_POS)) + { + bool isFirstTime = !_goToLineDlg.isCreated(); + _goToLineDlg.doDialog(_nativeLangSpeaker.isRTL()); + if (isFirstTime) + _nativeLangSpeaker.changeDlgLang(_goToLineDlg.getHSelf(), "GoToLine"); + } + else if (lpnm->dwItemSpec == DWORD(STATUSBAR_DOC_SIZE)) + { + command(IDM_VIEW_SUMMARY); + } + else if (lpnm->dwItemSpec == DWORD(STATUSBAR_DOC_TYPE)) + { + POINT p; + ::GetCursorPos(&p); + HMENU hLangMenu = ::GetSubMenu(_mainMenuHandle, MENUINDEX_LANGUAGE); + TrackPopupMenu(hLangMenu, 0, p.x, p.y, 0, _pPublicInterface->getHSelf(), NULL); + } + else if (lpnm->dwItemSpec == DWORD(STATUSBAR_EOF_FORMAT)) + { + POINT p; + ::GetCursorPos(&p); + MenuPosition & menuPos = getMenuPosition("edit-eolConversion"); + HMENU hEditMenu = ::GetSubMenu(_mainMenuHandle, menuPos._x); + if (!hEditMenu) + return TRUE; + HMENU hEolFormatMenu = ::GetSubMenu(hEditMenu, menuPos._y); + if (!hEolFormatMenu) + return TRUE; + TrackPopupMenu(hEolFormatMenu, 0, p.x, p.y, 0, _pPublicInterface->getHSelf(), NULL); + } + } + break; + } + + case NM_RCLICK : + { + POINT p; + ::GetCursorPos(&p); + + if (notification->nmhdr.hwndFrom == _mainDocTab.getHSelf()) + { + switchEditViewTo(MAIN_VIEW); + } + else if (notification->nmhdr.hwndFrom == _subDocTab.getHSelf()) + { + switchEditViewTo(SUB_VIEW); + } + else if (notification->nmhdr.hwndFrom == _statusBar.getHSelf()) // From Status Bar + { + LPNMMOUSE lpnm = (LPNMMOUSE)notification; + if (lpnm->dwItemSpec == DWORD(STATUSBAR_DOC_TYPE)) + { + POINT p; + ::GetCursorPos(&p); + HMENU hLangMenu = ::GetSubMenu(_mainMenuHandle, MENUINDEX_LANGUAGE); + TrackPopupMenu(hLangMenu, 0, p.x, p.y, 0, _pPublicInterface->getHSelf(), NULL); + } + else if (lpnm->dwItemSpec == DWORD(STATUSBAR_EOF_FORMAT)) + { + POINT p; + ::GetCursorPos(&p); + MenuPosition & menuPos = getMenuPosition("edit-eolConversion"); + HMENU hEditMenu = ::GetSubMenu(_mainMenuHandle, menuPos._x); + if (!hEditMenu) + return TRUE; + HMENU hEolFormatMenu = ::GetSubMenu(hEditMenu, menuPos._y); + if (!hEolFormatMenu) + return TRUE; + TrackPopupMenu(hEolFormatMenu, 0, p.x, p.y, 0, _pPublicInterface->getHSelf(), NULL); + } + return TRUE; + } + else if (_pFileSwitcherPanel && notification->nmhdr.hwndFrom == _pFileSwitcherPanel->getHSelf()) + { + // Already switched, so do nothing here. + + if (_pFileSwitcherPanel->nbSelectedFiles() > 1) + { + if (!_fileSwitcherMultiFilePopupMenu.isCreated()) + { + vector itemUnitArray; + itemUnitArray.push_back(MenuItemUnit(IDM_FILESWITCHER_FILESCLOSE, TEXT("Close Selected files"))); + itemUnitArray.push_back(MenuItemUnit(IDM_FILESWITCHER_FILESCLOSEOTHERS, TEXT("Close others files"))); + + _fileSwitcherMultiFilePopupMenu.create(_pPublicInterface->getHSelf(), itemUnitArray); + _nativeLangSpeaker.changeLangTabContextMenu(_fileSwitcherMultiFilePopupMenu.getMenuHandle()); + } + _fileSwitcherMultiFilePopupMenu.display(p); return TRUE; } - generic_string quotFileName = TEXT("\""); - quotFileName += _pEditView->getCurrentBuffer()->getFullPathName(); - quotFileName += TEXT("\""); - COPYDATASTRUCT fileNamesData; - fileNamesData.dwData = COPYDATA_FILENAMES; - fileNamesData.lpData = (void *)quotFileName.c_str(); - fileNamesData.cbData = long(quotFileName.length() + 1)*(sizeof(TCHAR)); + } + else // From tool bar + return TRUE; + //break; - HWND hWinParent = ::GetParent(hWin); - const rsize_t classNameBufferSize = MAX_PATH; - TCHAR className[classNameBufferSize]; - ::GetClassName(hWinParent,className, classNameBufferSize); - if (lstrcmp(className, _pPublicInterface->getClassName()) == 0 && hWinParent != _pPublicInterface->getHSelf()) // another Notepad++ + if (!_tabPopupMenu.isCreated()) + { + std::vector itemUnitArray; + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CLOSE, TEXT("Close"))); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CLOSEALL_BUT_CURRENT, TEXT("Close All BUT This"))); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CLOSEALL_TOLEFT, TEXT("Close All to the Left"))); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CLOSEALL_TORIGHT, TEXT("Close All to the Right"))); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_SAVE, TEXT("Save"))); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_SAVEAS, TEXT("Save As..."))); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_RENAME, TEXT("Rename"))); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_DELETE, TEXT("Move to Recycle Bin"))); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_RELOAD, TEXT("Reload"))); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_PRINT, TEXT("Print"))); + itemUnitArray.push_back(MenuItemUnit(0, NULL)); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_OPEN_FOLDER, TEXT("Open Containing Folder in Explorer"))); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_OPEN_CMD, TEXT("Open Containing Folder in cmd"))); + itemUnitArray.push_back(MenuItemUnit(0, NULL)); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_SETREADONLY, TEXT("Read-Only"))); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_CLEARREADONLY, TEXT("Clear Read-Only Flag"))); + itemUnitArray.push_back(MenuItemUnit(0, NULL)); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_FULLPATHTOCLIP, TEXT("Full File Path to Clipboard"))); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_FILENAMETOCLIP, TEXT("Filename to Clipboard"))); + itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_CURRENTDIRTOCLIP, TEXT("Current Dir. Path to Clipboard"))); + itemUnitArray.push_back(MenuItemUnit(0, NULL)); + itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_GOTO_ANOTHER_VIEW, TEXT("Move to Other View"))); + itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_CLONE_TO_ANOTHER_VIEW, TEXT("Clone to Other View"))); + itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_GOTO_NEW_INSTANCE, TEXT("Move to New Instance"))); + itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_LOAD_IN_NEW_INSTANCE, TEXT("Open in New Instance"))); + + _tabPopupMenu.create(_pPublicInterface->getHSelf(), itemUnitArray); + _nativeLangSpeaker.changeLangTabContextMenu(_tabPopupMenu.getMenuHandle()); + } + + bool isEnable = ((::GetMenuState(_mainMenuHandle, IDM_FILE_SAVE, MF_BYCOMMAND)&MF_DISABLED) == 0); + _tabPopupMenu.enableItem(IDM_FILE_SAVE, isEnable); + + Buffer * buf = _pEditView->getCurrentBuffer(); + bool isUserReadOnly = buf->getUserReadOnly(); + _tabPopupMenu.checkItem(IDM_EDIT_SETREADONLY, isUserReadOnly); + + bool isSysReadOnly = buf->getFileReadOnly(); + _tabPopupMenu.enableItem(IDM_EDIT_SETREADONLY, !isSysReadOnly); + _tabPopupMenu.enableItem(IDM_EDIT_CLEARREADONLY, isSysReadOnly); + + bool isFileExisting = PathFileExists(buf->getFullPathName()) != FALSE; + _tabPopupMenu.enableItem(IDM_FILE_DELETE, isFileExisting); + _tabPopupMenu.enableItem(IDM_FILE_RENAME, isFileExisting); + + bool isDirty = buf->isDirty(); + bool isUntitled = buf->isUntitled(); + _tabPopupMenu.enableItem(IDM_VIEW_GOTO_NEW_INSTANCE, !(isDirty||isUntitled)); + _tabPopupMenu.enableItem(IDM_VIEW_LOAD_IN_NEW_INSTANCE, !(isDirty||isUntitled)); + + _tabPopupMenu.display(p); + return TRUE; + } + + + case SCN_MARGINCLICK: + { + if (notification->nmhdr.hwndFrom == _mainEditView.getHSelf()) + switchEditViewTo(MAIN_VIEW); + else if (notification->nmhdr.hwndFrom == _subEditView.getHSelf()) + switchEditViewTo(SUB_VIEW); + + int lineClick = int(_pEditView->execute(SCI_LINEFROMPOSITION, notification->position)); + + if (notification->margin == ScintillaEditView::_SC_MARGE_FOLDER) + { + _pEditView->marginClick(notification->position, notification->modifiers); + if (_pDocMap) + _pDocMap->fold(lineClick, _pEditView->isFolded(lineClick)); + } + else if ((notification->margin == ScintillaEditView::_SC_MARGE_SYBOLE) && !notification->modifiers) + { + if (!_pEditView->markerMarginClick(lineClick)) + bookmarkToggle(lineClick); + } + break; + } + + case SCN_FOLDINGSTATECHANGED : + { + if ((notification->nmhdr.hwndFrom == _mainEditView.getHSelf()) || (notification->nmhdr.hwndFrom == _subEditView.getHSelf())) + { + int lineClicked = notification->line; + + if (!_isFolding) { - int index = _pDocTab->getCurrentTabIndex(); - BufferID bufferToClose = notifyDocTab->getBufferByIndex(index); - Buffer * buf = MainFileManager->getBufferByID(bufferToClose); - int iView = isFromPrimary?MAIN_VIEW:SUB_VIEW; - if (buf->isDirty()) + int urlAction = (NppParameters::getInstance())->getNppGUI()._styleURL; + if ((urlAction == 1) || (urlAction == 2)) + addHotSpot(); + } + + if (_pDocMap) + _pDocMap->fold(lineClicked, _pEditView->isFolded(lineClicked)); + } + return TRUE; + } + + case SCN_CHARADDED: + { + const NppGUI & nppGui = NppParameters::getInstance()->getNppGUI(); + bool indentMaintain = nppGui._maitainIndent; + if (indentMaintain) + maintainIndentation(static_cast(notification->ch)); + + AutoCompletion * autoC = isFromPrimary?&_autoCompleteMain:&_autoCompleteSub; + bool isColumnMode = _pEditView->execute(SCI_GETSELECTIONS) > 1; // Multi-Selection || Column mode) + if (nppGui._matchedPairConf.hasAnyPairsPair() && !isColumnMode) + autoC->insertMatchedChars(notification->ch, nppGui._matchedPairConf); + autoC->update(notification->ch); + + break; + } + + case SCN_DOUBLECLICK: + { + if (notification->modifiers == SCMOD_CTRL) + { + const NppGUI & nppGUI = NppParameters::getInstance()->getNppGUI(); + + std::string bufstring; + + unsigned int position_of_click; + // For some reason Ctrl+DoubleClick on an empty line means that notification->position == 1. + // In that case we use SCI_GETCURRENTPOS to get the position. + if (notification->position != -1) + position_of_click = notification->position; + else + position_of_click = int(_pEditView->execute(SCI_GETCURRENTPOS)); + + // Anonymous scope to limit use of the buf pointer (much easier to deal with std::string). + { + char *buf; + int length; + + if (nppGUI._delimiterSelectionOnEntireDocument) { - generic_string msg, title; - _nativeLangSpeaker.messageBox("CannotMoveDoc", - _pPublicInterface->getHSelf(), - TEXT("Document is modified, save it then try again."), - TEXT("Move to new Notepad++ Instance"), - MB_OK); + // Get entire document. + length = notifyView->execute(SCI_GETLENGTH); + buf = new char[length + 1]; + notifyView->execute(SCI_GETTEXT, (LPARAM)(length + 1), (WPARAM)buf); } else { - ::SendMessage(hWinParent, NPPM_INTERNAL_SWITCHVIEWFROMHWND, 0, (LPARAM)hWin); - ::SendMessage(hWinParent, WM_COPYDATA, (WPARAM)_pPublicInterface->getHinst(), (LPARAM)&fileNamesData); - if (!isInCtrlStat) + // Get single line. + length = notifyView->execute(SCI_GETCURLINE); + buf = new char[length + 1]; + notifyView->execute(SCI_GETCURLINE, (WPARAM)length, (LPARAM)buf); + + // Compute the position of the click (relative to the beginning of the line). + const int line_position = notifyView->execute(SCI_POSITIONFROMLINE, notifyView->getCurrentLineNumber()); + position_of_click = position_of_click - line_position; + } + + bufstring = buf; + delete [] buf; + } + + int leftmost_position = -1; + int rightmost_position = -1; + + if (nppGUI._rightmostDelimiter == nppGUI._leftmostDelimiter) + { + // If the delimiters are the same (e.g. they are both a quotation mark), choose the ones + // which are closest to the clicked position. + for (int i = position_of_click; i >= 0; --i) + { + if (bufstring.at(i) == nppGUI._leftmostDelimiter) { - fileClose(bufferToClose, iView); - if (noOpenedDoc()) - ::SendMessage(_pPublicInterface->getHSelf(), WM_CLOSE, 0, 0); + // Respect escaped quotation marks. + if (nppGUI._leftmostDelimiter == '"') + { + if (! (i > 0 && bufstring.at(i - 1) == '\\')) + { + leftmost_position = i; + break; + } + } + else + { + leftmost_position = i; + break; + } + } + } + + if (leftmost_position == -1) + break; + + // Scan for right delimiter. + for (unsigned int i = position_of_click; i < bufstring.length(); ++i) + { + if (bufstring.at(i) == nppGUI._rightmostDelimiter) + { + // Respect escaped quotation marks. + if (nppGUI._rightmostDelimiter == '"') + { + if (! (i > 0 && bufstring.at(i - 1) == '\\')) + { + rightmost_position = i; + break; + } + } + else + { + rightmost_position = i; + break; + } } } } - else // Not Notepad++, we open it here - { - docOpenInNewInstance(isInCtrlStat?TransferClone:TransferMove, p.x, p.y); - } + else + { + // Find matching pairs of delimiters (e.g. parantheses). + // The pair where the distance from the left delimiter to position_of_click is at a minimum is the one we're looking for. + // Of course position_of_click must lie between the delimiters. + + // This logic is required to handle cases like this: + // (size_t i = function(); i < _buffers.size(); i++) + + std::stack leftmost_delimiter_positions; + + for (unsigned int i = 0; i < bufstring.length(); ++i) + { + if (bufstring.at(i) == nppGUI._leftmostDelimiter) + leftmost_delimiter_positions.push(i); + else if (bufstring.at(i) == nppGUI._rightmostDelimiter && ! leftmost_delimiter_positions.empty()) + { + unsigned int matching_leftmost = leftmost_delimiter_positions.top(); + leftmost_delimiter_positions.pop(); + + // We have either 1) chosen neither the left- or rightmost position, or 2) chosen both left- and rightmost position. + assert( (leftmost_position == -1 && rightmost_position == -1) || (leftmost_position >= 0 && rightmost_position >= 0) ); + + // Note: cast of leftmost_position to unsigned int is safe, since if leftmost_position is not -1 then it is guaranteed to be positive. + // If it was possible, leftmost_position and rightmost_position should be of type optional. + if ( matching_leftmost <= position_of_click && i >= position_of_click && (leftmost_position == -1 || matching_leftmost > (unsigned int)leftmost_position) ) + { + leftmost_position = matching_leftmost; + rightmost_position = i; + } + } + } + } + + // Set selection to the position we found (if any). + if (rightmost_position != -1 && leftmost_position != -1) + { + if (nppGUI._delimiterSelectionOnEntireDocument) + { + notifyView->execute(SCI_SETCURRENTPOS, rightmost_position); + notifyView->execute(SCI_SETANCHOR, leftmost_position + 1); + } + else + { + const int line_position = notifyView->execute(SCI_POSITIONFROMLINE, notifyView->getCurrentLineNumber()); + notifyView->execute(SCI_SETCURRENTPOS, line_position + rightmost_position); + notifyView->execute(SCI_SETANCHOR, line_position + leftmost_position + 1); + } + } + } + else if (_isHotspotDblClicked) + { + int pos = notifyView->execute(SCI_GETCURRENTPOS); + notifyView->execute(SCI_SETCURRENTPOS, pos); + notifyView->execute(SCI_SETANCHOR, pos); + _isHotspotDblClicked = false; } - } - //break; - sender->resetDraggingPoint(); - return TRUE; - } - case TCN_TABDELETE: - { - int index = tabNotification->tabOrigin; - BufferID bufferToClose = notifyDocTab->getBufferByIndex(index); - Buffer * buf = MainFileManager->getBufferByID(bufferToClose); - int iView = isFromPrimary?MAIN_VIEW:SUB_VIEW; - if (buf->isDirty()) - { - activateBuffer(bufferToClose, iView); - } - fileClose(bufferToClose, iView); - break; - } - - case TCN_SELCHANGE: - { - int iView = -1; - if (notification->nmhdr.hwndFrom == _mainDocTab.getHSelf()) - { - iView = MAIN_VIEW; - } - else if (notification->nmhdr.hwndFrom == _subDocTab.getHSelf()) - { - iView = SUB_VIEW; - } - else - { break; } - switchEditViewTo(iView); - BufferID bufid = _pDocTab->getBufferByIndex(_pDocTab->getCurrentTabIndex()); - if (bufid != BUFFER_INVALID) - activateBuffer(bufid, iView); - - break; - } - - case NM_CLICK : - { - if (notification->nmhdr.hwndFrom == _statusBar.getHSelf()) - { - LPNMMOUSE lpnm = (LPNMMOUSE)notification; - if (lpnm->dwItemSpec == DWORD(STATUSBAR_TYPING_MODE)) - { - bool isOverTypeMode = (_pEditView->execute(SCI_GETOVERTYPE) != 0); - _pEditView->execute(SCI_SETOVERTYPE, !isOverTypeMode); - _statusBar.setText((_pEditView->execute(SCI_GETOVERTYPE))?TEXT("OVR"):TEXT("INS"), STATUSBAR_TYPING_MODE); - } - } - else if (notification->nmhdr.hwndFrom == _mainDocTab.getHSelf() && _activeView == SUB_VIEW) + case SCN_UPDATEUI: { - bool isSnapshotMode = NppParameters::getInstance()->getNppGUI().isSnapshotMode(); - if (isSnapshotMode) - { - // Before switching off, synchronize backup file - MainFileManager->backupCurrentBuffer(); - } - // Switch off - switchEditViewTo(MAIN_VIEW); - } - else if (notification->nmhdr.hwndFrom == _subDocTab.getHSelf() && _activeView == MAIN_VIEW) - { - bool isSnapshotMode = NppParameters::getInstance()->getNppGUI().isSnapshotMode(); - if (isSnapshotMode) - { - // Before switching off, synchronize backup file - MainFileManager->backupCurrentBuffer(); - } - // Switch off - switchEditViewTo(SUB_VIEW); - } + NppParameters *nppParam = NppParameters::getInstance(); - break; - } - - case NM_DBLCLK : - { - if (notification->nmhdr.hwndFrom == _statusBar.getHSelf()) - { - LPNMMOUSE lpnm = (LPNMMOUSE)notification; - if (lpnm->dwItemSpec == DWORD(STATUSBAR_CUR_POS)) - { - bool isFirstTime = !_goToLineDlg.isCreated(); - _goToLineDlg.doDialog(_nativeLangSpeaker.isRTL()); - if (isFirstTime) - _nativeLangSpeaker.changeDlgLang(_goToLineDlg.getHSelf(), "GoToLine"); - } - else if (lpnm->dwItemSpec == DWORD(STATUSBAR_DOC_SIZE)) - { - command(IDM_VIEW_SUMMARY); - } - else if (lpnm->dwItemSpec == DWORD(STATUSBAR_DOC_TYPE)) - { - POINT p; - ::GetCursorPos(&p); - HMENU hLangMenu = ::GetSubMenu(_mainMenuHandle, MENUINDEX_LANGUAGE); - TrackPopupMenu(hLangMenu, 0, p.x, p.y, 0, _pPublicInterface->getHSelf(), NULL); - } - else if (lpnm->dwItemSpec == DWORD(STATUSBAR_EOF_FORMAT)) - { - POINT p; - ::GetCursorPos(&p); - MenuPosition & menuPos = getMenuPosition("edit-eolConversion"); - HMENU hEditMenu = ::GetSubMenu(_mainMenuHandle, menuPos._x); - if (!hEditMenu) - return TRUE; - HMENU hEolFormatMenu = ::GetSubMenu(hEditMenu, menuPos._y); - if (!hEolFormatMenu) - return TRUE; - TrackPopupMenu(hEolFormatMenu, 0, p.x, p.y, 0, _pPublicInterface->getHSelf(), NULL); - } - } - break; - } - - case NM_RCLICK : - { - POINT p; - ::GetCursorPos(&p); - - if (notification->nmhdr.hwndFrom == _mainDocTab.getHSelf()) - { - switchEditViewTo(MAIN_VIEW); - } - else if (notification->nmhdr.hwndFrom == _subDocTab.getHSelf()) - { - switchEditViewTo(SUB_VIEW); - } - else if (notification->nmhdr.hwndFrom == _statusBar.getHSelf()) // From Status Bar - { - LPNMMOUSE lpnm = (LPNMMOUSE)notification; - if (lpnm->dwItemSpec == DWORD(STATUSBAR_DOC_TYPE)) - { - POINT p; - ::GetCursorPos(&p); - HMENU hLangMenu = ::GetSubMenu(_mainMenuHandle, MENUINDEX_LANGUAGE); - TrackPopupMenu(hLangMenu, 0, p.x, p.y, 0, _pPublicInterface->getHSelf(), NULL); - } - else if (lpnm->dwItemSpec == DWORD(STATUSBAR_EOF_FORMAT)) - { - POINT p; - ::GetCursorPos(&p); - MenuPosition & menuPos = getMenuPosition("edit-eolConversion"); - HMENU hEditMenu = ::GetSubMenu(_mainMenuHandle, menuPos._x); - if (!hEditMenu) - return TRUE; - HMENU hEolFormatMenu = ::GetSubMenu(hEditMenu, menuPos._y); - if (!hEolFormatMenu) - return TRUE; - TrackPopupMenu(hEolFormatMenu, 0, p.x, p.y, 0, _pPublicInterface->getHSelf(), NULL); - } - return TRUE; - } - else if (_pFileSwitcherPanel && notification->nmhdr.hwndFrom == _pFileSwitcherPanel->getHSelf()) - { - // Already switched, so do nothing here. - - if (_pFileSwitcherPanel->nbSelectedFiles() > 1) - { - if (!_fileSwitcherMultiFilePopupMenu.isCreated()) - { - vector itemUnitArray; - itemUnitArray.push_back(MenuItemUnit(IDM_FILESWITCHER_FILESCLOSE, TEXT("Close Selected files"))); - itemUnitArray.push_back(MenuItemUnit(IDM_FILESWITCHER_FILESCLOSEOTHERS, TEXT("Close others files"))); - - _fileSwitcherMultiFilePopupMenu.create(_pPublicInterface->getHSelf(), itemUnitArray); - _nativeLangSpeaker.changeLangTabContextMenu(_fileSwitcherMultiFilePopupMenu.getMenuHandle()); - } - _fileSwitcherMultiFilePopupMenu.display(p); - return TRUE; - } - } - else // From tool bar - return TRUE; - //break; - - if (!_tabPopupMenu.isCreated()) - { - vector itemUnitArray; - itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CLOSE, TEXT("Close"))); - itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CLOSEALL_BUT_CURRENT, TEXT("Close All BUT This"))); - itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CLOSEALL_TOLEFT, TEXT("Close All to the Left"))); - itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CLOSEALL_TORIGHT, TEXT("Close All to the Right"))); - itemUnitArray.push_back(MenuItemUnit(IDM_FILE_SAVE, TEXT("Save"))); - itemUnitArray.push_back(MenuItemUnit(IDM_FILE_SAVEAS, TEXT("Save As..."))); - itemUnitArray.push_back(MenuItemUnit(IDM_FILE_RENAME, TEXT("Rename"))); - itemUnitArray.push_back(MenuItemUnit(IDM_FILE_DELETE, TEXT("Move to Recycle Bin"))); - itemUnitArray.push_back(MenuItemUnit(IDM_FILE_RELOAD, TEXT("Reload"))); - itemUnitArray.push_back(MenuItemUnit(IDM_FILE_PRINT, TEXT("Print"))); - itemUnitArray.push_back(MenuItemUnit(0, NULL)); - itemUnitArray.push_back(MenuItemUnit(IDM_FILE_OPEN_FOLDER, TEXT("Open Containing Folder in Explorer"))); - itemUnitArray.push_back(MenuItemUnit(IDM_FILE_OPEN_CMD, TEXT("Open Containing Folder in cmd"))); - itemUnitArray.push_back(MenuItemUnit(0, NULL)); - itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_SETREADONLY, TEXT("Read-Only"))); - itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_CLEARREADONLY, TEXT("Clear Read-Only Flag"))); - itemUnitArray.push_back(MenuItemUnit(0, NULL)); - itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_FULLPATHTOCLIP, TEXT("Full File Path to Clipboard"))); - itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_FILENAMETOCLIP, TEXT("Filename to Clipboard"))); - itemUnitArray.push_back(MenuItemUnit(IDM_EDIT_CURRENTDIRTOCLIP, TEXT("Current Dir. Path to Clipboard"))); - itemUnitArray.push_back(MenuItemUnit(0, NULL)); - itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_GOTO_ANOTHER_VIEW, TEXT("Move to Other View"))); - itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_CLONE_TO_ANOTHER_VIEW, TEXT("Clone to Other View"))); - itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_GOTO_NEW_INSTANCE, TEXT("Move to New Instance"))); - itemUnitArray.push_back(MenuItemUnit(IDM_VIEW_LOAD_IN_NEW_INSTANCE, TEXT("Open in New Instance"))); - - _tabPopupMenu.create(_pPublicInterface->getHSelf(), itemUnitArray); - _nativeLangSpeaker.changeLangTabContextMenu(_tabPopupMenu.getMenuHandle()); - } - - bool isEnable = ((::GetMenuState(_mainMenuHandle, IDM_FILE_SAVE, MF_BYCOMMAND)&MF_DISABLED) == 0); - _tabPopupMenu.enableItem(IDM_FILE_SAVE, isEnable); - - Buffer * buf = _pEditView->getCurrentBuffer(); - bool isUserReadOnly = buf->getUserReadOnly(); - _tabPopupMenu.checkItem(IDM_EDIT_SETREADONLY, isUserReadOnly); - - bool isSysReadOnly = buf->getFileReadOnly(); - _tabPopupMenu.enableItem(IDM_EDIT_SETREADONLY, !isSysReadOnly); - _tabPopupMenu.enableItem(IDM_EDIT_CLEARREADONLY, isSysReadOnly); - - bool isFileExisting = PathFileExists(buf->getFullPathName()) != FALSE; - _tabPopupMenu.enableItem(IDM_FILE_DELETE, isFileExisting); - _tabPopupMenu.enableItem(IDM_FILE_RENAME, isFileExisting); - - bool isDirty = buf->isDirty(); - bool isUntitled = buf->isUntitled(); - _tabPopupMenu.enableItem(IDM_VIEW_GOTO_NEW_INSTANCE, !(isDirty||isUntitled)); - _tabPopupMenu.enableItem(IDM_VIEW_LOAD_IN_NEW_INSTANCE, !(isDirty||isUntitled)); - - _tabPopupMenu.display(p); - return TRUE; - } - - - case SCN_MARGINCLICK: - { - if (notification->nmhdr.hwndFrom == _mainEditView.getHSelf()) - switchEditViewTo(MAIN_VIEW); - else if (notification->nmhdr.hwndFrom == _subEditView.getHSelf()) - switchEditViewTo(SUB_VIEW); - - int lineClick = int(_pEditView->execute(SCI_LINEFROMPOSITION, notification->position)); - - if (notification->margin == ScintillaEditView::_SC_MARGE_FOLDER) - { - _pEditView->marginClick(notification->position, notification->modifiers); - if (_pDocMap) - _pDocMap->fold(lineClick, _pEditView->isFolded(lineClick)); - } - else if ((notification->margin == ScintillaEditView::_SC_MARGE_SYBOLE) && !notification->modifiers) - { - if (!_pEditView->markerMarginClick(lineClick)) - bookmarkToggle(lineClick); - } - break; - } - - case SCN_FOLDINGSTATECHANGED : - { - if ((notification->nmhdr.hwndFrom == _mainEditView.getHSelf()) - || (notification->nmhdr.hwndFrom == _subEditView.getHSelf())) - { - int lineClicked = notification->line; - - if (!_isFolding) + // replacement for obsolete custom SCN_SCROLLED + if (notification->updated & SC_UPDATE_V_SCROLL) { int urlAction = (NppParameters::getInstance())->getNppGUI()._styleURL; if ((urlAction == 1) || (urlAction == 2)) addHotSpot(); } + // if it's searching/replacing, then do nothing + if (nppParam->_isFindReplacing) + break; + + if (notification->nmhdr.hwndFrom != _pEditView->getHSelf()) + break; + + braceMatch(); + + NppGUI & nppGui = (NppGUI &)nppParam->getNppGUI(); + + if (nppGui._enableTagsMatchHilite) + { + XmlMatchedTagsHighlighter xmlTagMatchHiliter(_pEditView); + xmlTagMatchHiliter.tagMatch(nppGui._enableTagAttrsHilite); + } + + if (nppGui._enableSmartHilite) + { + if (nppGui._disableSmartHiliteTmp) + nppGui._disableSmartHiliteTmp = false; + else + _smartHighlighter.highlightView(notifyView); + } + + updateStatusBar(); + AutoCompletion * autoC = isFromPrimary?&_autoCompleteMain:&_autoCompleteSub; + autoC->update(0); + + break; + } + + case TTN_GETDISPINFO: + { + try + { + LPTOOLTIPTEXT lpttt = (LPTOOLTIPTEXT)notification; + + //Joce's fix + lpttt->hinst = NULL; + + POINT p; + ::GetCursorPos(&p); + ::ScreenToClient(_pPublicInterface->getHSelf(), &p); + HWND hWin = ::RealChildWindowFromPoint(_pPublicInterface->getHSelf(), p); + const int tipMaxLen = 1024; + static TCHAR docTip[tipMaxLen]; + docTip[0] = '\0'; + + generic_string tipTmp(TEXT("")); + int id = int(lpttt->hdr.idFrom); + + if (hWin == _rebarTop.getHSelf()) + { + getNameStrFromCmd(id, tipTmp); + if (tipTmp.length() >= 80) + return FALSE; + + lstrcpy(lpttt->szText, tipTmp.c_str()); + return TRUE; + } + else if (hWin == _mainDocTab.getHSelf()) + { + BufferID idd = _mainDocTab.getBufferByIndex(id); + Buffer * buf = MainFileManager->getBufferByID(idd); + tipTmp = buf->getFullPathName(); + + if (tipTmp.length() >= tipMaxLen) + return FALSE; + lstrcpy(docTip, tipTmp.c_str()); + lpttt->lpszText = docTip; + return TRUE; + } + else if (hWin == _subDocTab.getHSelf()) + { + BufferID idd = _subDocTab.getBufferByIndex(id); + Buffer * buf = MainFileManager->getBufferByID(idd); + tipTmp = buf->getFullPathName(); + + if (tipTmp.length() >= tipMaxLen) + return FALSE; + lstrcpy(docTip, tipTmp.c_str()); + lpttt->lpszText = docTip; + return TRUE; + } + else + return FALSE; + } + catch (...) + { + //printStr(TEXT("ToolTip crash is caught!")); + } + break; + } + + + case SCN_ZOOM: + { + break; + } + + case SCN_MACRORECORD: + { + _macro.push_back(recordedMacroStep(notification->message, notification->wParam, notification->lParam, _pEditView->execute(SCI_GETCODEPAGE))); + break; + } + + case SCN_PAINTED: + { + //--FLS: ViewMoveAtWrappingDisableFix: Disable wrapping messes up visible lines. Therefore save view position before in IDM_VIEW_WRAP and restore after SCN_PAINTED, as doc. says + if (_mainEditView.isWrapRestoreNeeded()) + { + _mainEditView.restoreCurrentPos(); + _mainEditView.setWrapRestoreNeeded(false); + } + + if (_subEditView.isWrapRestoreNeeded()) + { + _subEditView.restoreCurrentPos(); + _subEditView.setWrapRestoreNeeded(false); + } + notifyView->updateLineNumberWidth(); + if (_syncInfo.doSync()) + doSynScorll(HWND(notification->nmhdr.hwndFrom)); + + NppParameters *nppParam = NppParameters::getInstance(); + + // if it's searching/replacing, then do nothing + if ((_linkTriggered && !nppParam->_isFindReplacing) || notification->wParam == LINKTRIGGERED) + { + int urlAction = (NppParameters::getInstance())->getNppGUI()._styleURL; + if ((urlAction == 1) || (urlAction == 2)) + addHotSpot(); + _linkTriggered = false; + } + if (_pDocMap) - _pDocMap->fold(lineClicked, _pEditView->isFolded(lineClicked)); + { + _pDocMap->wrapMap(); + _pDocMap->scrollMap(); + } + break; } - return TRUE; - } - case SCN_CHARADDED: - { - const NppGUI & nppGui = NppParameters::getInstance()->getNppGUI(); - bool indentMaintain = nppGui._maitainIndent; - if (indentMaintain) - maintainIndentation(static_cast(notification->ch)); - - AutoCompletion * autoC = isFromPrimary?&_autoCompleteMain:&_autoCompleteSub; - bool isColumnMode = _pEditView->execute(SCI_GETSELECTIONS) > 1; // Multi-Selection || Column mode) - if (nppGui._matchedPairConf.hasAnyPairsPair() && !isColumnMode) - autoC->insertMatchedChars(notification->ch, nppGui._matchedPairConf); - autoC->update(notification->ch); - - break; - } - - case SCN_DOUBLECLICK : - { - if (notification->modifiers == SCMOD_CTRL) + case SCN_HOTSPOTDOUBLECLICK: { - const NppGUI & nppGUI = NppParameters::getInstance()->getNppGUI(); + notifyView->execute(SCI_SETWORDCHARS, 0, (LPARAM)"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-+.,:?&@=/%#()"); - std::string bufstring; - - unsigned int position_of_click; - // For some reason Ctrl+DoubleClick on an empty line means that notification->position == 1. - // In that case we use SCI_GETCURRENTPOS to get the position. - if (notification->position != -1) - position_of_click = notification->position; - else - position_of_click = int(_pEditView->execute(SCI_GETCURRENTPOS)); - - // Anonymous scope to limit use of the buf pointer (much easier to deal with std::string). - { - char *buf; - int length; - - if (nppGUI._delimiterSelectionOnEntireDocument) - { - // Get entire document. - length = notifyView->execute(SCI_GETLENGTH); - buf = new char[length + 1]; - notifyView->execute(SCI_GETTEXT, (LPARAM)(length + 1), (WPARAM)buf); - } - else - { - // Get single line. - length = notifyView->execute(SCI_GETCURLINE); - buf = new char[length + 1]; - notifyView->execute(SCI_GETCURLINE, (WPARAM)length, (LPARAM)buf); - - // Compute the position of the click (relative to the beginning of the line). - const int line_position = notifyView->execute(SCI_POSITIONFROMLINE, notifyView->getCurrentLineNumber()); - position_of_click = position_of_click - line_position; - } - - bufstring = buf; - delete [] buf; - } - - int leftmost_position = -1; - int rightmost_position = -1; - - if (nppGUI._rightmostDelimiter == nppGUI._leftmostDelimiter) - { - // If the delimiters are the same (e.g. they are both a quotation mark), choose the ones - // which are closest to the clicked position. - for (int i = position_of_click; i >= 0; --i) - { - if (bufstring.at(i) == nppGUI._leftmostDelimiter) - { - // Respect escaped quotation marks. - if (nppGUI._leftmostDelimiter == '"') - { - if (! (i > 0 && bufstring.at(i - 1) == '\\')) - { - leftmost_position = i; - break; - } - } - else - { - leftmost_position = i; - break; - } - } - } - - if (leftmost_position == -1) - break; - - // Scan for right delimiter. - for (unsigned int i = position_of_click; i < bufstring.length(); ++i) - { - if (bufstring.at(i) == nppGUI._rightmostDelimiter) - { - // Respect escaped quotation marks. - if (nppGUI._rightmostDelimiter == '"') - { - if (! (i > 0 && bufstring.at(i - 1) == '\\')) - { - rightmost_position = i; - break; - } - } - else - { - rightmost_position = i; - break; - } - } - } - } - else - { - // Find matching pairs of delimiters (e.g. parantheses). - // The pair where the distance from the left delimiter to position_of_click is at a minimum is the one we're looking for. - // Of course position_of_click must lie between the delimiters. - - // This logic is required to handle cases like this: - // (size_t i = function(); i < _buffers.size(); i++) - - std::stack leftmost_delimiter_positions; - - for (unsigned int i = 0; i < bufstring.length(); ++i) - { - if (bufstring.at(i) == nppGUI._leftmostDelimiter) - leftmost_delimiter_positions.push(i); - else if (bufstring.at(i) == nppGUI._rightmostDelimiter && ! leftmost_delimiter_positions.empty()) - { - unsigned int matching_leftmost = leftmost_delimiter_positions.top(); - leftmost_delimiter_positions.pop(); - - // We have either 1) chosen neither the left- or rightmost position, or 2) chosen both left- and rightmost position. - assert( (leftmost_position == -1 && rightmost_position == -1) || (leftmost_position >= 0 && rightmost_position >= 0) ); - - // Note: cast of leftmost_position to unsigned int is safe, since if leftmost_position is not -1 then it is guaranteed to be positive. - // If it was possible, leftmost_position and rightmost_position should be of type optional. - if ( matching_leftmost <= position_of_click && i >= position_of_click && (leftmost_position == -1 || matching_leftmost > (unsigned int)leftmost_position) ) - { - leftmost_position = matching_leftmost; - rightmost_position = i; - } - } - } - } - - // Set selection to the position we found (if any). - if (rightmost_position != -1 && leftmost_position != -1) - { - if (nppGUI._delimiterSelectionOnEntireDocument) - { - notifyView->execute(SCI_SETCURRENTPOS, rightmost_position); - notifyView->execute(SCI_SETANCHOR, leftmost_position + 1); - } - else - { - const int line_position = notifyView->execute(SCI_POSITIONFROMLINE, notifyView->getCurrentLineNumber()); - notifyView->execute(SCI_SETCURRENTPOS, line_position + rightmost_position); - notifyView->execute(SCI_SETANCHOR, line_position + leftmost_position + 1); - } - } - } - else if (_isHotspotDblClicked) - { int pos = notifyView->execute(SCI_GETCURRENTPOS); - notifyView->execute(SCI_SETCURRENTPOS, pos); - notifyView->execute(SCI_SETANCHOR, pos); - _isHotspotDblClicked = false; + int startPos = static_cast(notifyView->execute(SCI_WORDSTARTPOSITION, pos, false)); + int endPos = static_cast(notifyView->execute(SCI_WORDENDPOSITION, pos, false)); + + notifyView->execute(SCI_SETTARGETSTART, startPos); + notifyView->execute(SCI_SETTARGETEND, endPos); + + int posFound = notifyView->execute(SCI_SEARCHINTARGET, strlen(URL_REG_EXPR), (LPARAM)URL_REG_EXPR); + if (posFound != -2) + { + if (posFound != -1) + { + startPos = int(notifyView->execute(SCI_GETTARGETSTART)); + endPos = int(notifyView->execute(SCI_GETTARGETEND)); + } + + // Prevent buffer overflow in getGenericText(). + if(endPos - startPos > 2*MAX_PATH) + endPos = startPos + 2*MAX_PATH; + + TCHAR currentWord[2*MAX_PATH]; + + notifyView->getGenericText(currentWord, MAX_PATH*2, startPos, endPos); + + // This treatment would fail on some valid URLs where there's actually supposed to be a comma or parenthesis at the end. + int lastCharIndex = _tcsnlen(currentWord, MAX_PATH*2) - 1; + if(lastCharIndex >= 0 && (currentWord[lastCharIndex] == ',' || currentWord[lastCharIndex] == ')' || currentWord[lastCharIndex] == '(')) + currentWord[lastCharIndex] = '\0'; + + ::ShellExecute(_pPublicInterface->getHSelf(), TEXT("open"), currentWord, NULL, NULL, SW_SHOW); + _isHotspotDblClicked = true; + notifyView->execute(SCI_SETCHARSDEFAULT); + } + break; } - } - break; - case SCN_UPDATEUI: - { - NppParameters *nppParam = NppParameters::getInstance(); - - // replacement for obsolete custom SCN_SCROLLED - if (notification->updated & SC_UPDATE_V_SCROLL) + case SCN_NEEDSHOWN: { - int urlAction = (NppParameters::getInstance())->getNppGUI()._styleURL; - if ((urlAction == 1) || (urlAction == 2)) - addHotSpot(); + int begin = notifyView->execute(SCI_LINEFROMPOSITION, notification->position); + int end = notifyView->execute(SCI_LINEFROMPOSITION, notification->position + notification->length); + int firstLine = begin < end ? begin : end; + int lastLine = begin > end ? begin : end; + + for (int line = firstLine; line <= lastLine; ++line) + notifyView->execute(SCI_ENSUREVISIBLE, line, 0); + break; } - // if it's searching/replacing, then do nothing - if (nppParam->_isFindReplacing) + case SCN_CALLTIPCLICK: + { + AutoCompletion * autoC = isFromPrimary?&_autoCompleteMain:&_autoCompleteSub; + autoC->callTipClick(notification->position); + break; + } + + case RBN_HEIGHTCHANGE: + { + SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, 0, 0); + break; + } + + case RBN_CHEVRONPUSHED: + { + NMREBARCHEVRON * lpnm = (NMREBARCHEVRON*) notification; + ReBar * notifRebar = &_rebarTop; + if (_rebarBottom.getHSelf() == lpnm->hdr.hwndFrom) + notifRebar = &_rebarBottom; + + //If N++ ID, use proper object + if (lpnm->wID == REBAR_BAR_TOOLBAR) + { + POINT pt; + pt.x = lpnm->rc.left; + pt.y = lpnm->rc.bottom; + ClientToScreen(notifRebar->getHSelf(), &pt); + _toolBar.doPopop(pt); + return TRUE; + } + + //Else forward notification to window of rebarband + REBARBANDINFO rbBand; + ZeroMemory(&rbBand, REBARBAND_SIZE); + rbBand.cbSize = REBARBAND_SIZE; + + rbBand.fMask = RBBIM_CHILD; + ::SendMessage(notifRebar->getHSelf(), RB_GETBANDINFO, lpnm->uBand, (LPARAM)&rbBand); + ::SendMessage(rbBand.hwndChild, WM_NOTIFY, 0, (LPARAM)lpnm); + break; + } + + default: break; - if (notification->nmhdr.hwndFrom != _pEditView->getHSelf()) - break; - - braceMatch(); - - NppGUI & nppGui = (NppGUI &)nppParam->getNppGUI(); - - if (nppGui._enableTagsMatchHilite) - { - XmlMatchedTagsHighlighter xmlTagMatchHiliter(_pEditView); - xmlTagMatchHiliter.tagMatch(nppGui._enableTagAttrsHilite); - } - - if (nppGui._enableSmartHilite) - { - if (nppGui._disableSmartHiliteTmp) - nppGui._disableSmartHiliteTmp = false; - else - _smartHighlighter.highlightView(notifyView); - } - - updateStatusBar(); - AutoCompletion * autoC = isFromPrimary?&_autoCompleteMain:&_autoCompleteSub; - autoC->update(0); - - break; } - - case TTN_GETDISPINFO: - { - try { - LPTOOLTIPTEXT lpttt = (LPTOOLTIPTEXT)notification; - - //Joce's fix - lpttt->hinst = NULL; - - POINT p; - ::GetCursorPos(&p); - ::ScreenToClient(_pPublicInterface->getHSelf(), &p); - HWND hWin = ::RealChildWindowFromPoint(_pPublicInterface->getHSelf(), p); - const int tipMaxLen = 1024; - static TCHAR docTip[tipMaxLen]; - docTip[0] = '\0'; - - generic_string tipTmp(TEXT("")); - int id = int(lpttt->hdr.idFrom); - - if (hWin == _rebarTop.getHSelf()) - { - getNameStrFromCmd(id, tipTmp); - if (tipTmp.length() >= 80) - return FALSE; - - lstrcpy(lpttt->szText, tipTmp.c_str()); - return TRUE; - } - else if (hWin == _mainDocTab.getHSelf()) - { - BufferID idd = _mainDocTab.getBufferByIndex(id); - Buffer * buf = MainFileManager->getBufferByID(idd); - tipTmp = buf->getFullPathName(); - - if (tipTmp.length() >= tipMaxLen) - return FALSE; - lstrcpy(docTip, tipTmp.c_str()); - lpttt->lpszText = docTip; - return TRUE; - } - else if (hWin == _subDocTab.getHSelf()) - { - BufferID idd = _subDocTab.getBufferByIndex(id); - Buffer * buf = MainFileManager->getBufferByID(idd); - tipTmp = buf->getFullPathName(); - - if (tipTmp.length() >= tipMaxLen) - return FALSE; - lstrcpy(docTip, tipTmp.c_str()); - lpttt->lpszText = docTip; - return TRUE; - } - else - { - return FALSE; - } - } catch (...) { - //printStr(TEXT("ToolTip crash is caught!")); - } - } - break; - - - case SCN_ZOOM: - break; - - case SCN_MACRORECORD: - _macro.push_back(recordedMacroStep(notification->message, notification->wParam, notification->lParam, _pEditView->execute(SCI_GETCODEPAGE))); - break; - - case SCN_PAINTED: - { - //--FLS: ViewMoveAtWrappingDisableFix: Disable wrapping messes up visible lines. Therefore save view position before in IDM_VIEW_WRAP and restore after SCN_PAINTED, as doc. says - if (_mainEditView.isWrapRestoreNeeded()) - { - _mainEditView.restoreCurrentPos(); - _mainEditView.setWrapRestoreNeeded(false); - } - - if (_subEditView.isWrapRestoreNeeded()) - { - _subEditView.restoreCurrentPos(); - _subEditView.setWrapRestoreNeeded(false); - } - notifyView->updateLineNumberWidth(); - if (_syncInfo.doSync()) - doSynScorll(HWND(notification->nmhdr.hwndFrom)); - - NppParameters *nppParam = NppParameters::getInstance(); - - // if it's searching/replacing, then do nothing - if ((_linkTriggered && !nppParam->_isFindReplacing) || notification->wParam == LINKTRIGGERED) - { - int urlAction = (NppParameters::getInstance())->getNppGUI()._styleURL; - if ((urlAction == 1) || (urlAction == 2)) - addHotSpot(); - _linkTriggered = false; - } - - if (_pDocMap) - { - _pDocMap->wrapMap(); - _pDocMap->scrollMap(); - } - break; - } - - case SCN_HOTSPOTDOUBLECLICK : - { - notifyView->execute(SCI_SETWORDCHARS, 0, (LPARAM)"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-+.,:?&@=/%#()"); - - int pos = notifyView->execute(SCI_GETCURRENTPOS); - int startPos = static_cast(notifyView->execute(SCI_WORDSTARTPOSITION, pos, false)); - int endPos = static_cast(notifyView->execute(SCI_WORDENDPOSITION, pos, false)); - - notifyView->execute(SCI_SETTARGETSTART, startPos); - notifyView->execute(SCI_SETTARGETEND, endPos); - - int posFound = notifyView->execute(SCI_SEARCHINTARGET, strlen(URL_REG_EXPR), (LPARAM)URL_REG_EXPR); - if (posFound != -2) - { - if (posFound != -1) - { - startPos = int(notifyView->execute(SCI_GETTARGETSTART)); - endPos = int(notifyView->execute(SCI_GETTARGETEND)); - } - - // Prevent buffer overflow in getGenericText(). - if(endPos - startPos > 2*MAX_PATH) - endPos = startPos + 2*MAX_PATH; - - TCHAR currentWord[2*MAX_PATH]; - - notifyView->getGenericText(currentWord, MAX_PATH*2, startPos, endPos); - - // This treatment would fail on some valid URLs where there's actually supposed to be a comma or parenthesis at the end. - int lastCharIndex = _tcsnlen(currentWord, MAX_PATH*2) - 1; - if(lastCharIndex >= 0 && (currentWord[lastCharIndex] == ',' || currentWord[lastCharIndex] == ')' || currentWord[lastCharIndex] == '(')) - currentWord[lastCharIndex] = '\0'; - - ::ShellExecute(_pPublicInterface->getHSelf(), TEXT("open"), currentWord, NULL, NULL, SW_SHOW); - _isHotspotDblClicked = true; - notifyView->execute(SCI_SETCHARSDEFAULT); - } - break; - } - - case SCN_NEEDSHOWN : - { - int begin = notifyView->execute(SCI_LINEFROMPOSITION, notification->position); - int end = notifyView->execute(SCI_LINEFROMPOSITION, notification->position + notification->length); - int firstLine = begin < end ? begin : end; - int lastLine = begin > end ? begin : end; - for (int line = firstLine; line <= lastLine; ++line) - { - notifyView->execute(SCI_ENSUREVISIBLE, line, 0); - } - break; - } - - case SCN_CALLTIPCLICK: - { - AutoCompletion * autoC = isFromPrimary?&_autoCompleteMain:&_autoCompleteSub; - autoC->callTipClick(notification->position); - break; - } - - case RBN_HEIGHTCHANGE: - { - SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, 0, 0); - break; - } - case RBN_CHEVRONPUSHED: - { - NMREBARCHEVRON * lpnm = (NMREBARCHEVRON*) notification; - ReBar * notifRebar = &_rebarTop; - if (_rebarBottom.getHSelf() == lpnm->hdr.hwndFrom) - notifRebar = &_rebarBottom; - //If N++ ID, use proper object - if (lpnm->wID == REBAR_BAR_TOOLBAR) - { - POINT pt; - pt.x = lpnm->rc.left; - pt.y = lpnm->rc.bottom; - ClientToScreen(notifRebar->getHSelf(), &pt); - _toolBar.doPopop(pt); - return TRUE; - } - //Else forward notification to window of rebarband - REBARBANDINFO rbBand; - ZeroMemory(&rbBand, REBARBAND_SIZE); - rbBand.cbSize = REBARBAND_SIZE; - - rbBand.fMask = RBBIM_CHILD; - ::SendMessage(notifRebar->getHSelf(), RB_GETBANDINFO, lpnm->uBand, (LPARAM)&rbBand); - ::SendMessage(rbBand.hwndChild, WM_NOTIFY, 0, (LPARAM)lpnm); - break; - } - - default : - break; - - } - return FALSE; + return FALSE; } diff --git a/PowerEditor/src/ScitillaComponent/UserDefineResource.h b/PowerEditor/src/ScitillaComponent/UserDefineResource.h index 01283a2f6..2f942ed98 100644 --- a/PowerEditor/src/ScitillaComponent/UserDefineResource.h +++ b/PowerEditor/src/ScitillaComponent/UserDefineResource.h @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. diff --git a/PowerEditor/src/WinControls/ColourPicker/ColourPicker.cpp b/PowerEditor/src/WinControls/ColourPicker/ColourPicker.cpp index 4810b7cae..b265f1841 100644 --- a/PowerEditor/src/WinControls/ColourPicker/ColourPicker.cpp +++ b/PowerEditor/src/WinControls/ColourPicker/ColourPicker.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -24,74 +24,69 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - #include #include "ColourPicker.h" #include "ColourPopup.h" + + + void ColourPicker::init(HINSTANCE hInst, HWND parent) { Window::init(hInst, parent); _hSelf = ::CreateWindowEx( - 0, - TEXT("Button"), - TEXT("F"), - WS_CHILD | WS_VISIBLE, - 0, 0, 25, 25, - _hParent, - NULL, - _hInst, - (LPVOID)0); + 0, + TEXT("Button"), + TEXT("F"), + WS_CHILD | WS_VISIBLE, + 0, 0, 25, 25, + _hParent, NULL, _hInst, (LPVOID)0); + if (!_hSelf) - { throw std::runtime_error("ColourPicker::init : CreateWindowEx() function return null"); - } - - - ::SetWindowLongPtr(_hSelf, GWLP_USERDATA, (LONG_PTR)this); - _buttonDefaultProc = reinterpret_cast(::SetWindowLongPtr(_hSelf, GWLP_WNDPROC, (LONG_PTR)staticWinProc)); + ::SetWindowLongPtr(_hSelf, GWLP_USERDATA, (LONG_PTR)this); + _buttonDefaultProc = reinterpret_cast(::SetWindowLongPtr(_hSelf, GWLP_WNDPROC, (LONG_PTR)staticWinProc)); } + void ColourPicker::destroy() { - if (_pColourPopup) - { - delete _pColourPopup; - _pColourPopup = NULL; - } + delete _pColourPopup; + _pColourPopup = NULL; ::DestroyWindow(_hSelf); } + void ColourPicker::drawBackground(HDC hDC) { - RECT rc; + RECT rc; HBRUSH hbrush; - if(!hDC) + if (!hDC) return; - getClientRect(rc); + getClientRect(rc); hbrush = ::CreateSolidBrush(_currentColour); HGDIOBJ oldObj = ::SelectObject(hDC, hbrush); ::Rectangle(hDC, 0, 0, rc.right, rc.bottom); ::SelectObject(hDC, oldObj); //FillRect(hDC, &rc, hbrush); - ::DeleteObject(hbrush); + ::DeleteObject(hbrush); } + void ColourPicker::drawForeground(HDC hDC) { - RECT rc; + RECT rc; HBRUSH hbrush = NULL; - if(!hDC || _isEnabled) + if (!hDC || _isEnabled) return; int oldMode = ::SetBkMode(hDC, TRANSPARENT); - getClientRect(rc); + getClientRect(rc); COLORREF strikeOut = RGB(0,0,0); if ((((_currentColour ) & 0xFF) + ((_currentColour >> 8) & 0xFF) + @@ -103,17 +98,18 @@ void ColourPicker::drawForeground(HDC hDC) ::Rectangle(hDC, 0, 0, rc.right, rc.bottom); ::SelectObject(hDC, oldObj); //FillRect(hDC, &rc, hbrush); - ::DeleteObject(hbrush); + ::DeleteObject(hbrush); ::SetBkMode(hDC, oldMode); } + LRESULT ColourPicker::runProc(UINT Message, WPARAM wParam, LPARAM lParam) { switch (Message) { - case WM_LBUTTONDBLCLK : - case WM_LBUTTONDOWN : - { + case WM_LBUTTONDBLCLK: + case WM_LBUTTONDOWN: + { RECT rc; POINT p; Window::getClientRect(rc); @@ -134,8 +130,9 @@ LRESULT ColourPicker::runProc(UINT Message, WPARAM wParam, LPARAM lParam) _pColourPopup->doDialog(p); _pColourPopup->display(true); } - return TRUE; - } + return TRUE; + } + case WM_RBUTTONDOWN: { _isEnabled = !_isEnabled; @@ -152,41 +149,44 @@ LRESULT ColourPicker::runProc(UINT Message, WPARAM wParam, LPARAM lParam) break; } - case WM_PAINT : - { + case WM_PAINT: + { PAINTSTRUCT ps; HDC dc = ::BeginPaint(_hSelf, &ps); - drawForeground(dc); + drawForeground(dc); ::EndPaint(_hSelf, &ps); - return TRUE; - } + return TRUE; + } - case WM_PICKUP_COLOR : - { - _currentColour = (COLORREF)wParam; - redraw(); + case WM_PICKUP_COLOR: + { + _currentColour = (COLORREF)wParam; + redraw(); _pColourPopup->display(false); ::SendMessage(_hParent, WM_COMMAND, MAKELONG(0, CPN_COLOURPICKED), (LPARAM)_hSelf); - return TRUE; - } + return TRUE; + } - case WM_ENABLE : - { - if ((BOOL)wParam == FALSE) - { - _currentColour = ::GetSysColor(COLOR_3DFACE); - redraw(); - } - return TRUE; - } + case WM_ENABLE: + { + if ((BOOL)wParam == FALSE) + { + _currentColour = ::GetSysColor(COLOR_3DFACE); + redraw(); + } + return TRUE; + } - case WM_PICKUP_CANCEL : + case WM_PICKUP_CANCEL: + { _pColourPopup->display(false); return TRUE; + } - default : + default: return ::CallWindowProc(_buttonDefaultProc, _hSelf, Message, wParam, lParam); } + return FALSE; } diff --git a/PowerEditor/src/WinControls/ColourPicker/ColourPopup.h b/PowerEditor/src/WinControls/ColourPicker/ColourPopup.h index 6fda0992a..07405d8b8 100644 --- a/PowerEditor/src/WinControls/ColourPicker/ColourPopup.h +++ b/PowerEditor/src/WinControls/ColourPicker/ColourPopup.h @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -24,62 +24,54 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - -#ifndef COLOUR_POPUP_H -#define COLOUR_POPUP_H - -#ifndef COLOUR_POPUP_RESOURCE_H +#pragma once #include "ColourPopupResource.h" -#endif //COLOUR_POPUP_RESOURCE_H - -#ifndef RESOURCE_H #include "resource.h" -#endif //RESOURCE_H - #include "Window.h" -#define WM_PICKUP_COLOR (COLOURPOPUP_USER + 1) +#define WM_PICKUP_COLOR (COLOURPOPUP_USER + 1) #define WM_PICKUP_CANCEL (COLOURPOPUP_USER + 2) + + class ColourPopup : public Window { public : - ColourPopup() : Window()/*, isColourChooserLaunched(false)*/ {}; - ColourPopup(COLORREF defaultColor) : Window(), /* isColourChooserLaunched(false), */ _colour(defaultColor) {}; - ~ColourPopup(){}; - - bool isCreated() const { + ColourPopup() = default; + explicit ColourPopup(COLORREF defaultColor) : _colour(defaultColor) {} + virtual ~ColourPopup() {} + + bool isCreated() const + { return (_hSelf != NULL); - }; - + } + void create(int dialogID); - void doDialog(POINT p) { - if (!isCreated()) - create(IDD_COLOUR_POPUP); - ::SetWindowPos(_hSelf, HWND_TOP, p.x, p.y, _rc.right - _rc.left, _rc.bottom - _rc.top, SWP_SHOWWINDOW); - }; + void doDialog(POINT p) + { + if (!isCreated()) + create(IDD_COLOUR_POPUP); + ::SetWindowPos(_hSelf, HWND_TOP, p.x, p.y, _rc.right - _rc.left, _rc.bottom - _rc.top, SWP_SHOWWINDOW); + } - virtual void destroy() { - ::DestroyWindow(_hSelf); - }; + virtual void destroy() + { + ::DestroyWindow(_hSelf); + } - void setColour(COLORREF c) { - _colour = c; - }; + void setColour(COLORREF c) + { + _colour = c; + } - COLORREF getSelColour(){return _colour;}; + COLORREF getSelColour(){return _colour;}; private : RECT _rc; - COLORREF _colour; - //bool isColourChooserLaunched; + COLORREF _colour; + //bool isColourChooserLaunched = false; static INT_PTR CALLBACK dlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); INT_PTR CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); }; - -#endif //COLOUR_POPUP_H - - diff --git a/PowerEditor/src/WinControls/ColourPicker/ColourPopupResource.h b/PowerEditor/src/WinControls/ColourPicker/ColourPopupResource.h index 4986ff0d3..683fce241 100644 --- a/PowerEditor/src/WinControls/ColourPicker/ColourPopupResource.h +++ b/PowerEditor/src/WinControls/ColourPicker/ColourPopupResource.h @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -24,11 +24,7 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +#pragma once - -#ifndef COLOUR_POPUP_RESOURCE_H - -#define IDD_COLOUR_POPUP 2100 -#define IDC_COLOUR_LIST (IDD_COLOUR_POPUP + 1) - -#endif //COLOUR_POPUP_RESOURCE_H +#define IDD_COLOUR_POPUP 2100 +#define IDC_COLOUR_LIST (IDD_COLOUR_POPUP + 1) diff --git a/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.cpp b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.cpp index 04f77077e..1f037d1ee 100644 --- a/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.cpp +++ b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.cpp @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -37,35 +37,35 @@ using namespace std; LRESULT CALLBACK ColourStaticTextHooker::colourStaticProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { switch(Message) - { - case WM_PAINT: - { - RECT rect; - ::GetClientRect(hwnd, &rect); + { + case WM_PAINT: + { + RECT rect; + ::GetClientRect(hwnd, &rect); - PAINTSTRUCT ps; - HDC hdc = ::BeginPaint(hwnd, &ps); - - ::SetTextColor(hdc, _colour); + PAINTSTRUCT ps; + HDC hdc = ::BeginPaint(hwnd, &ps); - // Get the default GUI font - HFONT hf = (HFONT)::GetStockObject(DEFAULT_GUI_FONT); + ::SetTextColor(hdc, _colour); + + // Get the default GUI font + HFONT hf = (HFONT)::GetStockObject(DEFAULT_GUI_FONT); HANDLE hOld = SelectObject(hdc, hf); - // Draw the text! - TCHAR text[MAX_PATH]; - ::GetWindowText(hwnd, text, MAX_PATH); - ::DrawText(hdc, text, -1, &rect, DT_LEFT); - - ::SelectObject(hdc, hOld); + // Draw the text! + TCHAR text[MAX_PATH]; + ::GetWindowText(hwnd, text, MAX_PATH); + ::DrawText(hdc, text, -1, &rect, DT_LEFT); - ::EndPaint(hwnd, &ps); + ::SelectObject(hdc, hOld); - return TRUE; - } - } - return ::CallWindowProc(_oldProc, hwnd, Message, wParam, lParam); + ::EndPaint(hwnd, &ps); + + return TRUE; + } + } + return ::CallWindowProc(_oldProc, hwnd, Message, wParam, lParam); } void WordStyleDlg::updateGlobalOverrideCtrls() { @@ -87,8 +87,8 @@ INT_PTR CALLBACK WordStyleDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM l { NppParameters *nppParamInst = NppParameters::getInstance(); - _hCheckBold = ::GetDlgItem(_hSelf, IDC_BOLD_CHECK); - _hCheckItalic = ::GetDlgItem(_hSelf, IDC_ITALIC_CHECK); + _hCheckBold = ::GetDlgItem(_hSelf, IDC_BOLD_CHECK); + _hCheckItalic = ::GetDlgItem(_hSelf, IDC_ITALIC_CHECK); _hCheckUnderline = ::GetDlgItem(_hSelf, IDC_UNDERLINE_CHECK); _hFontNameCombo = ::GetDlgItem(_hSelf, IDC_FONT_COMBO); _hFontSizeCombo = ::GetDlgItem(_hSelf, IDC_FONTSIZE_COMBO); @@ -110,12 +110,12 @@ INT_PTR CALLBACK WordStyleDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM l { pair & themeInfo = themeSwitcher.getElementFromIndex(i); int j = ::SendMessage(_hSwitch2ThemeCombo, CB_ADDSTRING, 0, (LPARAM)themeInfo.first.c_str()); - if (! themeInfo.second.compare( nppParamInst->getNppGUI()._themeName ) ) + if (! themeInfo.second.compare( nppParamInst->getNppGUI()._themeName ) ) { _currentThemeIndex = j; _themeName.assign(themeInfo.second); } - if (! themeInfo.first.compare(TEXT("Default")) ) + if (! themeInfo.first.compare(TEXT("Default")) ) { defaultThemeIndex = j; } @@ -141,16 +141,15 @@ INT_PTR CALLBACK WordStyleDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM l _pFgColour->init(_hInst, _hSelf); _pBgColour->init(_hInst, _hSelf); - POINT p1, p2; + POINT p1, p2; + alignWith(_hFgColourStaticText, _pFgColour->getHSelf(), PosAlign::right, p1); + alignWith(_hBgColourStaticText, _pBgColour->getHSelf(), PosAlign::right, p2); - alignWith(_hFgColourStaticText, _pFgColour->getHSelf(), ALIGNPOS_RIGHT, p1); - alignWith(_hBgColourStaticText, _pBgColour->getHSelf(), ALIGNPOS_RIGHT, p2); + p1.x = p2.x = ((p1.x > p2.x)?p1.x:p2.x) + 10; + p1.y -= 4; p2.y -= 4; - p1.x = p2.x = ((p1.x > p2.x)?p1.x:p2.x) + 10; - p1.y -= 4; p2.y -= 4; - - ::MoveWindow((HWND)_pFgColour->getHSelf(), p1.x, p1.y, 25, 25, TRUE); - ::MoveWindow((HWND)_pBgColour->getHSelf(), p2.x, p2.y, 25, 25, TRUE); + ::MoveWindow((HWND)_pFgColour->getHSelf(), p1.x, p1.y, 25, 25, TRUE); + ::MoveWindow((HWND)_pBgColour->getHSelf(), p2.x, p2.y, 25, 25, TRUE); _pFgColour->display(); _pBgColour->display(); @@ -170,7 +169,6 @@ INT_PTR CALLBACK WordStyleDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM l goToCenter(); loadLangListFromNppParam(); - return TRUE; } @@ -193,10 +191,10 @@ INT_PTR CALLBACK WordStyleDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM l return TRUE; } - case WM_COMMAND : + case WM_COMMAND : { if (HIWORD(wParam) == EN_CHANGE) - { + { int editID = LOWORD(wParam); if (editID == IDC_USER_KEYWORDS_EDIT) { @@ -237,21 +235,21 @@ INT_PTR CALLBACK WordStyleDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM l if (_isDirty) { NppParameters *nppParamInst = NppParameters::getInstance(); - if (_restoreInvalid) - { + if (_restoreInvalid) + { generic_string str( nppParamInst->getNppGUI()._themeName ); nppParamInst->reloadStylers( &str[0] ); } LexerStylerArray & lsArray = nppParamInst->getLStylerArray(); StyleArray & globalStyles = nppParamInst->getGlobalStylers(); - - if (_restoreInvalid) + + if (_restoreInvalid) { _lsArray = _styles2restored = lsArray; _globalStyles = _gstyles2restored = globalStyles; } - else + else { globalStyles = _globalStyles = _gstyles2restored; lsArray = _lsArray = _styles2restored; @@ -264,7 +262,7 @@ INT_PTR CALLBACK WordStyleDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM l _isThemeDirty = false; setVisualFromStyleList(); - + //(nppParamInst->getNppGUI())._themeName ::SendMessage(_hSwitch2ThemeCombo, CB_SETCURSEL, _currentThemeIndex, 0); ::SendMessage(_hParent, WM_UPDATESCINTILLAS, 0, 0); @@ -297,7 +295,7 @@ INT_PTR CALLBACK WordStyleDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM l ::SendMessage(_hParent, WM_UPDATESCINTILLAS, 0, 0); return TRUE; } - + case IDC_SC_TRANSPARENT_CHECK : { bool isChecked = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_SC_TRANSPARENT_CHECK, BM_GETCHECK, 0, 0)); @@ -355,7 +353,7 @@ INT_PTR CALLBACK WordStyleDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM l apply(); return TRUE; } - + case IDC_GLOBAL_ITALIC_CHECK : { GlobalOverride & glo = (NppParameters::getInstance())->getGlobalOverrideStyle(); @@ -416,7 +414,7 @@ INT_PTR CALLBACK WordStyleDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM l return TRUE; } - case CPN_COLOURPICKED: + case CPN_COLOURPICKED: { if ((HWND)lParam == _pFgColour->getHSelf()) { @@ -467,17 +465,17 @@ void WordStyleDlg::loadLangListFromNppParam() { NppParameters *nppParamInst = NppParameters::getInstance(); _lsArray = nppParamInst->getLStylerArray(); - _globalStyles = nppParamInst->getGlobalStylers(); + _globalStyles = nppParamInst->getGlobalStylers(); // Clean up Language List ::SendDlgItemMessage(_hSelf, IDC_LANGUAGES_LIST, LB_RESETCONTENT, 0, 0); ::SendDlgItemMessage(_hSelf, IDC_LANGUAGES_LIST, LB_ADDSTRING, 0, (LPARAM)TEXT("Global Styles")); // All the lexers - for (int i = 0, nb = _lsArray.getNbLexer() ; i < nb ; ++i) - { + for (int i = 0, nb = _lsArray.getNbLexer() ; i < nb ; ++i) + { ::SendDlgItemMessage(_hSelf, IDC_LANGUAGES_LIST, LB_ADDSTRING, 0, (LPARAM)_lsArray.getLexerDescFromIndex(i)); - } + } const int index2Begin = 0; ::SendDlgItemMessage(_hSelf, IDC_LANGUAGES_LIST, LB_SETCURSEL, 0, index2Begin); @@ -491,7 +489,7 @@ void WordStyleDlg::updateThemeName(generic_string themeName) nppGUI._themeName.assign( themeName ); } -int WordStyleDlg::whichTabColourIndex() +int WordStyleDlg::whichTabColourIndex() { int i = ::SendDlgItemMessage(_hSelf, IDC_STYLES_LIST, LB_GETCURSEL, 0, 0); if (i == LB_ERR) @@ -582,7 +580,7 @@ void WordStyleDlg::updateUserKeywords() void WordStyleDlg::updateFontName() { - Style & style = getCurrentStyler(); + Style & style = getCurrentStyler(); int iFontSel = ::SendMessage(_hFontNameCombo, CB_GETCURSEL, 0, 0); TCHAR *fnStr = (TCHAR *)::SendMessage(_hFontNameCombo, CB_GETITEMDATA, iFontSel, 0); style._fontName = fnStr; @@ -590,7 +588,7 @@ void WordStyleDlg::updateFontName() void WordStyleDlg::updateFontStyleStatus(fontStyleType whitchStyle) { - Style & style = getCurrentStyler(); + Style & style = getCurrentStyler(); if (style._fontStyle == STYLE_NOT_USED) style._fontStyle = FONTSTYLE_NONE; @@ -624,11 +622,11 @@ void WordStyleDlg::switchToTheme() generic_string prevThemeName(_themeName); _themeName.clear(); - + NppParameters *nppParamInst = NppParameters::getInstance(); - ThemeSwitcher & themeSwitcher = nppParamInst->getThemeSwitcher(); + ThemeSwitcher & themeSwitcher = nppParamInst->getThemeSwitcher(); pair & themeInfo = themeSwitcher.getElementFromIndex(iSel); - _themeName = themeInfo.second; + _themeName = themeInfo.second; if (_isThemeDirty) { @@ -638,7 +636,7 @@ void WordStyleDlg::switchToTheme() PathRemoveExtension(themeFileName); int mb_response = ::MessageBox( _hSelf, - TEXT(" Unsaved changes are about to be discarded!\n") + TEXT(" Unsaved changes are about to be discarded!\n") TEXT(" Do you want to save your changes before switching themes?"), themeFileName, MB_ICONWARNING | MB_YESNO | MB_APPLMODAL | MB_SETFOREGROUND ); @@ -654,10 +652,10 @@ void WordStyleDlg::switchToTheme() void WordStyleDlg::setStyleListFromLexer(int index) { - _currentLexerIndex = index; + _currentLexerIndex = index; - // Fill out Styles listbox - // Before filling out, we clean it + // Fill out Styles listbox + // Before filling out, we clean it ::SendDlgItemMessage(_hSelf, IDC_STYLES_LIST, LB_RESETCONTENT, 0, 0); if (index) @@ -667,39 +665,39 @@ void WordStyleDlg::setStyleListFromLexer(int index) const TCHAR *userExt = (_lsArray.getLexerStylerByName(langName))->getLexerUserExt(); ::SendDlgItemMessage(_hSelf, IDC_DEF_EXT_EDIT, WM_SETTEXT, 0, (LPARAM)(ext)); - // WM_SETTEXT cause sending WM_COMMAND message with EN_CHANGE. - // That makes status dirty, even it shouldn't in this case. - // The walk around solution is get the current status before sending WM_SETTEXT, - // then restore the status after sending this message. - bool isDirty = _isDirty; + // WM_SETTEXT cause sending WM_COMMAND message with EN_CHANGE. + // That makes status dirty, even it shouldn't in this case. + // The walk around solution is get the current status before sending WM_SETTEXT, + // then restore the status after sending this message. + bool isDirty = _isDirty; bool isThemeDirty = _isThemeDirty; ::SendDlgItemMessage(_hSelf, IDC_USER_EXT_EDIT, WM_SETTEXT, 0, (LPARAM)(userExt)); - _isDirty = isDirty; - _isThemeDirty = isThemeDirty; - ::EnableWindow(::GetDlgItem(_hSelf, IDC_SAVECLOSE_BUTTON), isDirty || isThemeDirty); + _isDirty = isDirty; + _isThemeDirty = isThemeDirty; + ::EnableWindow(::GetDlgItem(_hSelf, IDC_SAVECLOSE_BUTTON), isDirty || isThemeDirty); } ::ShowWindow(::GetDlgItem(_hSelf, IDC_DEF_EXT_EDIT), index?SW_SHOW:SW_HIDE); - ::ShowWindow(::GetDlgItem(_hSelf, IDC_DEF_EXT_STATIC), index?SW_SHOW:SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DEF_EXT_STATIC), index?SW_SHOW:SW_HIDE); ::ShowWindow(::GetDlgItem(_hSelf, IDC_USER_EXT_EDIT), index?SW_SHOW:SW_HIDE); - ::ShowWindow(::GetDlgItem(_hSelf, IDC_USER_EXT_STATIC), index?SW_SHOW:SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_USER_EXT_STATIC), index?SW_SHOW:SW_HIDE); ::ShowWindow(::GetDlgItem(_hSelf, IDC_PLUSSYMBOL2_STATIC), index?SW_SHOW:SW_HIDE); StyleArray & lexerStyler = index?_lsArray.getLexerFromIndex(index-1):_globalStyles; - for (int i = 0, nb = lexerStyler.getNbStyler(); i < nb ; ++i) - { - Style & style = lexerStyler.getStyler(i); + for (int i = 0, nb = lexerStyler.getNbStyler(); i < nb ; ++i) + { + Style & style = lexerStyler.getStyler(i); ::SendDlgItemMessage(_hSelf, IDC_STYLES_LIST, LB_ADDSTRING, 0, (LPARAM)style._styleDesc); - } + } ::SendDlgItemMessage(_hSelf, IDC_STYLES_LIST, LB_SETCURSEL, 0, 0); - setVisualFromStyleList(); + setVisualFromStyleList(); } -void WordStyleDlg::setVisualFromStyleList() +void WordStyleDlg::setVisualFromStyleList() { showGlobalOverrideCtrls(false); - Style & style = getCurrentStyler(); + Style & style = getCurrentStyler(); // Global override style if (style._styleDesc && lstrcmp(style._styleDesc, TEXT("Global override")) == 0) @@ -707,14 +705,14 @@ void WordStyleDlg::setVisualFromStyleList() showGlobalOverrideCtrls(true); } - //--Warning text - //bool showWarning = ((_currentLexerIndex == 0) && (style._styleID == STYLE_DEFAULT));//?SW_SHOW:SW_HIDE; + //--Warning text + //bool showWarning = ((_currentLexerIndex == 0) && (style._styleID == STYLE_DEFAULT));//?SW_SHOW:SW_HIDE; COLORREF c = RGB(0x00, 0x00, 0xFF); TCHAR str[256]; str[0] = '\0'; - + int i = ::SendDlgItemMessage(_hSelf, IDC_LANGUAGES_LIST, LB_GETCURSEL, 0, 0); if (i == LB_ERR) return; @@ -802,7 +800,7 @@ void WordStyleDlg::setVisualFromStyleList() ::SendMessage(_hCheckUnderline, BM_SETCHECK, BST_UNCHECKED, 0); } - enableFontStyle(isEnable); + enableFontStyle(isEnable); //-- Default Keywords @@ -827,6 +825,7 @@ void WordStyleDlg::setVisualFromStyleList() const TCHAR *ckwStr = (style._keywords)?style._keywords->c_str():TEXT(""); ::SendDlgItemMessage(_hSelf, IDC_USER_KEYWORDS_EDIT, WM_SETTEXT, 0, (LPARAM)(ckwStr)); } + int showOption = shouldBeDisplayed?SW_SHOW:SW_HIDE; ::ShowWindow(::GetDlgItem(_hSelf, IDC_DEF_KEYWORDS_EDIT), showOption); ::ShowWindow(::GetDlgItem(_hSelf, IDC_USER_KEYWORDS_EDIT),showOption); @@ -834,9 +833,10 @@ void WordStyleDlg::setVisualFromStyleList() ::ShowWindow(::GetDlgItem(_hSelf, IDC_USER_KEYWORDS_STATIC),showOption); ::ShowWindow(::GetDlgItem(_hSelf, IDC_PLUSSYMBOL_STATIC),showOption); - redraw(); + redraw(); } + void WordStyleDlg::create(int dialogID, bool isRTL) { StaticDialog::create(dialogID, isRTL); @@ -845,7 +845,7 @@ void WordStyleDlg::create(int dialogID, bool isRTL) { ::ShowWindow(::GetDlgItem(_hSelf, IDC_SC_TRANSPARENT_CHECK), SW_SHOW); ::ShowWindow(::GetDlgItem(_hSelf, IDC_SC_PERCENTAGE_SLIDER), SW_SHOW); - + ::SendDlgItemMessage(_hSelf, IDC_SC_PERCENTAGE_SLIDER, TBM_SETRANGE, FALSE, MAKELONG(20, 200)); ::SendDlgItemMessage(_hSelf, IDC_SC_PERCENTAGE_SLIDER, TBM_SETPOS, TRUE, 150); if (!(BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_SC_PERCENTAGE_SLIDER, BM_GETCHECK, 0, 0))) @@ -853,6 +853,7 @@ void WordStyleDlg::create(int dialogID, bool isRTL) } } + void WordStyleDlg::apply() { LexerStylerArray & lsa = (NppParameters::getInstance())->getLStylerArray(); diff --git a/PowerEditor/src/WinControls/SplitterContainer/Splitter.cpp b/PowerEditor/src/WinControls/SplitterContainer/Splitter.cpp index e7bb06a5b..3282957d9 100644 --- a/PowerEditor/src/WinControls/SplitterContainer/Splitter.cpp +++ b/PowerEditor/src/WinControls/SplitterContainer/Splitter.cpp @@ -24,8 +24,6 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - #include #include #include "Splitter.h" @@ -38,28 +36,24 @@ bool Splitter::_isVerticalFixedRegistered = false; #define SPLITTER_SIZE 8 -Splitter::Splitter() : Window() + + +Splitter::Splitter() { - //hInstance = GetModuleHandle(NULL); _rect.left = 0; // x axis _rect.top = 0; // y axis _rect.right = 0; // Width of the spliter. _rect.bottom = 0; // Height of the spliter - _isFixed = false; } -void Splitter::init( HINSTANCE hInst, HWND hPere, int splitterSize, - double iSplitRatio, DWORD dwFlags) +void Splitter::init( HINSTANCE hInst, HWND hPere, int splitterSize, double iSplitRatio, DWORD dwFlags) { if (hPere == NULL) - { throw std::runtime_error("Splitter::init : Parameter hPere is null"); - } + if (iSplitRatio < 0) - { throw std::runtime_error("Splitter::init : Parameter iSplitRatio shoulds be 0 < ratio < 100"); - } Window::init(hInst, hPere); _spiltterSize = splitterSize; @@ -183,61 +177,61 @@ void Splitter::init( HINSTANCE hInst, HWND hPere, int splitterSize, _isVerticalFixedRegistered = true; } - _hSelf = CreateWindowEx( - dwExStyle, - wcex.lpszClassName, - TEXT(""), - dwStyle, - _rect.left, - _rect.top, - _rect.right, - _rect.bottom, - _hParent, - NULL, - _hInst, - (LPVOID)this); + _hSelf = CreateWindowEx(dwExStyle, wcex.lpszClassName, + TEXT(""), + dwStyle, + _rect.left, _rect.top, _rect.right, _rect.bottom, + _hParent, NULL, _hInst, this); if (!_hSelf) - { throw std::runtime_error("Splitter::init : CreateWindowEx() function return null"); - } RECT rc; getClientRect(rc); //::GetClientRect(_hParent,&rc); - _clickZone2TL.left = rc.left; - _clickZone2TL.top = rc.top; + _clickZone2TL.left = rc.left; + _clickZone2TL.top = rc.top; - int clickZoneWidth = getClickZone(WIDTH); - int clickZoneHeight = getClickZone(HEIGHT); - _clickZone2TL.right = clickZoneWidth; + int clickZoneWidth = getClickZone(WH::width); + int clickZoneHeight = getClickZone(WH::height); + _clickZone2TL.right = clickZoneWidth; _clickZone2TL.bottom = clickZoneHeight; - _clickZone2BR.left = rc.right - clickZoneWidth; - _clickZone2BR.top = rc.bottom - clickZoneHeight; - _clickZone2BR.right = clickZoneWidth; + _clickZone2BR.left = rc.right - clickZoneWidth; + _clickZone2BR.top = rc.bottom - clickZoneHeight; + _clickZone2BR.right = clickZoneWidth; _clickZone2BR.bottom = clickZoneHeight; display(); ::SendMessage(_hParent, WM_RESIZE_CONTAINER, _rect.left, _rect.top); - } -// determinated by (_dwFlags & SV_VERTICAL) && _splitterSize + + +void Splitter::destroy() +{ + ::DestroyWindow(_hSelf); +} + + int Splitter::getClickZone(WH which) { + // determinated by (_dwFlags & SV_VERTICAL) && _splitterSize if (_spiltterSize <= 8) { - return isVertical()?(which==WIDTH?_spiltterSize:HIEGHT_MINIMAL) - :(which==WIDTH?HIEGHT_MINIMAL:_spiltterSize); + return isVertical() + ? (which == WH::width ? _spiltterSize : HIEGHT_MINIMAL) + : (which == WH::width ? HIEGHT_MINIMAL : _spiltterSize); } else // (_spiltterSize > 8) { - return isVertical()?(which==WIDTH? 8:15) - :(which==WIDTH?15:8); + return isVertical() + ? ((which == WH::width) ? 8 : 15) + : ((which == WH::width) ? 15 : 8); } } + LRESULT CALLBACK Splitter::staticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch(uMsg) @@ -260,24 +254,12 @@ LRESULT CALLBACK Splitter::staticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LP } } + LRESULT CALLBACK Splitter::spliterWndProc(UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { -/* - case WM_LBUTTONDBLCLK: - { -::MessageBox(NULL, TEXT(""), TEXT(""), MB_OK); - } - return 0; - - case WM_RBUTTONDBLCLK: - { - - } - return 0; - */ - case WM_LBUTTONDOWN: + case WM_LBUTTONDOWN: { POINT p; p.x = LOWORD(lParam); @@ -300,14 +282,17 @@ LRESULT CALLBACK Splitter::spliterWndProc(UINT uMsg, WPARAM wParam, LPARAM lPara ::SetCapture(_hSelf); _isDraged = true; } + + return 0; } - return 0; - case WM_RBUTTONDOWN : - ::SendMessage(_hParent, WM_DOPOPUPMENU, wParam, lParam); - return TRUE; + case WM_RBUTTONDOWN: + { + ::SendMessage(_hParent, WM_DOPOPUPMENU, wParam, lParam); + return TRUE; + } - case WM_MOUSEMOVE: + case WM_MOUSEMOVE: { POINT p; p.x = LOWORD(lParam); @@ -378,7 +363,7 @@ LRESULT CALLBACK Splitter::spliterWndProc(UINT uMsg, WPARAM wParam, LPARAM lPara return 0; } - case WM_LBUTTONUP: + case WM_LBUTTONUP: { if (!_isFixed) { @@ -386,7 +371,8 @@ LRESULT CALLBACK Splitter::spliterWndProc(UINT uMsg, WPARAM wParam, LPARAM lPara } return 0; } - case WM_CAPTURECHANGED: + + case WM_CAPTURECHANGED: { if (_isDraged) { @@ -397,17 +383,23 @@ LRESULT CALLBACK Splitter::spliterWndProc(UINT uMsg, WPARAM wParam, LPARAM lPara return 0; } - case WM_PAINT : - drawSplitter(); - return 0; + case WM_PAINT: + { + drawSplitter(); + return 0; + } - case WM_CLOSE: - destroy(); - return 0; + case WM_CLOSE: + { + destroy(); + return 0; + } } + return ::DefWindowProc(_hSelf, uMsg, wParam, lParam); } + void Splitter::resizeSpliter(RECT *pRect) { RECT rect; @@ -437,10 +429,10 @@ void Splitter::resizeSpliter(RECT *pRect) //if resizeing should be done proportionately. if (_dwFlags & SV_RESIZEWTHPERCNT) - { + { _rect.left = (LONG)((rect.right * _splitPercent)/100); - } - else // soit la fenetre gauche soit la fenetre droit qui est fixee + } + else // soit la fenetre gauche soit la fenetre droit qui est fixee _rect.left = getSplitterFixPosX(); } @@ -449,8 +441,8 @@ void Splitter::resizeSpliter(RECT *pRect) RECT rc; getClientRect(rc); - _clickZone2BR.right = getClickZone(WIDTH); - _clickZone2BR.bottom = getClickZone(HEIGHT); + _clickZone2BR.right = getClickZone(WH::width); + _clickZone2BR.bottom = getClickZone(WH::height); _clickZone2BR.left = rc.right - _clickZone2BR.right; _clickZone2BR.top = rc.bottom - _clickZone2BR.bottom; @@ -460,14 +452,16 @@ void Splitter::resizeSpliter(RECT *pRect) redraw(); } + void Splitter::gotoTopLeft() { if ((_dwFlags & SV_ENABLELDBLCLK) && (!_isFixed) && (_splitPercent > 1)) { if (_dwFlags & SV_HORIZONTAL) - _rect.top = 1; + _rect.top = 1; else - _rect.left = 1; + _rect.left = 1; + _splitPercent = 1; ::SendMessage(_hParent, WM_RESIZE_CONTAINER, _rect.left, _rect.top); @@ -476,6 +470,7 @@ void Splitter::gotoTopLeft() } } + void Splitter::gotoRightBouuom() { if ((_dwFlags & SV_ENABLERDBLCLK) && (!_isFixed) && (_splitPercent < 99)) @@ -496,6 +491,7 @@ void Splitter::gotoRightBouuom() } } + void Splitter::drawSplitter() { PAINTSTRUCT ps; @@ -506,25 +502,25 @@ void Splitter::drawSplitter() if ((_spiltterSize >= 4) && (_dwFlags & SV_RESIZEWTHPERCNT)) { - adjustZoneToDraw(TLrc, TOP_LEFT); - adjustZoneToDraw(BRrc, BOTTOM_RIGHT); - paintArrow(hdc, TLrc, isVertical()?ARROW_LEFT:ARROW_UP); + adjustZoneToDraw(TLrc, ZONE_TYPE::topLeft); + adjustZoneToDraw(BRrc, ZONE_TYPE::bottomRight); + paintArrow(hdc, TLrc, isVertical() ? Arrow::left : Arrow::up); } if (isVertical()) { - rcToDraw2.top = (_dwFlags & SV_RESIZEWTHPERCNT)?_clickZone2TL.bottom:0; + rcToDraw2.top = (_dwFlags & SV_RESIZEWTHPERCNT) ? _clickZone2TL.bottom : 0; rcToDraw2.bottom = rcToDraw2.top + 2; - rcToDraw1.top = rcToDraw2.top + 1; + rcToDraw1.top = rcToDraw2.top + 1; rcToDraw1.bottom = rcToDraw1.top + 2; } else { - rcToDraw2.top = 1; + rcToDraw2.top = 1; rcToDraw2.bottom = 3; - rcToDraw1.top = 2; + rcToDraw1.top = 2; rcToDraw1.bottom = 4; } @@ -538,10 +534,10 @@ void Splitter::drawSplitter() { if (isVertical()) { - rcToDraw2.left = 1; + rcToDraw2.left = 1; rcToDraw2.right = 3; - rcToDraw1.left = 2; + rcToDraw1.left = 2; rcToDraw1.right = 4; } else @@ -563,6 +559,7 @@ void Splitter::drawSplitter() rcToDraw1.left += 4; rcToDraw1.right += 4; } + rcToDraw2.top += 4; rcToDraw2.bottom += 4; rcToDraw1.top += 4; @@ -570,16 +567,18 @@ void Splitter::drawSplitter() } if ((_spiltterSize >= 4) && (_dwFlags & SV_RESIZEWTHPERCNT)) - paintArrow(hdc, BRrc, isVertical()?ARROW_RIGHT:ARROW_DOWN); + paintArrow(hdc, BRrc, isVertical() ? Arrow::right : Arrow::down); ::EndPaint(_hSelf, &ps); } + void Splitter::rotate() { if (!_isFixed) { destroy(); + if (_dwFlags & SV_HORIZONTAL) { _dwFlags ^= SV_HORIZONTAL; @@ -590,82 +589,101 @@ void Splitter::rotate() _dwFlags ^= SV_VERTICAL; _dwFlags |= SV_HORIZONTAL; } + init(_hInst, _hParent, _spiltterSize, _splitPercent, _dwFlags); } } + void Splitter::paintArrow(HDC hdc, const RECT &rect, Arrow arrowDir) { RECT rc; rc.left = rect.left; rc.top = rect.top; rc.right = rect.right; rc.bottom = rect.bottom; - if (arrowDir == ARROW_LEFT) - { - int x = rc.right; - int y = rc.top; - //::MoveToEx(hdc, x, y, NULL); - for (; (x > rc.left) && (y != rc.bottom) ; x--) + switch (arrowDir) + { + case Arrow::left: { - ::MoveToEx(hdc, x, y++, NULL); - ::LineTo(hdc, x, rc.bottom--); + int x = rc.right; + int y = rc.top; + + //::MoveToEx(hdc, x, y, NULL); + for (; (x > rc.left) && (y != rc.bottom) ; --x) + { + ::MoveToEx(hdc, x, y++, NULL); + ::LineTo(hdc, x, rc.bottom--); + } + break; } - } - else if (arrowDir == ARROW_RIGHT) - { - int x = rc.left; - int y = rc.top; - //::MoveToEx(hdc, x, y, NULL); - for (; (x < rc.right) && (y != rc.bottom) ; ++x) + case Arrow::right: { - ::MoveToEx(hdc, x, y++, NULL); - ::LineTo(hdc, x, rc.bottom--); + int x = rc.left; + int y = rc.top; + + //::MoveToEx(hdc, x, y, NULL); + for (; (x < rc.right) && (y != rc.bottom) ; ++x) + { + ::MoveToEx(hdc, x, y++, NULL); + ::LineTo(hdc, x, rc.bottom--); + } + break; } - } - else if (arrowDir == ARROW_UP) - { - int x = rc.left; - int y = rc.bottom; - //::MoveToEx(hdc, x, y, NULL); - for (; (y > rc.top) && (x != rc.right) ; y--) + case Arrow::up: { - ::MoveToEx(hdc, x++, y, NULL); - ::LineTo(hdc, rc.right--, y); + int x = rc.left; + int y = rc.bottom; + + //::MoveToEx(hdc, x, y, NULL); + for (; (y > rc.top) && (x != rc.right) ; --y) + { + ::MoveToEx(hdc, x++, y, NULL); + ::LineTo(hdc, rc.right--, y); + } + break; } - } - else if (arrowDir == ARROW_DOWN) - { - int x = rc.left; - int y = rc.top; - //::MoveToEx(hdc, x, y, NULL); - for (; (y < rc.bottom) && (x != rc.right) ; ++y) + case Arrow::down: { - ::MoveToEx(hdc, x++, y, NULL); - ::LineTo(hdc, rc.right--, y); + int x = rc.left; + int y = rc.top; + + //::MoveToEx(hdc, x, y, NULL); + for (; (y < rc.bottom) && (x != rc.right) ; ++y) + { + ::MoveToEx(hdc, x++, y, NULL); + ::LineTo(hdc, rc.right--, y); + } + break; } } } -void Splitter::adjustZoneToDraw(RECT & rc2def, ZONE_TYPE whichZone) + + +void Splitter::adjustZoneToDraw(RECT& rc2def, ZONE_TYPE whichZone) { - if (_spiltterSize < 4) return; + if (_spiltterSize < 4) + return; + int x0, y0, x1, y1, w, h; + if ((4 <= _spiltterSize) && (_spiltterSize <= 8)) { - w = (isVertical()?4:7); - h = (isVertical()?7:4); + w = (isVertical() ? 4 : 7); + h = (isVertical() ? 7 : 4); } else // (_spiltterSize > 8) { - w = (isVertical()?6:11); - h = (isVertical()?11:6); + w = (isVertical() ? 6 : 11); + h = (isVertical() ? 11 : 6); } if (isVertical()) - {//w=4 h=7 - if (whichZone == TOP_LEFT) + { + // w=4 h=7 + if (whichZone == ZONE_TYPE::topLeft) { x0 = 0; y0 = (_clickZone2TL.bottom - h) / 2; @@ -675,12 +693,14 @@ void Splitter::adjustZoneToDraw(RECT & rc2def, ZONE_TYPE whichZone) x0 = _clickZone2BR.left + _clickZone2BR.right - w; y0 = (_clickZone2BR.bottom - h) / 2 + _clickZone2BR.top; } + x1 = x0 + w; y1 = y0 + h; } else // Horizontal - {//w=7 h=4 - if (whichZone == TOP_LEFT) + { + //w=7 h=4 + if (whichZone == ZONE_TYPE::topLeft) { x0 = (_clickZone2TL.right - w) / 2; y0 = 0; @@ -690,11 +710,14 @@ void Splitter::adjustZoneToDraw(RECT & rc2def, ZONE_TYPE whichZone) x0 = ((_clickZone2BR.right - w) / 2) + _clickZone2BR.left; y0 = _clickZone2BR.top + _clickZone2BR.bottom - h; } + x1 = x0 + w; y1 = y0 + h; } + rc2def.left = x0; rc2def.top = y0; rc2def.right = x1; rc2def.bottom = y1; } + diff --git a/PowerEditor/src/WinControls/SplitterContainer/Splitter.h b/PowerEditor/src/WinControls/SplitterContainer/Splitter.h index 7f4cbe14e..b63f91fcb 100644 --- a/PowerEditor/src/WinControls/SplitterContainer/Splitter.h +++ b/PowerEditor/src/WinControls/SplitterContainer/Splitter.h @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -24,16 +24,11 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - -#ifndef SPLITTER_H -#define SPLITTER_H - -#ifndef RESOURCE_H +#pragma once #include "resource.h" -#endif //RESOURCE_H - #include "Window.h" +#include "Common.h" + #define SV_HORIZONTAL 0x00000001 #define SV_VERTICAL 0x00000002 @@ -50,81 +45,90 @@ const int HIEGHT_MINIMAL = 15; -enum Arrow {ARROW_LEFT, ARROW_UP, ARROW_RIGHT, ARROW_DOWN}; -typedef bool WH; -const bool WIDTH = true; -const bool HEIGHT = false; +enum class Arrow { left, up, right, down }; -typedef bool ZONE_TYPE; -const bool TOP_LEFT = true; -const bool BOTTOM_RIGHT = false; +enum class WH { height, width }; -enum SplitterMode { +enum class ZONE_TYPE { bottomRight, topLeft }; + +enum class SplitterMode: std::uint8_t +{ DYNAMIC, LEFT_FIX, RIGHT_FIX }; + + + + class Splitter : public Window { -public: +public: Splitter(); - ~Splitter(){}; - void destroy() { - ::DestroyWindow(_hSelf); - }; + virtual ~Splitter() = default; + + virtual void destroy() override; + void resizeSpliter(RECT *pRect = NULL); - void init(HINSTANCE hInst, HWND hPere, int splitterSize, - double iSplitRatio, DWORD dwFlags); + void init(HINSTANCE hInst, HWND hPere, int splitterSize, double iSplitRatio, DWORD dwFlags); void rotate(); - int getPhisicalSize() const { + + int getPhisicalSize() const + { return _spiltterSize; - }; + } + private: RECT _rect; - double _splitPercent; - int _spiltterSize; - bool _isDraged; - DWORD _dwFlags; - bool _isFixed; + double _splitPercent = 0.; + int _spiltterSize = 0; + bool _isDraged = false; + DWORD _dwFlags = 0; + bool _isFixed = false; static bool _isHorizontalRegistered; static bool _isVerticalRegistered; - static bool _isHorizontalFixedRegistered; - static bool _isVerticalFixedRegistered; + static bool _isHorizontalFixedRegistered; + static bool _isVerticalFixedRegistered; RECT _clickZone2TL, _clickZone2BR; static LRESULT CALLBACK staticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT CALLBACK spliterWndProc(UINT uMsg, WPARAM wParam, LPARAM lParam); - int getClickZone(WH which); - void adjustZoneToDraw(RECT & rc2def, ZONE_TYPE whichZone); + int getClickZone(WH which); + void adjustZoneToDraw(RECT & rc2def, ZONE_TYPE whichZone); void drawSplitter(); bool isVertical() const {return (_dwFlags & SV_VERTICAL) != 0;}; void paintArrow(HDC hdc, const RECT &rect, Arrow arrowDir); void gotoTopLeft(); void gotoRightBouuom(); - bool isInLeftTopZone(const POINT &p) const { - return (((p.x >= _clickZone2TL.left) && (p.x <= _clickZone2TL.left + _clickZone2TL.right)) && - (p.y >= _clickZone2TL.top) && (p.y <= _clickZone2TL.top + _clickZone2TL.bottom)); - }; + bool isInLeftTopZone(const POINT& p) const + { + return ((p.x >= _clickZone2TL.left) + and (p.x <= _clickZone2TL.left + _clickZone2TL.right) + and (p.y >= _clickZone2TL.top) + and (p.y <= _clickZone2TL.top + _clickZone2TL.bottom)); + } - bool isInRightBottomZone(const POINT &p) const { - return (((p.x >= _clickZone2BR.left) && - (p.x <= _clickZone2BR.left + _clickZone2BR.right)) && - (p.y >= _clickZone2BR.top) && - (p.y <= _clickZone2BR.top + _clickZone2BR.bottom)); - }; - - int getSplitterFixPosX() { + bool isInRightBottomZone(const POINT& p) const + { + return ((p.x >= _clickZone2BR.left) + and (p.x <= _clickZone2BR.left + _clickZone2BR.right) + and (p.y >= _clickZone2BR.top) + and (p.y <= _clickZone2BR.top + _clickZone2BR.bottom)); + } + + int getSplitterFixPosX() const + { long result = long(::SendMessage(_hParent, WM_GETSPLITTER_X, 0, 0)); - return (LOWORD(result) - ((HIWORD(result) == RIGHT_FIX) ? _spiltterSize : 0)); - }; + return (LOWORD(result) - ((HIWORD(result) == static_cast(SplitterMode::RIGHT_FIX)) ? _spiltterSize : 0)); + } - int getSplitterFixPosY() { + int getSplitterFixPosY() const + { long result = long(::SendMessage(_hParent, WM_GETSPLITTER_Y, 0, 0)); - return (LOWORD(result) - ((HIWORD(result) == RIGHT_FIX) ? _spiltterSize : 0)); - }; + return (LOWORD(result) - ((HIWORD(result) == static_cast(SplitterMode::RIGHT_FIX)) ? _spiltterSize : 0)); + } }; -#endif //SPLITTER_H diff --git a/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.cpp b/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.cpp index 1875f1621..f09beb713 100644 --- a/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.cpp +++ b/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.cpp @@ -24,16 +24,18 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - #include #include #include "SplitterContainer.h" +#include + + bool SplitterContainer::_isRegistered = false; -void SplitterContainer::create(Window *pWin0, Window *pWin1, int splitterSize, - SplitterMode mode, int ratio, bool isVertical) + + +void SplitterContainer::create(Window *pWin0, Window *pWin1, int splitterSize, SplitterMode mode, int ratio, bool isVertical) { //Window::init(hInst, parent); _pWin0 = pWin0; @@ -42,9 +44,10 @@ void SplitterContainer::create(Window *pWin0, Window *pWin1, int splitterSize, _splitterMode = mode; _ratio = ratio; _dwSplitterStyle |= isVertical?SV_VERTICAL:SV_HORIZONTAL; - if (_splitterMode != DYNAMIC) + + if (_splitterMode != SplitterMode::DYNAMIC) { - _dwSplitterStyle |= SV_FIXED; + _dwSplitterStyle |= SV_FIXED; _dwSplitterStyle &= ~SV_RESIZEWTHPERCNT; } if (!_isRegistered) @@ -66,30 +69,63 @@ void SplitterContainer::create(Window *pWin0, Window *pWin1, int splitterSize, splitterContainerClass.lpszClassName = SPC_CLASS_NAME; if (!::RegisterClass(&splitterContainerClass)) - { throw std::runtime_error(" SplitterContainer::create : RegisterClass() function failed"); - } + _isRegistered = true; } _hSelf = ::CreateWindowEx( - 0, - SPC_CLASS_NAME, - TEXT("a koi sert?"), - WS_CHILD | WS_CLIPCHILDREN, - CW_USEDEFAULT, CW_USEDEFAULT, - CW_USEDEFAULT, CW_USEDEFAULT, - _hParent, - NULL, - _hInst, - (LPVOID)this); + 0, SPC_CLASS_NAME, TEXT("a koi sert?"), + WS_CHILD | WS_CLIPCHILDREN, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + _hParent, NULL, _hInst, this); if (!_hSelf) - { throw std::runtime_error(" SplitterContainer::create : CreateWindowEx() function return null"); - } } + +void SplitterContainer::destroy() +{ + if (_hPopupMenu) + ::DestroyMenu(_hPopupMenu); + + _splitter.destroy(); + ::DestroyWindow(_hSelf); +} + + +void SplitterContainer::reSizeTo(RECT & rc) +{ + _x = rc.left; + _y = rc.top; + ::MoveWindow(_hSelf, _x, _y, rc.right, rc.bottom, FALSE); + _splitter.resizeSpliter(); +} + + +void SplitterContainer::display(bool toShow) const +{ + Window::display(toShow); + + assert(_pWin0 != nullptr); + assert(_pWin1 != nullptr); + _pWin0->display(toShow); + _pWin1->display(toShow); + + _splitter.display(toShow); +} + + +void SplitterContainer::redraw() const +{ + assert(_pWin0 != nullptr); + assert(_pWin1 != nullptr); + _pWin0->redraw(true); + _pWin1->redraw(true); +} + + void SplitterContainer::rotateTo(DIRECTION direction) { bool doSwitchWindow = false; @@ -97,13 +133,13 @@ void SplitterContainer::rotateTo(DIRECTION direction) { _dwSplitterStyle ^= SV_VERTICAL; _dwSplitterStyle |= SV_HORIZONTAL; - doSwitchWindow = (direction == LEFT); + doSwitchWindow = (direction == DIRECTION::LEFT); } else { _dwSplitterStyle ^= SV_HORIZONTAL; _dwSplitterStyle |= SV_VERTICAL; - doSwitchWindow = (direction == RIGHT); + doSwitchWindow = (direction == DIRECTION::RIGHT); } if (doSwitchWindow) { @@ -120,42 +156,54 @@ LRESULT CALLBACK SplitterContainer::staticWinProc(HWND hwnd, UINT message, WPARA SplitterContainer *pSplitterContainer = NULL; switch (message) { - case WM_NCCREATE : + case WM_NCCREATE: + { pSplitterContainer = (SplitterContainer *)(((LPCREATESTRUCT)lParam)->lpCreateParams); pSplitterContainer->_hSelf = hwnd; ::SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pSplitterContainer); return TRUE; + } - default : + default: + { pSplitterContainer = (SplitterContainer *)::GetWindowLongPtr(hwnd, GWLP_USERDATA); if (!pSplitterContainer) return ::DefWindowProc(hwnd, message, wParam, lParam); return pSplitterContainer->runProc(message, wParam, lParam); + } } } + LRESULT SplitterContainer::runProc(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { - case WM_CREATE : + case WM_CREATE: + { _splitter.init(_hInst, _hSelf, _splitterSize, _ratio, _dwSplitterStyle); return TRUE; + } - case WM_COMMAND : + case WM_COMMAND: { switch (LOWORD(wParam)) { case ROTATION_A_GAUCHE: - rotateTo(LEFT); - return TRUE; + { + rotateTo(DIRECTION::LEFT); + break; + } case ROTATION_A_DROITE: - rotateTo(RIGHT); - return TRUE; + { + rotateTo(DIRECTION::RIGHT); + break; + } } return TRUE; } - case WM_RESIZE_CONTAINER : + + case WM_RESIZE_CONTAINER: { RECT rc0, rc1; getClientRect(rc0); @@ -192,9 +240,9 @@ LRESULT SplitterContainer::runProc(UINT message, WPARAM wParam, LPARAM lParam) return TRUE; } - case WM_DOPOPUPMENU : + case WM_DOPOPUPMENU: { - if ((_splitterMode != LEFT_FIX) && (_splitterMode != RIGHT_FIX) ) + if ((_splitterMode != SplitterMode::LEFT_FIX) && (_splitterMode != SplitterMode::RIGHT_FIX) ) { POINT p; ::GetCursorPos(&p); @@ -213,36 +261,48 @@ LRESULT SplitterContainer::runProc(UINT message, WPARAM wParam, LPARAM lParam) return TRUE; } - case WM_GETSPLITTER_X : - { - if (_splitterMode == LEFT_FIX) - return MAKELONG(_pWin0->getWidth(), LEFT_FIX); - else if (_splitterMode == RIGHT_FIX) - { - int x = getWidth()-_pWin1->getWidth(); - if (x < 0) - x = 0; - return MAKELONG(x, RIGHT_FIX); - } - else - return MAKELONG(0, DYNAMIC); + case WM_GETSPLITTER_X: + { + switch (_splitterMode) + { + case SplitterMode::LEFT_FIX: + { + return MAKELONG(_pWin0->getWidth(), static_cast(SplitterMode::LEFT_FIX)); + } - } + case SplitterMode::RIGHT_FIX: + { + int x = getWidth()-_pWin1->getWidth(); + if (x < 0) + x = 0; + return MAKELONG(x, static_cast(SplitterMode::RIGHT_FIX)); + } + default: + break; + } + return MAKELONG(0, static_cast(SplitterMode::DYNAMIC)); + } - case WM_GETSPLITTER_Y : - { - if (_splitterMode == LEFT_FIX) - return MAKELONG(_pWin0->getHeight(), LEFT_FIX); - else if (_splitterMode == RIGHT_FIX) - { - int y = getHeight()-_pWin1->getHeight(); - if (y < 0) - y = 0; - return MAKELONG(y, RIGHT_FIX); - } - else - return MAKELONG(0, DYNAMIC); - } + case WM_GETSPLITTER_Y: + { + switch (_splitterMode) + { + case SplitterMode::LEFT_FIX: + { + return MAKELONG(_pWin0->getHeight(), static_cast(SplitterMode::LEFT_FIX)); + } + case SplitterMode::RIGHT_FIX: + { + int y = getHeight()-_pWin1->getHeight(); + if (y < 0) + y = 0; + return MAKELONG(y, static_cast(SplitterMode::RIGHT_FIX)); + } + default: + break; + } + return MAKELONG(0, static_cast(SplitterMode::DYNAMIC)); + } case WM_LBUTTONDBLCLK: { @@ -250,21 +310,18 @@ LRESULT SplitterContainer::runProc(UINT message, WPARAM wParam, LPARAM lParam) ::GetCursorPos(&pt); ::ScreenToClient(_splitter.getHSelf(), &pt); - Window* targetWindow; - - if(this->isVertical()) - targetWindow = pt.x < 0?_pWin0:_pWin1; - else - targetWindow = pt.y < 0?_pWin0:_pWin1; - HWND parent = ::GetParent(getHSelf()); + Window* targetWindow = (this->isVertical()) + ? (pt.x < 0 ? _pWin0 : _pWin1) + : (pt.y < 0 ? _pWin0 : _pWin1); + ::SendMessage(parent, NPPM_INTERNAL_SWITCHVIEWFROMHWND, 0, (LPARAM)targetWindow->getHSelf()); ::SendMessage(parent, WM_COMMAND, IDM_FILE_NEW, 0); return TRUE; } - default : + default: return ::DefWindowProc(_hSelf, message, wParam, lParam); } } diff --git a/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.h b/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.h index 9afb49f3c..9675b2bd8 100644 --- a/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.h +++ b/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.h @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -24,94 +24,74 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - -#ifndef SPLITTER_CONTAINER_H -#define SPLITTER_CONTAINER_H - -#ifndef SPLITTER_H +#pragma once #include "Splitter.h" -#endif //SPLITTER_H - -#ifndef MENUCMDID_H #include "menuCmdID.h" -#endif //MENUCMDID_H + #define SPC_CLASS_NAME TEXT("splitterContainer") #define ROTATION_A_GAUCHE 2000 #define ROTATION_A_DROITE 2001 -typedef bool DIRECTION; -const bool LEFT = true; -const bool RIGHT = false; + +enum class DIRECTION +{ + RIGHT, + LEFT +}; + class SplitterContainer : public Window { public : - SplitterContainer(): Window(), _x(0), _y(0), _hPopupMenu(NULL), - _dwSplitterStyle(SV_ENABLERDBLCLK | SV_ENABLELDBLCLK | SV_RESIZEWTHPERCNT){ - }; - ~SplitterContainer(){}; + virtual ~SplitterContainer() = default; + void create(Window *pWin0, Window *pWin1, int splitterSize = 4, - SplitterMode mode = DYNAMIC, int ratio = 50, bool _isVertical = true); + SplitterMode mode = SplitterMode::DYNAMIC, int ratio = 50, bool _isVertical = true); - void destroy() { - if (_hPopupMenu) - ::DestroyMenu(_hPopupMenu); - _splitter.destroy(); - ::DestroyWindow(_hSelf); - }; - void reSizeTo(RECT & rc) { - _x = rc.left; - _y = rc.top; - ::MoveWindow(_hSelf, _x, _y, rc.right, rc.bottom, FALSE); - _splitter.resizeSpliter(); - }; - virtual void display(bool toShow = true) const { - Window::display(toShow); - - _pWin0->display(toShow); - _pWin1->display(toShow); - _splitter.display(toShow); - }; - virtual void redraw() const { - _pWin0->redraw(true); - _pWin1->redraw(true); - }; + void destroy(); - void setWin0(Window *pWin) { - _pWin0 = pWin; + void reSizeTo(RECT & rc); - }; + virtual void display(bool toShow = true) const; - void setWin1(Window *pWin) { - _pWin1 = pWin; - }; + virtual void redraw() const; - bool isVertical() const { + void setWin0(Window* pWin) + { + _pWin0 = pWin; + } + + void setWin1(Window* pWin) + { + _pWin1 = pWin; + } + + bool isVertical() const + { return ((_dwSplitterStyle & SV_VERTICAL) != 0); - }; + } + + private : - Window *_pWin0; // left or top window - Window *_pWin1; // right or bottom window + Window* _pWin0 = nullptr; // left or top window + Window* _pWin1 = nullptr; // right or bottom window Splitter _splitter; - int _splitterSize; - int _ratio; - int _x, _y; - HMENU _hPopupMenu; - DWORD _dwSplitterStyle; + int _splitterSize = 0; + int _ratio = 0; + int _x = 0; + int _y = 0; + HMENU _hPopupMenu = NULL; + DWORD _dwSplitterStyle = (SV_ENABLERDBLCLK | SV_ENABLELDBLCLK | SV_RESIZEWTHPERCNT); - SplitterMode _splitterMode; + SplitterMode _splitterMode = SplitterMode::DYNAMIC; static bool _isRegistered; static LRESULT CALLBACK staticWinProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); LRESULT runProc(UINT Message, WPARAM wParam, LPARAM lParam); void rotateTo(DIRECTION direction); - }; - -#endif //SPLITTER_CONTAINER_H diff --git a/PowerEditor/src/WinControls/StaticDialog/StaticDialog.cpp b/PowerEditor/src/WinControls/StaticDialog/StaticDialog.cpp index fc359adc3..281d7c921 100644 --- a/PowerEditor/src/WinControls/StaticDialog/StaticDialog.cpp +++ b/PowerEditor/src/WinControls/StaticDialog/StaticDialog.cpp @@ -29,14 +29,51 @@ #include #include "StaticDialog.h" + + +StaticDialog::~StaticDialog() +{ + if (isCreated()) + { + // Prevent run_dlgProc from doing anything, since its virtual + ::SetWindowLongPtr(_hSelf, GWLP_USERDATA, (LONG_PTR) NULL); + destroy(); + } +} + + +void StaticDialog::destroy() +{ + ::SendMessage(_hParent, NPPM_MODELESSDIALOG, MODELESSDIALOGREMOVE, (WPARAM)_hSelf); + ::DestroyWindow(_hSelf); +} + + +POINT StaticDialog::getTopPoint(HWND hwnd, bool isLeft) const +{ + RECT rc; + ::GetWindowRect(hwnd, &rc); + + POINT p; + if (isLeft) + p.x = rc.left; + else + p.x = rc.right; + + p.y = rc.top; + ::ScreenToClient(_hSelf, &p); + return p; +} + + void StaticDialog::goToCenter() { - RECT rc; - ::GetClientRect(_hParent, &rc); - POINT center; - center.x = rc.left + (rc.right - rc.left)/2; - center.y = rc.top + (rc.bottom - rc.top)/2; - ::ClientToScreen(_hParent, ¢er); + RECT rc; + ::GetClientRect(_hParent, &rc); + POINT center; + center.x = rc.left + (rc.right - rc.left)/2; + center.y = rc.top + (rc.bottom - rc.top)/2; + ::ClientToScreen(_hParent, ¢er); int x = center.x - (_rc.right - _rc.left)/2; int y = center.y - (_rc.bottom - _rc.top)/2; @@ -47,7 +84,8 @@ void StaticDialog::goToCenter() void StaticDialog::display(bool toShow) const { - if (toShow) { + if (toShow) + { // If the user has switched from a dual monitor to a single monitor since we last // displayed the dialog, then ensure that it's still visible on the single monitor. RECT workAreaRect = {0}; @@ -57,6 +95,7 @@ void StaticDialog::display(bool toShow) const int newLeft = rc.left; int newTop = rc.top; int margin = ::GetSystemMetrics(SM_CYSMCAPTION); + if (newLeft > ::GetSystemMetrics(SM_CXVIRTUALSCREEN)-margin) newLeft -= rc.right - workAreaRect.right; if (newLeft + (rc.right - rc.left) < ::GetSystemMetrics(SM_XVIRTUALSCREEN)+margin) @@ -131,22 +170,23 @@ void StaticDialog::create(int dialogID, bool isRTL, bool msgDestParent) ::SendMessage(msgDestParent?_hParent:(::GetParent(_hParent)), NPPM_MODELESSDIALOG, MODELESSDIALOGADD, (WPARAM)_hSelf); } + INT_PTR CALLBACK StaticDialog::dlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { - case WM_INITDIALOG : + case WM_INITDIALOG: { StaticDialog *pStaticDlg = (StaticDialog *)(lParam); pStaticDlg->_hSelf = hwnd; ::SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)lParam); ::GetWindowRect(hwnd, &(pStaticDlg->_rc)); - pStaticDlg->run_dlgProc(message, wParam, lParam); + pStaticDlg->run_dlgProc(message, wParam, lParam); return TRUE; } - default : + default: { StaticDialog *pStaticDlg = reinterpret_cast(::GetWindowLongPtr(hwnd, GWLP_USERDATA)); if (!pStaticDlg) @@ -158,34 +198,39 @@ INT_PTR CALLBACK StaticDialog::dlgProc(HWND hwnd, UINT message, WPARAM wParam, L void StaticDialog::alignWith(HWND handle, HWND handle2Align, PosAlign pos, POINT & point) { - RECT rc, rc2; - ::GetWindowRect(handle, &rc); + RECT rc, rc2; + ::GetWindowRect(handle, &rc); - point.x = rc.left; - point.y = rc.top; + point.x = rc.left; + point.y = rc.top; - switch (pos) - { - case ALIGNPOS_LEFT : - ::GetWindowRect(handle2Align, &rc2); - point.x -= rc2.right - rc2.left; - break; + switch (pos) + { + case PosAlign::left: + { + ::GetWindowRect(handle2Align, &rc2); + point.x -= rc2.right - rc2.left; + break; + } + case PosAlign::right: + { + ::GetWindowRect(handle, &rc2); + point.x += rc2.right - rc2.left; + break; + } + case PosAlign::top: + { + ::GetWindowRect(handle2Align, &rc2); + point.y -= rc2.bottom - rc2.top; + break; + } + case PosAlign::bottom: + { + ::GetWindowRect(handle, &rc2); + point.y += rc2.bottom - rc2.top; + break; + } + } - case ALIGNPOS_RIGHT : - ::GetWindowRect(handle, &rc2); - point.x += rc2.right - rc2.left; - break; - - case ALIGNPOS_TOP : - ::GetWindowRect(handle2Align, &rc2); - point.y -= rc2.bottom - rc2.top; - break; - - default : //ALIGNPOS_BOTTOM - ::GetWindowRect(handle, &rc2); - point.y += rc2.bottom - rc2.top; - break; - } - - ::ScreenToClient(_hSelf, &point); + ::ScreenToClient(_hSelf, &point); } diff --git a/PowerEditor/src/WinControls/StaticDialog/StaticDialog.h b/PowerEditor/src/WinControls/StaticDialog/StaticDialog.h index 2bf054aed..90982c9f9 100644 --- a/PowerEditor/src/WinControls/StaticDialog/StaticDialog.h +++ b/PowerEditor/src/WinControls/StaticDialog/StaticDialog.h @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -24,81 +24,64 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - -#ifndef STATIC_DIALOG_H -#define STATIC_DIALOG_H - +#pragma once #include "Notepad_plus_msgs.h" #include "Window.h" + typedef HRESULT (WINAPI * ETDTProc) (HWND, DWORD); -enum PosAlign{ALIGNPOS_LEFT, ALIGNPOS_RIGHT, ALIGNPOS_TOP, ALIGNPOS_BOTTOM}; +enum class PosAlign { left, right, top, bottom }; -struct DLGTEMPLATEEX { + +struct DLGTEMPLATEEX +{ WORD dlgVer; WORD signature; DWORD helpID; DWORD exStyle; - DWORD style; + DWORD style; WORD cDlgItems; short x; - short y; + short y; short cx; short cy; // The structure has more fields but are variable length -} ; +}; + + class StaticDialog : public Window { public : - StaticDialog() : Window() {}; - ~StaticDialog(){ - if (isCreated()) { - ::SetWindowLongPtr(_hSelf, GWLP_USERDATA, (LONG_PTR)NULL); //Prevent run_dlgProc from doing anything, since its virtual - destroy(); - } - }; + virtual ~StaticDialog(); + virtual void create(int dialogID, bool isRTL = false, bool msgDestParent = true); - virtual bool isCreated() const { + virtual bool isCreated() const + { return (_hSelf != NULL); - }; + } void goToCenter(); void display(bool toShow = true) const; - POINT getTopPoint(HWND hwnd, bool isLeft = true) const { - RECT rc; - ::GetWindowRect(hwnd, &rc); - POINT p; - if (isLeft) - p.x = rc.left; - else - p.x = rc.right; - p.y = rc.top; - ::ScreenToClient(_hSelf, &p); - return p; - }; + POINT getTopPoint(HWND hwnd, bool isLeft = true) const; - bool isCheckedOrNot(int checkControlID) const { + bool isCheckedOrNot(int checkControlID) const + { return (BST_CHECKED == ::SendMessage(::GetDlgItem(_hSelf, checkControlID), BM_GETCHECK, 0, 0)); - }; + } - void destroy() { - ::SendMessage(_hParent, NPPM_MODELESSDIALOG, MODELESSDIALOGREMOVE, (WPARAM)_hSelf); - ::DestroyWindow(_hSelf); - }; + virtual void destroy() override; -protected : + +protected: RECT _rc; static INT_PTR CALLBACK dlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); virtual INT_PTR CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) = 0; void alignWith(HWND handle, HWND handle2Align, PosAlign pos, POINT & point); HGLOBAL makeRTLResource(int dialogID, DLGTEMPLATE **ppMyDlgTemplate); -}; - -#endif //STATIC_DIALOG_H +}; \ No newline at end of file diff --git a/PowerEditor/src/WinControls/Window.h b/PowerEditor/src/WinControls/Window.h index 42b8dae61..17f5b0ff9 100644 --- a/PowerEditor/src/WinControls/Window.h +++ b/PowerEditor/src/WinControls/Window.h @@ -33,7 +33,13 @@ class Window { public: + //! \name Constructors & Destructor + //@{ + Window() = default; + Window(const Window&) = delete; virtual ~Window() = default; + //@} + virtual void init(HINSTANCE hInst, HWND parent) { @@ -123,6 +129,9 @@ public: } + Window& operator = (const Window&) = delete; + + protected: HINSTANCE _hInst = NULL; HWND _hParent = NULL; diff --git a/PowerEditor/src/resource.h b/PowerEditor/src/resource.h index 1f74f3f07..18371c9f5 100644 --- a/PowerEditor/src/resource.h +++ b/PowerEditor/src/resource.h @@ -7,10 +7,10 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable // installer, such as those produced by InstallShield. @@ -24,178 +24,176 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - -#ifndef RESOURCE_H -#define RESOURCE_H +#pragma once #define NOTEPAD_PLUS_VERSION TEXT("Notepad++ v6.8.1") -// should be X.Y : ie. if VERSION_DIGITALVALUE == 4, 7, 1, 0 , then X = 4, Y = 71 + +// should be X.Y : ie. if VERSION_DIGITALVALUE == 4, 7, 1, 0 , then X = 4, Y = 71 // ex : #define VERSION_VALUE TEXT("5.63\0") #define VERSION_VALUE TEXT("6.8.1\0") #define VERSION_DIGITALVALUE 6, 8, 1, 0 #ifndef IDC_STATIC -#define IDC_STATIC -1 +#define IDC_STATIC -1 #endif -#define IDI_M30ICON 100 -#define IDI_CHAMELEON 101 -//#define IDI_JESUISCHARLIE 102 +#define IDI_M30ICON 100 +#define IDI_CHAMELEON 101 +//#define IDI_JESUISCHARLIE 102 #define IDR_RT_MANIFEST 103 -#define IDI_NEW_OFF_ICON 201 -#define IDI_OPEN_OFF_ICON 202 -#define IDI_CLOSE_OFF_ICON 203 -#define IDI_CLOSEALL_OFF_ICON 204 -#define IDI_SAVE_OFF_ICON 205 -#define IDI_SAVEALL_OFF_ICON 206 -#define IDI_CUT_OFF_ICON 207 -#define IDI_COPY_OFF_ICON 208 -#define IDI_PASTE_OFF_ICON 209 -#define IDI_UNDO_OFF_ICON 210 -#define IDI_REDO_OFF_ICON 211 -#define IDI_FIND_OFF_ICON 212 -#define IDI_REPLACE_OFF_ICON 213 -#define IDI_ZOOMIN_OFF_ICON 214 -#define IDI_ZOOMOUT_OFF_ICON 215 -#define IDI_VIEW_UD_DLG_OFF_ICON 216 -#define IDI_PRINT_OFF_ICON 217 -#define IDI_VIEW_ALL_CHAR_ON_ICON 218 -#define IDI_VIEW_INDENT_ON_ICON 219 -#define IDI_VIEW_WRAP_ON_ICON 220 +#define IDI_NEW_OFF_ICON 201 +#define IDI_OPEN_OFF_ICON 202 +#define IDI_CLOSE_OFF_ICON 203 +#define IDI_CLOSEALL_OFF_ICON 204 +#define IDI_SAVE_OFF_ICON 205 +#define IDI_SAVEALL_OFF_ICON 206 +#define IDI_CUT_OFF_ICON 207 +#define IDI_COPY_OFF_ICON 208 +#define IDI_PASTE_OFF_ICON 209 +#define IDI_UNDO_OFF_ICON 210 +#define IDI_REDO_OFF_ICON 211 +#define IDI_FIND_OFF_ICON 212 +#define IDI_REPLACE_OFF_ICON 213 +#define IDI_ZOOMIN_OFF_ICON 214 +#define IDI_ZOOMOUT_OFF_ICON 215 +#define IDI_VIEW_UD_DLG_OFF_ICON 216 +#define IDI_PRINT_OFF_ICON 217 +#define IDI_VIEW_ALL_CHAR_ON_ICON 218 +#define IDI_VIEW_INDENT_ON_ICON 219 +#define IDI_VIEW_WRAP_ON_ICON 220 -#define IDI_STARTRECORD_OFF_ICON 221 -#define IDI_STARTRECORD_ON_ICON 222 -#define IDI_STARTRECORD_DISABLE_ICON 223 -#define IDI_STOPRECORD_OFF_ICON 224 -#define IDI_STOPRECORD_ON_ICON 225 -#define IDI_STOPRECORD_DISABLE_ICON 226 -#define IDI_PLAYRECORD_OFF_ICON 227 -#define IDI_PLAYRECORD_ON_ICON 228 -#define IDI_PLAYRECORD_DISABLE_ICON 229 -#define IDI_SAVERECORD_OFF_ICON 230 -#define IDI_SAVERECORD_ON_ICON 231 -#define IDI_SAVERECORD_DISABLE_ICON 232 +#define IDI_STARTRECORD_OFF_ICON 221 +#define IDI_STARTRECORD_ON_ICON 222 +#define IDI_STARTRECORD_DISABLE_ICON 223 +#define IDI_STOPRECORD_OFF_ICON 224 +#define IDI_STOPRECORD_ON_ICON 225 +#define IDI_STOPRECORD_DISABLE_ICON 226 +#define IDI_PLAYRECORD_OFF_ICON 227 +#define IDI_PLAYRECORD_ON_ICON 228 +#define IDI_PLAYRECORD_DISABLE_ICON 229 +#define IDI_SAVERECORD_OFF_ICON 230 +#define IDI_SAVERECORD_ON_ICON 231 +#define IDI_SAVERECORD_DISABLE_ICON 232 // multi run macro -#define IDI_MMPLAY_DIS_ICON 233 -#define IDI_MMPLAY_OFF_ICON 234 -#define IDI_MMPLAY_ON_ICON 235 +#define IDI_MMPLAY_DIS_ICON 233 +#define IDI_MMPLAY_OFF_ICON 234 +#define IDI_MMPLAY_ON_ICON 235 -#define IDI_NEW_ON_ICON 301 -#define IDI_OPEN_ON_ICON 302 -#define IDI_CLOSE_ON_ICON 303 -#define IDI_CLOSEALL_ON_ICON 304 -#define IDI_SAVE_ON_ICON 305 -#define IDI_SAVEALL_ON_ICON 306 -#define IDI_CUT_ON_ICON 307 -#define IDI_COPY_ON_ICON 308 -#define IDI_PASTE_ON_ICON 309 -#define IDI_UNDO_ON_ICON 310 -#define IDI_REDO_ON_ICON 311 -#define IDI_FIND_ON_ICON 312 -#define IDI_REPLACE_ON_ICON 313 -#define IDI_ZOOMIN_ON_ICON 314 -#define IDI_ZOOMOUT_ON_ICON 315 -#define IDI_VIEW_UD_DLG_ON_ICON 316 -#define IDI_PRINT_ON_ICON 317 -#define IDI_VIEW_ALL_CHAR_OFF_ICON 318 -#define IDI_VIEW_INDENT_OFF_ICON 319 -#define IDI_VIEW_WRAP_OFF_ICON 320 +#define IDI_NEW_ON_ICON 301 +#define IDI_OPEN_ON_ICON 302 +#define IDI_CLOSE_ON_ICON 303 +#define IDI_CLOSEALL_ON_ICON 304 +#define IDI_SAVE_ON_ICON 305 +#define IDI_SAVEALL_ON_ICON 306 +#define IDI_CUT_ON_ICON 307 +#define IDI_COPY_ON_ICON 308 +#define IDI_PASTE_ON_ICON 309 +#define IDI_UNDO_ON_ICON 310 +#define IDI_REDO_ON_ICON 311 +#define IDI_FIND_ON_ICON 312 +#define IDI_REPLACE_ON_ICON 313 +#define IDI_ZOOMIN_ON_ICON 314 +#define IDI_ZOOMOUT_ON_ICON 315 +#define IDI_VIEW_UD_DLG_ON_ICON 316 +#define IDI_PRINT_ON_ICON 317 +#define IDI_VIEW_ALL_CHAR_OFF_ICON 318 +#define IDI_VIEW_INDENT_OFF_ICON 319 +#define IDI_VIEW_WRAP_OFF_ICON 320 -//#define IDI_NEW_DISABLE_ICON 401 -//#define IDI_OPEN_ON_ICON 402 -#define IDI_SAVE_DISABLE_ICON 403 -#define IDI_SAVEALL_DISABLE_ICON 404 -//#define IDI_CLOSE_ON_ICON 405 -//#define IDI_CLOSEALL_ON_ICON 406 -#define IDI_CUT_DISABLE_ICON 407 -#define IDI_COPY_DISABLE_ICON 408 -#define IDI_PASTE_DISABLE_ICON 409 -#define IDI_UNDO_DISABLE_ICON 410 -#define IDI_REDO_DISABLE_ICON 411 -#define IDI_DELETE_ICON 412 +//#define IDI_NEW_DISABLE_ICON 401 +//#define IDI_OPEN_ON_ICON 402 +#define IDI_SAVE_DISABLE_ICON 403 +#define IDI_SAVEALL_DISABLE_ICON 404 +//#define IDI_CLOSE_ON_ICON 405 +//#define IDI_CLOSEALL_ON_ICON 406 +#define IDI_CUT_DISABLE_ICON 407 +#define IDI_COPY_DISABLE_ICON 408 +#define IDI_PASTE_DISABLE_ICON 409 +#define IDI_UNDO_DISABLE_ICON 410 +#define IDI_REDO_DISABLE_ICON 411 +#define IDI_DELETE_ICON 412 -#define IDI_SYNCV_OFF_ICON 413 -#define IDI_SYNCV_ON_ICON 414 -#define IDI_SYNCV_DISABLE_ICON 415 +#define IDI_SYNCV_OFF_ICON 413 +#define IDI_SYNCV_ON_ICON 414 +#define IDI_SYNCV_DISABLE_ICON 415 -#define IDI_SYNCH_OFF_ICON 416 -#define IDI_SYNCH_ON_ICON 417 -#define IDI_SYNCH_DISABLE_ICON 418 +#define IDI_SYNCH_OFF_ICON 416 +#define IDI_SYNCH_ON_ICON 417 +#define IDI_SYNCH_DISABLE_ICON 418 -#define IDI_SAVED_ICON 501 -#define IDI_UNSAVED_ICON 502 -#define IDI_READONLY_ICON 503 -#define IDI_FIND_RESULT_ICON 504 +#define IDI_SAVED_ICON 501 +#define IDI_UNSAVED_ICON 502 +#define IDI_READONLY_ICON 503 +#define IDI_FIND_RESULT_ICON 504 -#define IDI_PROJECT_WORKSPACE 601 -#define IDI_PROJECT_WORKSPACEDIRTY 602 -#define IDI_PROJECT_PROJECT 603 -#define IDI_PROJECT_FOLDEROPEN 604 -#define IDI_PROJECT_FOLDERCLOSE 605 -#define IDI_PROJECT_FILE 606 -#define IDI_PROJECT_FILEINVALID 607 +#define IDI_PROJECT_WORKSPACE 601 +#define IDI_PROJECT_WORKSPACEDIRTY 602 +#define IDI_PROJECT_PROJECT 603 +#define IDI_PROJECT_FOLDEROPEN 604 +#define IDI_PROJECT_FOLDERCLOSE 605 +#define IDI_PROJECT_FILE 606 +#define IDI_PROJECT_FILEINVALID 607 -#define IDI_FUNCLIST_ROOT 620 -#define IDI_FUNCLIST_NODE 621 -#define IDI_FUNCLIST_LEAF 622 +#define IDI_FUNCLIST_ROOT 620 +#define IDI_FUNCLIST_NODE 621 +#define IDI_FUNCLIST_LEAF 622 -#define IDI_FUNCLIST_SORTBUTTON 631 -#define IDI_FUNCLIST_RELOADBUTTON 632 +#define IDI_FUNCLIST_SORTBUTTON 631 +#define IDI_FUNCLIST_RELOADBUTTON 632 -#define IDC_MY_CUR 1402 -#define IDC_UP_ARROW 1403 -#define IDC_DRAG_TAB 1404 -#define IDC_DRAG_INTERDIT_TAB 1405 -#define IDC_DRAG_PLUS_TAB 1406 -#define IDC_DRAG_OUT_TAB 1407 +#define IDC_MY_CUR 1402 +#define IDC_UP_ARROW 1403 +#define IDC_DRAG_TAB 1404 +#define IDC_DRAG_INTERDIT_TAB 1405 +#define IDC_DRAG_PLUS_TAB 1406 +#define IDC_DRAG_OUT_TAB 1407 -#define IDC_MACRO_RECORDING 1408 +#define IDC_MACRO_RECORDING 1408 -#define IDR_SAVEALL 1500 -#define IDR_CLOSEFILE 1501 -#define IDR_CLOSEALL 1502 -#define IDR_FIND 1503 -#define IDR_REPLACE 1504 -#define IDR_ZOOMIN 1505 -#define IDR_ZOOMOUT 1506 -#define IDR_WRAP 1507 -#define IDR_INVISIBLECHAR 1508 -#define IDR_INDENTGUIDE 1509 -#define IDR_SHOWPANNEL 1510 -#define IDR_STARTRECORD 1511 -#define IDR_STOPRECORD 1512 -#define IDR_PLAYRECORD 1513 -#define IDR_SAVERECORD 1514 -#define IDR_SYNCV 1515 -#define IDR_SYNCH 1516 -#define IDR_FILENEW 1517 -#define IDR_FILEOPEN 1518 -#define IDR_FILESAVE 1519 -#define IDR_PRINT 1520 -#define IDR_CUT 1521 -#define IDR_COPY 1522 -#define IDR_PASTE 1523 -#define IDR_UNDO 1524 -#define IDR_REDO 1525 -#define IDR_M_PLAYRECORD 1526 -#define IDR_DOCMAP 1527 -#define IDR_FUNC_LIST 1528 -#define IDR_CLOSETAB 1530 -#define IDR_CLOSETAB_INACT 1531 -#define IDR_CLOSETAB_HOVER 1532 -#define IDR_CLOSETAB_PUSH 1533 +#define IDR_SAVEALL 1500 +#define IDR_CLOSEFILE 1501 +#define IDR_CLOSEALL 1502 +#define IDR_FIND 1503 +#define IDR_REPLACE 1504 +#define IDR_ZOOMIN 1505 +#define IDR_ZOOMOUT 1506 +#define IDR_WRAP 1507 +#define IDR_INVISIBLECHAR 1508 +#define IDR_INDENTGUIDE 1509 +#define IDR_SHOWPANNEL 1510 +#define IDR_STARTRECORD 1511 +#define IDR_STOPRECORD 1512 +#define IDR_PLAYRECORD 1513 +#define IDR_SAVERECORD 1514 +#define IDR_SYNCV 1515 +#define IDR_SYNCH 1516 +#define IDR_FILENEW 1517 +#define IDR_FILEOPEN 1518 +#define IDR_FILESAVE 1519 +#define IDR_PRINT 1520 +#define IDR_CUT 1521 +#define IDR_COPY 1522 +#define IDR_PASTE 1523 +#define IDR_UNDO 1524 +#define IDR_REDO 1525 +#define IDR_M_PLAYRECORD 1526 +#define IDR_DOCMAP 1527 +#define IDR_FUNC_LIST 1528 +#define IDR_CLOSETAB 1530 +#define IDR_CLOSETAB_INACT 1531 +#define IDR_CLOSETAB_HOVER 1532 +#define IDR_CLOSETAB_PUSH 1533 -#define IDR_FUNC_LIST_ICO 1534 -#define IDR_DOCMAP_ICO 1535 -#define IDR_PROJECTPANEL_ICO 1536 -#define IDR_CLIPBOARDPANEL_ICO 1537 -#define IDR_ASCIIPANEL_ICO 1538 -#define IDR_DOCSWITCHER_ICO 1539 +#define IDR_FUNC_LIST_ICO 1534 +#define IDR_DOCMAP_ICO 1535 +#define IDR_PROJECTPANEL_ICO 1536 +#define IDR_CLIPBOARDPANEL_ICO 1537 +#define IDR_ASCIIPANEL_ICO 1538 +#define IDR_DOCSWITCHER_ICO 1539 #define ID_MACRO 20000 #define ID_MACRO_LIMIT 20200 @@ -207,7 +205,7 @@ #define ID_PLUGINS_CMD_LIMIT 22500 #define ID_PLUGINS_CMD_DYNAMIC 23000 -#define ID_PLUGINS_CMD_DYNAMIC_LIMIT 24999 +#define ID_PLUGINS_CMD_DYNAMIC_LIMIT 24999 #define MARKER_PLUGINS 3 #define MARKER_PLUGINS_LIMIT 19 @@ -220,136 +218,136 @@ //#define IDM 40000 #define IDCMD 50000 - //#define IDM_EDIT_AUTOCOMPLETE (IDCMD+0) - //#define IDM_EDIT_AUTOCOMPLETE_CURRENTFILE (IDCMD+1) - - #define IDC_PREV_DOC (IDCMD+3) - #define IDC_NEXT_DOC (IDCMD+4) - #define IDC_EDIT_TOGGLEMACRORECORDING (IDCMD+5) - //#define IDC_KEY_HOME (IDCMD+6) - //#define IDC_KEY_END (IDCMD+7) - //#define IDC_KEY_SELECT_2_HOME (IDCMD+8) - //#define IDC_KEY_SELECT_2_END (IDCMD+9) - -#define IDCMD_LIMIT (IDCMD+20) + //#define IDM_EDIT_AUTOCOMPLETE (IDCMD+0) + //#define IDM_EDIT_AUTOCOMPLETE_CURRENTFILE (IDCMD+1) -#define IDSCINTILLA 60000 - #define IDSCINTILLA_KEY_HOME (IDSCINTILLA+0) - #define IDSCINTILLA_KEY_HOME_WRAP (IDSCINTILLA+1) - #define IDSCINTILLA_KEY_END (IDSCINTILLA+2) - #define IDSCINTILLA_KEY_END_WRAP (IDSCINTILLA+3) - #define IDSCINTILLA_KEY_LINE_DUP (IDSCINTILLA+4) - #define IDSCINTILLA_KEY_LINE_CUT (IDSCINTILLA+5) - #define IDSCINTILLA_KEY_LINE_DEL (IDSCINTILLA+6) - #define IDSCINTILLA_KEY_LINE_TRANS (IDSCINTILLA+7) - #define IDSCINTILLA_KEY_LINE_COPY (IDSCINTILLA+8) - #define IDSCINTILLA_KEY_CUT (IDSCINTILLA+9) - #define IDSCINTILLA_KEY_COPY (IDSCINTILLA+10) - #define IDSCINTILLA_KEY_PASTE (IDSCINTILLA+11) - #define IDSCINTILLA_KEY_DEL (IDSCINTILLA+12) - #define IDSCINTILLA_KEY_SELECTALL (IDSCINTILLA+13) - #define IDSCINTILLA_KEY_OUTDENT (IDSCINTILLA+14) - #define IDSCINTILLA_KEY_UNDO (IDSCINTILLA+15) - #define IDSCINTILLA_KEY_REDO (IDSCINTILLA+16) -#define IDSCINTILLA_LIMIT (IDSCINTILLA+30) + #define IDC_PREV_DOC (IDCMD+3) + #define IDC_NEXT_DOC (IDCMD+4) + #define IDC_EDIT_TOGGLEMACRORECORDING (IDCMD+5) + //#define IDC_KEY_HOME (IDCMD+6) + //#define IDC_KEY_END (IDCMD+7) + //#define IDC_KEY_SELECT_2_HOME (IDCMD+8) + //#define IDC_KEY_SELECT_2_END (IDCMD+9) -#define IDD_FILEVIEW_DIALOG 1000 +#define IDCMD_LIMIT (IDCMD+20) -#define IDC_MINIMIZED_TRAY 67001 +#define IDSCINTILLA 60000 + #define IDSCINTILLA_KEY_HOME (IDSCINTILLA+0) + #define IDSCINTILLA_KEY_HOME_WRAP (IDSCINTILLA+1) + #define IDSCINTILLA_KEY_END (IDSCINTILLA+2) + #define IDSCINTILLA_KEY_END_WRAP (IDSCINTILLA+3) + #define IDSCINTILLA_KEY_LINE_DUP (IDSCINTILLA+4) + #define IDSCINTILLA_KEY_LINE_CUT (IDSCINTILLA+5) + #define IDSCINTILLA_KEY_LINE_DEL (IDSCINTILLA+6) + #define IDSCINTILLA_KEY_LINE_TRANS (IDSCINTILLA+7) + #define IDSCINTILLA_KEY_LINE_COPY (IDSCINTILLA+8) + #define IDSCINTILLA_KEY_CUT (IDSCINTILLA+9) + #define IDSCINTILLA_KEY_COPY (IDSCINTILLA+10) + #define IDSCINTILLA_KEY_PASTE (IDSCINTILLA+11) + #define IDSCINTILLA_KEY_DEL (IDSCINTILLA+12) + #define IDSCINTILLA_KEY_SELECTALL (IDSCINTILLA+13) + #define IDSCINTILLA_KEY_OUTDENT (IDSCINTILLA+14) + #define IDSCINTILLA_KEY_UNDO (IDSCINTILLA+15) + #define IDSCINTILLA_KEY_REDO (IDSCINTILLA+16) +#define IDSCINTILLA_LIMIT (IDSCINTILLA+30) -#define IDD_CREATE_DIRECTORY 1100 +#define IDD_FILEVIEW_DIALOG 1000 + +#define IDC_MINIMIZED_TRAY 67001 + +#define IDD_CREATE_DIRECTORY 1100 #define IDC_STATIC_CURRENT_FOLDER 1101 #define IDC_EDIT_NEW_FOLDER 1102 -#define IDD_INSERT_INPUT_TEXT 1200 -#define IDC_EDIT_INPUT_VALUE 1201 -#define IDC_STATIC_INPUT_TITLE 1202 -#define IDC_ICON_INPUT_ICON 1203 +#define IDD_INSERT_INPUT_TEXT 1200 +#define IDC_EDIT_INPUT_VALUE 1201 +#define IDC_STATIC_INPUT_TITLE 1202 +#define IDC_ICON_INPUT_ICON 1203 -#define IDR_M30_MENU 1500 +#define IDR_M30_MENU 1500 -#define IDR_SYSTRAYPOPUP_MENU 1501 +#define IDR_SYSTRAYPOPUP_MENU 1501 -// #define IDD_FIND_REPLACE_DLG 1600 +// #define IDD_FIND_REPLACE_DLG 1600 -#define IDD_ABOUTBOX 1700 -#define IDC_LICENCE_EDIT 1701 -#define IDC_HOME_ADDR 1702 -#define IDC_EMAIL_ADDR 1703 -#define IDC_ONLINEHELP_ADDR 1704 -#define IDC_AUTHOR_NAME 1705 -#define IDC_BUILD_DATETIME 1706 //LS: CompileDateInAboutDialog: Automatically insert compile date as additional version info in About-dialog! -//#define IDD_USER_DEFINE_BOX 1800 +#define IDD_ABOUTBOX 1700 +#define IDC_LICENCE_EDIT 1701 +#define IDC_HOME_ADDR 1702 +#define IDC_EMAIL_ADDR 1703 +#define IDC_ONLINEHELP_ADDR 1704 +#define IDC_AUTHOR_NAME 1705 +#define IDC_BUILD_DATETIME 1706 //LS: CompileDateInAboutDialog: Automatically insert compile date as additional version info in About-dialog! +//#define IDD_USER_DEFINE_BOX 1800 -//#define IDD_RUN_DLG 1900 +//#define IDD_RUN_DLG 1900 -#define IDD_GOLINE 2000 -#define ID_GOLINE_EDIT (IDD_GOLINE + 1) -#define ID_CURRLINE (IDD_GOLINE + 2) -#define ID_LASTLINE (IDD_GOLINE + 3) -#define ID_URHERE_STATIC (IDD_GOLINE + 4) -#define ID_UGO_STATIC (IDD_GOLINE + 5) -#define ID_NOMORETHAN_STATIC (IDD_GOLINE + 6) -#define IDC_RADIO_GOTOLINE (IDD_GOLINE + 7) -#define IDC_RADIO_GOTOOFFSET (IDD_GOLINE + 8) +#define IDD_GOLINE 2000 +#define ID_GOLINE_EDIT (IDD_GOLINE + 1) +#define ID_CURRLINE (IDD_GOLINE + 2) +#define ID_LASTLINE (IDD_GOLINE + 3) +#define ID_URHERE_STATIC (IDD_GOLINE + 4) +#define ID_UGO_STATIC (IDD_GOLINE + 5) +#define ID_NOMORETHAN_STATIC (IDD_GOLINE + 6) +#define IDC_RADIO_GOTOLINE (IDD_GOLINE + 7) +#define IDC_RADIO_GOTOOFFSET (IDD_GOLINE + 8) // voir columnEditor_rc.h -//#define IDD_COLUMNEDIT 2020 +//#define IDD_COLUMNEDIT 2020 -//#define IDD_COLOUR_POPUP 2100 +//#define IDD_COLOUR_POPUP 2100 // See WordStyleDlgRes.h -//#define IDD_STYLER_DLG 2200 -//#define IDD_GLOBAL_STYLER_DLG 2300 +//#define IDD_STYLER_DLG 2200 +//#define IDD_GLOBAL_STYLER_DLG 2300 -#define IDD_VALUE_DLG 2400 -#define IDC_VALUE_STATIC 2401 -#define IDC_VALUE_EDIT 2402 +#define IDD_VALUE_DLG 2400 +#define IDC_VALUE_STATIC 2401 +#define IDC_VALUE_EDIT 2402 -#define IDD_BUTTON_DLG 2410 -#define IDC_RESTORE_BUTTON 2411 +#define IDD_BUTTON_DLG 2410 +#define IDC_RESTORE_BUTTON 2411 // see TaskListDlg_rc.h -//#define IDD_TASKLIST_DLG 2450 -#define IDD_SETTING_DLG 2500 +//#define IDD_TASKLIST_DLG 2450 +#define IDD_SETTING_DLG 2500 //See ShortcutMapper_rc.h -//#define IDD_SHORTCUTMAPPER_DLG 2600 +//#define IDD_SHORTCUTMAPPER_DLG 2600 //See ansiCharPanel_rc.h -//#define IDD_ANSIASCII_PANEL 2700 +//#define IDD_ANSIASCII_PANEL 2700 //See clipboardHistoryPanel_rc.h -//#define IDD_CLIPBOARDHISTORY_PANEL 2800 +//#define IDD_CLIPBOARDHISTORY_PANEL 2800 //See findCharsInRange_rc.h -//#define IDD_FINDCHARACTERS 2900 +//#define IDD_FINDCHARACTERS 2900 //See VerticalFileSwitcher_rc.h -//#define IDD_FILESWITCHER_PANEL 3000 +//#define IDD_FILESWITCHER_PANEL 3000 //See ProjectPanel_rc.h -//#define IDD_PROJECTPANEL 3100 -//#define IDD_FILERELOCALIZER_DIALOG 3200 +//#define IDD_PROJECTPANEL 3100 +//#define IDD_FILERELOCALIZER_DIALOG 3200 //See documentMap_rc.h -//#define IDD_DOCUMENTMAP 3300 +//#define IDD_DOCUMENTMAP 3300 //See functionListPanel_rc.h -//#define IDD_FUNCLIST_PANEL 3400 +//#define IDD_FUNCLIST_PANEL 3400 // See regExtDlg.h -//#define IDD_REGEXT 4000 +//#define IDD_REGEXT 4000 // See shortcutRc.h -//#define IDD_SHORTCUT_DLG 5000 +//#define IDD_SHORTCUT_DLG 5000 // See preference.rc -//#define IDD_PREFERENCE_BOX 6000 +//#define IDD_PREFERENCE_BOX 6000 #define NOTEPADPLUS_USER_INTERNAL (WM_USER + 0000) #define NPPM_INTERNAL_USERCMDLIST_MODIFIED (NOTEPADPLUS_USER_INTERNAL + 1) @@ -357,94 +355,94 @@ #define NPPM_INTERNAL_MACROLIST_MODIFIED (NOTEPADPLUS_USER_INTERNAL + 3) #define NPPM_INTERNAL_PLUGINCMDLIST_MODIFIED (NOTEPADPLUS_USER_INTERNAL + 4) #define NPPM_INTERNAL_CLEARSCINTILLAKEY (NOTEPADPLUS_USER_INTERNAL + 5) - #define NPPM_INTERNAL_BINDSCINTILLAKEY (NOTEPADPLUS_USER_INTERNAL + 6) + #define NPPM_INTERNAL_BINDSCINTILLAKEY (NOTEPADPLUS_USER_INTERNAL + 6) #define NPPM_INTERNAL_SCINTILLAKEYMODIFIED (NOTEPADPLUS_USER_INTERNAL + 7) #define NPPM_INTERNAL_SCINTILLAFINFERCOLLAPSE (NOTEPADPLUS_USER_INTERNAL + 8) #define NPPM_INTERNAL_SCINTILLAFINFERUNCOLLAPSE (NOTEPADPLUS_USER_INTERNAL + 9) - #define NPPM_INTERNAL_DISABLEAUTOUPDATE (NOTEPADPLUS_USER_INTERNAL + 10) - #define NPPM_INTERNAL_SETTING_HISTORY_SIZE (NOTEPADPLUS_USER_INTERNAL + 11) - #define NPPM_INTERNAL_ISTABBARREDUCED (NOTEPADPLUS_USER_INTERNAL + 12) - #define NPPM_INTERNAL_ISFOCUSEDTAB (NOTEPADPLUS_USER_INTERNAL + 13) - #define NPPM_INTERNAL_GETMENU (NOTEPADPLUS_USER_INTERNAL + 14) - #define NPPM_INTERNAL_CLEARINDICATOR (NOTEPADPLUS_USER_INTERNAL + 15) + #define NPPM_INTERNAL_DISABLEAUTOUPDATE (NOTEPADPLUS_USER_INTERNAL + 10) + #define NPPM_INTERNAL_SETTING_HISTORY_SIZE (NOTEPADPLUS_USER_INTERNAL + 11) + #define NPPM_INTERNAL_ISTABBARREDUCED (NOTEPADPLUS_USER_INTERNAL + 12) + #define NPPM_INTERNAL_ISFOCUSEDTAB (NOTEPADPLUS_USER_INTERNAL + 13) + #define NPPM_INTERNAL_GETMENU (NOTEPADPLUS_USER_INTERNAL + 14) + #define NPPM_INTERNAL_CLEARINDICATOR (NOTEPADPLUS_USER_INTERNAL + 15) #define NPPM_INTERNAL_SCINTILLAFINFERCOPY (NOTEPADPLUS_USER_INTERNAL + 16) #define NPPM_INTERNAL_SCINTILLAFINFERSELECTALL (NOTEPADPLUS_USER_INTERNAL + 17) #define NPPM_INTERNAL_SETCARETWIDTH (NOTEPADPLUS_USER_INTERNAL + 18) #define NPPM_INTERNAL_SETCARETBLINKRATE (NOTEPADPLUS_USER_INTERNAL + 19) - #define NPPM_INTERNAL_CLEARINDICATORTAGMATCH (NOTEPADPLUS_USER_INTERNAL + 20) - #define NPPM_INTERNAL_CLEARINDICATORTAGATTR (NOTEPADPLUS_USER_INTERNAL + 21) - #define NPPM_INTERNAL_SWITCHVIEWFROMHWND (NOTEPADPLUS_USER_INTERNAL + 22) - #define NPPM_INTERNAL_UPDATETITLEBAR (NOTEPADPLUS_USER_INTERNAL + 23) - #define NPPM_INTERNAL_CANCEL_FIND_IN_FILES (NOTEPADPLUS_USER_INTERNAL + 24) - #define NPPM_INTERNAL_RELOADNATIVELANG (NOTEPADPLUS_USER_INTERNAL + 25) - #define NPPM_INTERNAL_PLUGINSHORTCUTMOTIFIED (NOTEPADPLUS_USER_INTERNAL + 26) - #define NPPM_INTERNAL_SCINTILLAFINFERCLEARALL (NOTEPADPLUS_USER_INTERNAL + 27) - #define NPPM_INTERNAL_SETTING_EDGE_SIZE (NOTEPADPLUS_USER_INTERNAL + 28) - #define NPPM_INTERNAL_SETTING_TAB_REPLCESPACE (NOTEPADPLUS_USER_INTERNAL + 29) - #define NPPM_INTERNAL_SETTING_TAB_SIZE (NOTEPADPLUS_USER_INTERNAL + 30) - #define NPPM_INTERNAL_RELOADSTYLERS (NOTEPADPLUS_USER_INTERNAL + 31) - #define NPPM_INTERNAL_DOCORDERCHANGED (NOTEPADPLUS_USER_INTERNAL + 32) + #define NPPM_INTERNAL_CLEARINDICATORTAGMATCH (NOTEPADPLUS_USER_INTERNAL + 20) + #define NPPM_INTERNAL_CLEARINDICATORTAGATTR (NOTEPADPLUS_USER_INTERNAL + 21) + #define NPPM_INTERNAL_SWITCHVIEWFROMHWND (NOTEPADPLUS_USER_INTERNAL + 22) + #define NPPM_INTERNAL_UPDATETITLEBAR (NOTEPADPLUS_USER_INTERNAL + 23) + #define NPPM_INTERNAL_CANCEL_FIND_IN_FILES (NOTEPADPLUS_USER_INTERNAL + 24) + #define NPPM_INTERNAL_RELOADNATIVELANG (NOTEPADPLUS_USER_INTERNAL + 25) + #define NPPM_INTERNAL_PLUGINSHORTCUTMOTIFIED (NOTEPADPLUS_USER_INTERNAL + 26) + #define NPPM_INTERNAL_SCINTILLAFINFERCLEARALL (NOTEPADPLUS_USER_INTERNAL + 27) + #define NPPM_INTERNAL_SETTING_EDGE_SIZE (NOTEPADPLUS_USER_INTERNAL + 28) + #define NPPM_INTERNAL_SETTING_TAB_REPLCESPACE (NOTEPADPLUS_USER_INTERNAL + 29) + #define NPPM_INTERNAL_SETTING_TAB_SIZE (NOTEPADPLUS_USER_INTERNAL + 30) + #define NPPM_INTERNAL_RELOADSTYLERS (NOTEPADPLUS_USER_INTERNAL + 31) + #define NPPM_INTERNAL_DOCORDERCHANGED (NOTEPADPLUS_USER_INTERNAL + 32) #define NPPM_INTERNAL_SETMULTISELCTION (NOTEPADPLUS_USER_INTERNAL + 33) - #define NPPM_INTERNAL_SCINTILLAFINFEROPENALL (NOTEPADPLUS_USER_INTERNAL + 34) - #define NPPM_INTERNAL_RECENTFILELIST_UPDATE (NOTEPADPLUS_USER_INTERNAL + 35) - #define NPPM_INTERNAL_RECENTFILELIST_SWITCH (NOTEPADPLUS_USER_INTERNAL + 36) - #define NPPM_INTERNAL_GETSCINTEDTVIEW (NOTEPADPLUS_USER_INTERNAL + 37) - #define NPPM_INTERNAL_ENABLESNAPSHOT (NOTEPADPLUS_USER_INTERNAL + 38) - #define NPPM_INTERNAL_SAVECURRENTSESSION (NOTEPADPLUS_USER_INTERNAL + 39) + #define NPPM_INTERNAL_SCINTILLAFINFEROPENALL (NOTEPADPLUS_USER_INTERNAL + 34) + #define NPPM_INTERNAL_RECENTFILELIST_UPDATE (NOTEPADPLUS_USER_INTERNAL + 35) + #define NPPM_INTERNAL_RECENTFILELIST_SWITCH (NOTEPADPLUS_USER_INTERNAL + 36) + #define NPPM_INTERNAL_GETSCINTEDTVIEW (NOTEPADPLUS_USER_INTERNAL + 37) + #define NPPM_INTERNAL_ENABLESNAPSHOT (NOTEPADPLUS_USER_INTERNAL + 38) + #define NPPM_INTERNAL_SAVECURRENTSESSION (NOTEPADPLUS_USER_INTERNAL + 39) - //wParam: 0 - //lParam: document new index + //wParam: 0 + //lParam: document new index // See Notepad_plus_msgs.h //#define NOTEPADPLUS_USER (WM_USER + 1000) - // - // Used by Doc Monitor plugin - // + // + // Used by Doc Monitor plugin + // #define NPPM_INTERNAL_CHECKDOCSTATUS (NPPMSG + 53) - // VOID NPPM_CHECKDOCSTATUS(BOOL, 0) - // check all opened documents status. - // If files are modified, then reloaod (with or without prompt, it depends on settings). - // if files are deleted, then prompt user to close the documents + // VOID NPPM_CHECKDOCSTATUS(BOOL, 0) + // check all opened documents status. + // If files are modified, then reloaod (with or without prompt, it depends on settings). + // if files are deleted, then prompt user to close the documents #define NPPM_INTERNAL_ENABLECHECKDOCOPT (NPPMSG + 54) - // VOID NPPM_ENABLECHECKDOCOPT(OPT, 0) - // where OPT is : - #define CHECKDOCOPT_NONE 0 - #define CHECKDOCOPT_UPDATESILENTLY 1 - #define CHECKDOCOPT_UPDATEGO2END 2 + // VOID NPPM_ENABLECHECKDOCOPT(OPT, 0) + // where OPT is : + #define CHECKDOCOPT_NONE 0 + #define CHECKDOCOPT_UPDATESILENTLY 1 + #define CHECKDOCOPT_UPDATEGO2END 2 #define NPPM_INTERNAL_GETCHECKDOCOPT (NPPMSG + 55) - // INT NPPM_GETCHECKDOCOPT(0, 0) + // INT NPPM_GETCHECKDOCOPT(0, 0) #define NPPM_INTERNAL_SETCHECKDOCOPT (NPPMSG + 56) - // INT NPPM_SETCHECKDOCOPT(OPT, 0) + // INT NPPM_SETCHECKDOCOPT(OPT, 0) - // - // Used by netnote plugin - // + // + // Used by netnote plugin + // #define NPPM_INTERNAL_SETFILENAME (NPPMSG + 63) - //wParam: BufferID to rename - //lParam: name to set (TCHAR*) - //Buffer must have been previously unnamed (eg "new 1" document types) + //wParam: BufferID to rename + //lParam: name to set (TCHAR*) + //Buffer must have been previously unnamed (eg "new 1" document types) #define SCINTILLA_USER (WM_USER + 2000) -#define MACRO_USER (WM_USER + 4000) +#define MACRO_USER (WM_USER + 4000) #define WM_GETCURRENTMACROSTATUS (MACRO_USER + 01) #define WM_MACRODLGRUNMACRO (MACRO_USER + 02) // See Notepad_plus_msgs.h -//#define RUNCOMMAND_USER (WM_USER + 3000) +//#define RUNCOMMAND_USER (WM_USER + 3000) #define SPLITTER_USER (WM_USER + 4000) #define WORDSTYLE_USER (WM_USER + 5000) #define COLOURPOPUP_USER (WM_USER + 6000) #define BABYGRID_USER (WM_USER + 7000) -//#define IDD_DOCKING_MNG (IDM + 7000) +//#define IDD_DOCKING_MNG (IDM + 7000) #define MENUINDEX_FILE 0 #define MENUINDEX_EDIT 1 @@ -455,8 +453,4 @@ #define MENUINDEX_SETTINGS 6 #define MENUINDEX_MACRO 7 #define MENUINDEX_RUN 8 -#define MENUINDEX_PLUGINS 9 - -#endif // RESOURCE_H - - +#define MENUINDEX_PLUGINS 9 From 95b2ada22f3bf456444fbc74b2def4efb2769b99 Mon Sep 17 00:00:00 2001 From: Ricardo Date: Mon, 3 Aug 2015 21:35:20 -0300 Subject: [PATCH 11/85] Improve space usage in File Association dialog (closes #637, #654) - This improves the commit 77e816439 that didn't completely fix #535 - This fixes the remaining text cuts, while adding space for future changes. - Round numbers for object position/sizes. - "exts :" -> "extensions:" for clarification. --- PowerEditor/installer/nativeLang/english.xml | 4 ++-- .../nativeLang/english_customizable.xml | 4 ++-- PowerEditor/src/MISC/RegExt/regExtDlg.rc | 16 ++++++++-------- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/PowerEditor/installer/nativeLang/english.xml b/PowerEditor/installer/nativeLang/english.xml index 5e9fa07d9..e17f659dc 100644 --- a/PowerEditor/installer/nativeLang/english.xml +++ b/PowerEditor/installer/nativeLang/english.xml @@ -682,8 +682,8 @@ - - + + diff --git a/PowerEditor/installer/nativeLang/english_customizable.xml b/PowerEditor/installer/nativeLang/english_customizable.xml index 74511edb6..39c21e6c2 100644 --- a/PowerEditor/installer/nativeLang/english_customizable.xml +++ b/PowerEditor/installer/nativeLang/english_customizable.xml @@ -654,8 +654,8 @@ - - + + diff --git a/PowerEditor/src/MISC/RegExt/regExtDlg.rc b/PowerEditor/src/MISC/RegExt/regExtDlg.rc index 06c78fbff..59d13b72c 100644 --- a/PowerEditor/src/MISC/RegExt/regExtDlg.rc +++ b/PowerEditor/src/MISC/RegExt/regExtDlg.rc @@ -34,14 +34,14 @@ IDD_REGEXT_BOX DIALOGEX 0, 0, 370, 180 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | DS_CONTROL FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x1 BEGIN - LTEXT "Supported exts :",IDC_SUPPORTEDEXTS_STATIC,100,18,77,8 - LISTBOX IDC_REGEXT_LANG_LIST,100,31,63,122,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP - LISTBOX IDC_REGEXT_LANGEXT_LIST,168,31,42,122,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP - EDITTEXT IDC_CUSTOMEXT_EDIT,181,75,30,14,ES_AUTOHSCROLL | NOT WS_VISIBLE - PUSHBUTTON "->",IDC_ADDFROMLANGEXT_BUTTON,218,75,26,14 - PUSHBUTTON "<-",IDC_REMOVEEXT_BUTTON,218,98,26,14 - LTEXT "Registered exts :",IDC_REGISTEREDEXTS_STATIC,252,18,72,8 - LISTBOX IDC_REGEXT_REGISTEREDEXTS_LIST,251,30,48,123,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + LTEXT "Supported extensions:",IDC_SUPPORTEDEXTS_STATIC,70,18,80,8 + LISTBOX IDC_REGEXT_LANG_LIST,70,30,100,125,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP + LISTBOX IDC_REGEXT_LANGEXT_LIST,175,30,80,125,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP + EDITTEXT IDC_CUSTOMEXT_EDIT,175,75,80,14,ES_AUTOHSCROLL | NOT WS_VISIBLE + PUSHBUTTON "->",IDC_ADDFROMLANGEXT_BUTTON,265,76,25,14 + PUSHBUTTON "<-",IDC_REMOVEEXT_BUTTON,265,96,25,14 + LTEXT "Registered extensions:",IDC_REGISTEREDEXTS_STATIC,300,18,80,8 + LISTBOX IDC_REGEXT_REGISTEREDEXTS_LIST,300,30,80,125,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP //CONTROL "",IDC_POUPELLE_STATIC,"Static",SS_OWNERDRAW,301,82,20,20 END From 4a20a4c4129bc06b51aeb3fbda045fbc8c79b5db Mon Sep 17 00:00:00 2001 From: Damien GERARD Date: Thu, 6 Aug 2015 13:49:14 +0200 Subject: [PATCH 12/85] Fixed buffer overrun when opening a recent file (fixes #558) --- PowerEditor/src/Notepad_plus.h | 2 +- PowerEditor/src/NppCommands.cpp | 12 +++++----- PowerEditor/src/NppIO.cpp | 40 ++++++++++++++++----------------- 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/PowerEditor/src/Notepad_plus.h b/PowerEditor/src/Notepad_plus.h index 8905a8e85..b20a30a08 100644 --- a/PowerEditor/src/Notepad_plus.h +++ b/PowerEditor/src/Notepad_plus.h @@ -223,7 +223,7 @@ public: //! \name File Operations //@{ //The doXXX functions apply to a single buffer and dont need to worry about views, with the excpetion of doClose, since closing one view doesnt have to mean the document is gone - BufferID doOpen(const TCHAR *fileName, bool isRecursive = false, bool isReadOnly = false, int encoding = -1, const TCHAR *backupFileName = NULL, time_t fileNameTimestamp = 0); + BufferID doOpen(const generic_string& fileName, bool isRecursive = false, bool isReadOnly = false, int encoding = -1, const TCHAR *backupFileName = NULL, time_t fileNameTimestamp = 0); bool doReload(BufferID id, bool alert = true); bool doSave(BufferID, const TCHAR * filename, bool isSaveCopy = false); void doClose(BufferID, int whichOne, bool doDeleteBackup = false); diff --git a/PowerEditor/src/NppCommands.cpp b/PowerEditor/src/NppCommands.cpp index af04ab025..2f93f8b61 100644 --- a/PowerEditor/src/NppCommands.cpp +++ b/PowerEditor/src/NppCommands.cpp @@ -2154,7 +2154,7 @@ void Notepad_plus::command(int id) MB_OK|MB_APPLMODAL); } NppParameters *pNppParams = NppParameters::getInstance(); - BufferID bufID = doOpen((pNppParams->getContextMenuPath()).c_str()); + BufferID bufID = doOpen((pNppParams->getContextMenuPath())); switchToFile(bufID); break; } @@ -2472,7 +2472,7 @@ void Notepad_plus::command(int id) int size = _lastRecentFileList.getSize(); for (int i = size - 1; i >= 0; i--) { - BufferID test = doOpen(_lastRecentFileList.getIndex(i).c_str()); + BufferID test = doOpen(_lastRecentFileList.getIndex(i)); if (test != BUFFER_INVALID) lastOne = test; } @@ -2570,13 +2570,11 @@ void Notepad_plus::command(int id) case IDM_FILE_RESTORELASTCLOSEDFILE: { generic_string lastOpenedFullPath = _lastRecentFileList.getFirstItem(); - if (lastOpenedFullPath != TEXT("")) + if (not lastOpenedFullPath.empty()) { - BufferID lastOpened = doOpen(lastOpenedFullPath.c_str()); + BufferID lastOpened = doOpen(lastOpenedFullPath); if (lastOpened != BUFFER_INVALID) - { switchToFile(lastOpened); - } } } break; @@ -2667,7 +2665,7 @@ void Notepad_plus::command(int id) default : if (id > IDM_FILEMENU_LASTONE && id < (IDM_FILEMENU_LASTONE + _lastRecentFileList.getMaxNbLRF() + 1)) { - BufferID lastOpened = doOpen(_lastRecentFileList.getItem(id).c_str()); + BufferID lastOpened = doOpen(_lastRecentFileList.getItem(id)); if (lastOpened != BUFFER_INVALID) { switchToFile(lastOpened); diff --git a/PowerEditor/src/NppIO.cpp b/PowerEditor/src/NppIO.cpp index 86e682774..c19410d40 100644 --- a/PowerEditor/src/NppIO.cpp +++ b/PowerEditor/src/NppIO.cpp @@ -37,10 +37,11 @@ using namespace std; -BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isRecursive, bool isReadOnly, int encoding, const TCHAR *backupFileName, time_t fileNameTimestamp) +BufferID Notepad_plus::doOpen(const generic_string& fileName, bool isRecursive, bool isReadOnly, int encoding, const TCHAR *backupFileName, time_t fileNameTimestamp) { - - const rsize_t longFileNameBufferSize = MAX_PATH; + const rsize_t longFileNameBufferSize = MAX_PATH; // TODO stop using fixed-size buffer + if (fileName.size() >= longFileNameBufferSize - 1) // issue with all other sub-routines + return BUFFER_INVALID; //If [GetFullPathName] succeeds, the return value is the length, in TCHARs, of the string copied to lpBuffer, not including the terminating null character. //If the lpBuffer buffer is too small to contain the path, the return value [of GetFullPathName] is the size, in TCHARs, of the buffer that is required to hold the path and the terminating null character. @@ -49,7 +50,7 @@ BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isRecursive, bool isRe NppParameters *pNppParam = NppParameters::getInstance(); TCHAR longFileName[longFileNameBufferSize]; - const DWORD getFullPathNameResult = ::GetFullPathName(fileName, longFileNameBufferSize, longFileName, NULL); + const DWORD getFullPathNameResult = ::GetFullPathName(fileName.c_str(), longFileNameBufferSize, longFileName, NULL); if ( getFullPathNameResult == 0 ) { return BUFFER_INVALID; @@ -66,14 +67,14 @@ BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isRecursive, bool isRe bool isSnapshotMode = backupFileName != NULL && PathFileExists(backupFileName); if (isSnapshotMode && !PathFileExists(longFileName)) // UNTITLED { - lstrcpy(longFileName, fileName); + lstrcpy(longFileName, fileName.c_str()); } _lastRecentFileList.remove(longFileName); - const TCHAR * fileName2Find; - generic_string gs_fileName = fileName; + generic_string fileName2Find; + generic_string gs_fileName{fileName}; size_t res = gs_fileName.find_first_of(UNTITLED_STR); if (res != string::npos && res == 0) @@ -85,7 +86,7 @@ BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isRecursive, bool isRe fileName2Find = longFileName; } - BufferID test = MainFileManager->getBufferFromName(fileName2Find); + BufferID test = MainFileManager->getBufferFromName(fileName2Find.c_str()); if (test != BUFFER_INVALID && !isSnapshotMode) { //switchToFile(test); @@ -248,14 +249,14 @@ BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isRecursive, bool isRe } else { - if (globbing || ::PathIsDirectory(fileName)) + if (globbing || ::PathIsDirectory(fileName.c_str())) { vector fileNames; vector patterns; if (globbing) { - const TCHAR * substring = wcsrchr(fileName, TCHAR('\\')); - size_t pos = substring - fileName; + const TCHAR * substring = wcsrchr(fileName.c_str(), TCHAR('\\')); + size_t pos = substring - fileName.c_str(); patterns.push_back(substring + 1); generic_string dir(fileName, pos + 1); @@ -264,7 +265,7 @@ BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isRecursive, bool isRe else { generic_string fileNameStr = fileName; - if (fileName[lstrlen(fileName) - 1] != '\\') + if (fileName[fileName.size() - 1] != '\\') fileNameStr += TEXT("\\"); patterns.push_back(TEXT("*")); @@ -277,19 +278,17 @@ BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isRecursive, bool isRe if (nbFiles2Open > 200) { ok2Open = IDYES == _nativeLangSpeaker.messageBox("NbFileToOpenImportantWarning", - _pPublicInterface->getHSelf(), - TEXT("$INT_REPLACE$ files are about to be opened.\rAre you sure to open them?"), - TEXT("Amount of files to open is too large"), - MB_YESNO|MB_APPLMODAL, - nbFiles2Open); + _pPublicInterface->getHSelf(), + TEXT("$INT_REPLACE$ files are about to be opened.\rAre you sure to open them?"), + TEXT("Amount of files to open is too large"), + MB_YESNO|MB_APPLMODAL, + nbFiles2Open); } if (ok2Open) { for (size_t i = 0 ; i < nbFiles2Open ; ++i) - { - doOpen(fileNames[i].c_str()); - } + doOpen(fileNames[i]); } } else @@ -313,6 +312,7 @@ BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isRecursive, bool isRe return buffer; } + bool Notepad_plus::doReload(BufferID id, bool alert) { if (alert) From 85c728573e0c81ff9df7a1adf4b1934fb01661e7 Mon Sep 17 00:00:00 2001 From: Damien GERARD Date: Thu, 6 Aug 2015 13:55:41 +0200 Subject: [PATCH 13/85] Visual Studio Project: added more checks in debug * Added `/RTCu`: Unitialized variables * Added `/RTCc`: Smaller Type check --- PowerEditor/visual.net/notepadPlus.vcxproj | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/PowerEditor/visual.net/notepadPlus.vcxproj b/PowerEditor/visual.net/notepadPlus.vcxproj index f1604fa9d..543911a79 100644 --- a/PowerEditor/visual.net/notepadPlus.vcxproj +++ b/PowerEditor/visual.net/notepadPlus.vcxproj @@ -78,7 +78,7 @@ x64\$(Configuration)\ x64\$(Configuration)\ - false + false ..\bin\ @@ -97,12 +97,13 @@ ..\src\WinControls\AboutDlg;..\..\scintilla\include;..\include;..\src\WinControls;..\src\WinControls\ImageListSet;..\src\WinControls\OpenSaveFileDialog;..\src\WinControls\SplitterContainer;..\src\WinControls\StaticDialog;..\src\WinControls\TabBar;..\src\WinControls\ToolBar;..\src\MISC\Process;..\src\ScitillaComponent;..\src\MISC;..\src\MISC\SysMsg;..\src\WinControls\StatusBar;..\src;..\src\WinControls\StaticDialog\RunDlg;..\src\tinyxml;..\src\WinControls\ColourPicker;..\src\Win32Explr;..\src\MISC\RegExt;..\src\WinControls\TrayIcon;..\src\WinControls\shortcut;..\src\WinControls\Grid;..\src\WinControls\ContextMenu;..\src\MISC\PluginsManager;..\src\WinControls\Preference;..\src\WinControls\WindowsDlg;..\src\WinControls\TaskList;..\src\WinControls\DockingWnd;..\src\WinControls\ToolTip;..\src\MISC\Exception;..\src\MISC\Common;..\src\tinyxml\tinyXmlA;..\src\WinControls\AnsiCharPanel;..\src\WinControls\ClipboardHistory;..\src\WinControls\FindCharsInRange;..\src\WinControls\VerticalFileSwitcher;..\src\WinControls\ProjectPanel;..\src\WinControls\DocumentMap;..\src\WinControls\FunctionList;..\src\uchardet;%(AdditionalIncludeDirectories) WIN32;_WIN32_WINNT=0x0501;_WINDOWS;_USE_64BIT_TIME_T;TIXML_USE_STL;TIXMLA_USE_STL;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS=1;%(PreprocessorDefinitions) Async - Default + UninitializedLocalUsageCheck MultiThreadedDebug Level4 true ProgramDatabase true + true /fixed:no %(AdditionalOptions) @@ -131,12 +132,13 @@ ..\src\WinControls\AboutDlg;..\..\scintilla\include;..\include;..\src\WinControls;..\src\WinControls\ImageListSet;..\src\WinControls\OpenSaveFileDialog;..\src\WinControls\SplitterContainer;..\src\WinControls\StaticDialog;..\src\WinControls\TabBar;..\src\WinControls\ToolBar;..\src\MISC\Process;..\src\ScitillaComponent;..\src\MISC;..\src\MISC\SysMsg;..\src\WinControls\StatusBar;..\src;..\src\WinControls\StaticDialog\RunDlg;..\src\tinyxml;..\src\WinControls\ColourPicker;..\src\Win32Explr;..\src\MISC\RegExt;..\src\WinControls\TrayIcon;..\src\WinControls\shortcut;..\src\WinControls\Grid;..\src\WinControls\ContextMenu;..\src\MISC\PluginsManager;..\src\WinControls\Preference;..\src\WinControls\WindowsDlg;..\src\WinControls\TaskList;..\src\WinControls\DockingWnd;..\src\WinControls\ToolTip;..\src\MISC\Exception;..\src\MISC\Common;..\src\tinyxml\tinyXmlA;..\src\WinControls\AnsiCharPanel;..\src\WinControls\ClipboardHistory;..\src\WinControls\FindCharsInRange;..\src\WinControls\VerticalFileSwitcher;..\src\WinControls\ProjectPanel;..\src\WinControls\DocumentMap;..\src\WinControls\FunctionList;..\src\uchardet;%(AdditionalIncludeDirectories) WIN32;_WIN32_WINNT=0x0501;_WINDOWS;_USE_64BIT_TIME_T;TIXML_USE_STL;TIXMLA_USE_STL;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_WARNINGS;_CRT_NON_CONFORMING_SWPRINTFS=1;%(PreprocessorDefinitions) Async - Default + UninitializedLocalUsageCheck MultiThreadedDebug Level4 false ProgramDatabase true + true /fixed:no %(AdditionalOptions) From 4991fb130913a19936ab16727673094681cbfdbd Mon Sep 17 00:00:00 2001 From: Don Ho Date: Thu, 6 Aug 2015 21:23:34 +0200 Subject: [PATCH 14/85] [BUG_FIXED] Fix panel caption display On a high resolution screen, the panel caption is too small. This commit fix this bug. --- .../WinControls/DockingWnd/DockingCont.cpp | 47 ++++++++++--------- .../src/WinControls/DockingWnd/DockingCont.h | 5 ++ 2 files changed, 31 insertions(+), 21 deletions(-) diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp b/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp index 1e120db90..97f8c635b 100644 --- a/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp +++ b/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp @@ -86,6 +86,11 @@ DockingCont::DockingCont() _hoverMPos = posClose; _bDrawOgLine = TRUE; _vTbData.clear(); + + _captionHeightDynamic = NppParameters::getInstance()->_dpiManager.scaleY(_captionHeightDynamic); + _captionGapDynamic = NppParameters::getInstance()->_dpiManager.scaleY(_captionGapDynamic); + _closeButtonPosLeftDynamic = NppParameters::getInstance()->_dpiManager.scaleX(_closeButtonPosLeftDynamic); + _closeButtonPosTopDynamic = NppParameters::getInstance()->_dpiManager.scaleY(_closeButtonPosTopDynamic); } DockingCont::~DockingCont() @@ -533,7 +538,7 @@ void DockingCont::drawCaptionItem(DRAWITEMSTRUCT *pDrawItemStruct) // draw text rc.left += 1; - rc.top += HIGH_CAPTION; + rc.top += _captionHeightDynamic; // to make ellipsis working rc.right = rc.bottom - rc.top; rc.bottom += 14; @@ -577,9 +582,9 @@ void DockingCont::drawCaptionItem(DRAWITEMSTRUCT *pDrawItemStruct) ::SelectObject(hDc, hBmpNew); if (_isTopCaption == TRUE) - ::BitBlt(hDc, rc.right-bmp.bmWidth-CLOSEBTN_POS_LEFT, CLOSEBTN_POS_TOP, bmp.bmWidth, bmp.bmHeight, dcMem, 0, 0, SRCCOPY); + ::BitBlt(hDc, rc.right - bmp.bmWidth - _closeButtonPosLeftDynamic, _closeButtonPosTopDynamic, bmp.bmWidth, bmp.bmHeight, dcMem, 0, 0, SRCCOPY); else - ::BitBlt(hDc, CLOSEBTN_POS_LEFT, CLOSEBTN_POS_LEFT, bmp.bmWidth, bmp.bmHeight, dcMem, 0, 0, SRCCOPY); + ::BitBlt(hDc, _closeButtonPosLeftDynamic, _closeButtonPosLeftDynamic, bmp.bmWidth, bmp.bmHeight, dcMem, 0, 0, SRCCOPY); ::SelectObject(dcMem, hBmpOld); ::DeleteObject(hBmpCur); @@ -599,24 +604,24 @@ eMousePos DockingCont::isInRect(HWND hwnd, int x, int y) if (_isTopCaption == TRUE) { - if ((x > rc.left) && (x < rc.right-HIGH_CAPTION) && (y > rc.top) && (y < rc.bottom)) + if ((x > rc.left) && (x < rc.right - _captionHeightDynamic) && (y > rc.top) && (y < rc.bottom)) { ret = posCaption; } - else if ((x > rc.right-(12+CLOSEBTN_POS_LEFT)) && (x < (rc.right-CLOSEBTN_POS_LEFT)) && - (y > (rc.top+CLOSEBTN_POS_TOP)) && (y < (rc.bottom-CLOSEBTN_POS_TOP))) + else if ((x > rc.right - (12 + _closeButtonPosLeftDynamic)) && (x < (rc.right - _closeButtonPosLeftDynamic)) && + (y >(rc.top + _closeButtonPosTopDynamic)) && (y < (rc.bottom - _closeButtonPosTopDynamic))) { ret = posClose; } } else { - if ((x > rc.left) && (x < rc.right) && (y > rc.top+HIGH_CAPTION) && (y < rc.bottom)) + if ((x > rc.left) && (x < rc.right) && (y > rc.top + _captionHeightDynamic) && (y < rc.bottom)) { ret = posCaption; } - else if ((x > rc.left+CLOSEBTN_POS_LEFT) && (x < rc.right-CLOSEBTN_POS_LEFT) && - (y > (rc.top+CLOSEBTN_POS_TOP)) && (y < (rc.top+(12+CLOSEBTN_POS_LEFT)))) + else if ((x > rc.left + _closeButtonPosLeftDynamic) && (x < rc.right - _closeButtonPosLeftDynamic) && + (y >(rc.top + _closeButtonPosTopDynamic)) && (y < (rc.top + (12 + _closeButtonPosLeftDynamic)))) { ret = posClose; } @@ -1023,15 +1028,15 @@ void DockingCont::onSize() // draw caption if (_isTopCaption == TRUE) { - ::SetWindowPos(_hCaption, NULL, rc.left, rc.top, rc.right, HIGH_CAPTION, SWP_NOZORDER | SWP_NOACTIVATE); - rc.top += HIGH_CAPTION; - rc.bottom -= HIGH_CAPTION; + ::SetWindowPos(_hCaption, NULL, rc.left, rc.top, rc.right, _captionHeightDynamic, SWP_NOZORDER | SWP_NOACTIVATE); + rc.top += _captionHeightDynamic; + rc.bottom -= _captionHeightDynamic; } else { - ::SetWindowPos(_hCaption, NULL, rc.left, rc.top, HIGH_CAPTION, rc.bottom, SWP_NOZORDER | SWP_NOACTIVATE); - rc.left += HIGH_CAPTION; - rc.right -= HIGH_CAPTION; + ::SetWindowPos(_hCaption, NULL, rc.left, rc.top, _captionHeightDynamic, rc.bottom, SWP_NOZORDER | SWP_NOACTIVATE); + rc.left += _captionHeightDynamic; + rc.right -= _captionHeightDynamic; } if (iItemCnt >= 2) @@ -1039,7 +1044,7 @@ void DockingCont::onSize() // resize tab and plugin control if tabs exceeds one // resize tab rcTemp = rc; - rcTemp.top = (rcTemp.bottom + rcTemp.top) - (tabDpiDynamicalHeight + CAPTION_GAP); + rcTemp.top = (rcTemp.bottom + rcTemp.top) - (tabDpiDynamicalHeight + _captionGapDynamic); rcTemp.bottom = tabDpiDynamicalHeight; iTabOff = tabDpiDynamicalHeight; @@ -1052,13 +1057,13 @@ void DockingCont::onSize() rcTemp = rc; if (_isTopCaption == TRUE) { - rcTemp.top += CAPTION_GAP; - rcTemp.bottom -= (iTabOff + CAPTION_GAP); + rcTemp.top += _captionGapDynamic; + rcTemp.bottom -= (iTabOff + _captionGapDynamic); } else { - rcTemp.left += CAPTION_GAP; - rcTemp.right -= CAPTION_GAP; + rcTemp.left += _captionGapDynamic; + rcTemp.right -= _captionGapDynamic; rcTemp.bottom -= iTabOff; } @@ -1084,7 +1089,7 @@ void DockingCont::onSize() { // resize tab if size of elements exceeds one rcTemp = rc; - rcTemp.top = rcTemp.bottom - (tabDpiDynamicalHeight + CAPTION_GAP); + rcTemp.top = rcTemp.bottom - (tabDpiDynamicalHeight + _captionGapDynamic); rcTemp.bottom = tabDpiDynamicalHeight; ::SetWindowPos(_hContTab, NULL, diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingCont.h b/PowerEditor/src/WinControls/DockingWnd/DockingCont.h index 68f600747..7f6008d68 100644 --- a/PowerEditor/src/WinControls/DockingWnd/DockingCont.h +++ b/PowerEditor/src/WinControls/DockingWnd/DockingCont.h @@ -232,6 +232,11 @@ private: BOOL _bCapTTHover; eMousePos _hoverMPos; + int _captionHeightDynamic = HIGH_CAPTION; + int _captionGapDynamic = CAPTION_GAP; + int _closeButtonPosLeftDynamic = CLOSEBTN_POS_LEFT; + int _closeButtonPosTopDynamic = CLOSEBTN_POS_TOP; + // data of added windows std::vector _vTbData; }; From af2708175964c9f5dee93906fb530eab4208c18a Mon Sep 17 00:00:00 2001 From: Damien GERARD Date: Fri, 7 Aug 2015 10:42:35 +0200 Subject: [PATCH 15/85] Updated year in copyright (#638, closes #666) --- PowerEditor/src/Notepad_plus.rc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PowerEditor/src/Notepad_plus.rc b/PowerEditor/src/Notepad_plus.rc index 945fb034c..133c68f65 100644 --- a/PowerEditor/src/Notepad_plus.rc +++ b/PowerEditor/src/Notepad_plus.rc @@ -51,7 +51,7 @@ BEGIN VALUE "FileDescription", "Notepad++ : a free (GNU) source code editor\0" VALUE "FileVersion", VERSION_VALUE VALUE "InternalName", "npp.exe\0" - VALUE "LegalCopyright", "Copyleft 1998-2013 by Don HO\0" + VALUE "LegalCopyright", "Copyleft 1998-2015 by Don HO\0" VALUE "OriginalFilename", "Notepad++.exe\0" VALUE "ProductName", "Notepad++\0" VALUE "ProductVersion", VERSION_VALUE From 01c419ae9a34c43ed6f4c865a7cd927346a2de1c Mon Sep 17 00:00:00 2001 From: Damien GERARD Date: Fri, 7 Aug 2015 10:45:33 +0200 Subject: [PATCH 16/85] Removed the no longer used OTF version of the `Source Code Pro` font (#638, #666) --- PowerEditor/bin/SourceCodePro-Regular.otf | Bin 140088 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 PowerEditor/bin/SourceCodePro-Regular.otf diff --git a/PowerEditor/bin/SourceCodePro-Regular.otf b/PowerEditor/bin/SourceCodePro-Regular.otf deleted file mode 100644 index 4e3b9d0bcd92851958b3919e84565d9cf0cc91d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 140088 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 z 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 R;nJmcnB45yX7*B^{|~|z2W9{O From 39395c39d96c5abb3db56d68cc4703183f6ec44c Mon Sep 17 00:00:00 2001 From: h-h-h-h Date: Fri, 24 Jul 2015 13:28:46 +0200 Subject: [PATCH 17/85] translation: update of German language file (closes #566) --- PowerEditor/installer/nativeLang/german.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/PowerEditor/installer/nativeLang/german.xml b/PowerEditor/installer/nativeLang/german.xml index 56213db6a..b006e9808 100644 --- a/PowerEditor/installer/nativeLang/german.xml +++ b/PowerEditor/installer/nativeLang/german.xml @@ -332,7 +332,7 @@

- + @@ -341,7 +341,7 @@ - + @@ -349,11 +349,11 @@ - + - + @@ -362,8 +362,8 @@ - - + + From b28bb9774514ca1cf49e5280280d9020f5fe6088 Mon Sep 17 00:00:00 2001 From: h-h-h-h Date: Fri, 24 Jul 2015 15:08:25 +0200 Subject: [PATCH 18/85] Reorder of escape sequences (search-and-replace dialog) (closes #574) Reorder of escape sequences to make it more clear that there's no word ellipsis, but a character ellipsis. Order of line break characters is natural order of Windows line breaks. Seldomly used \0 at the end. --- PowerEditor/installer/nativeLang/english.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PowerEditor/installer/nativeLang/english.xml b/PowerEditor/installer/nativeLang/english.xml index e17f659dc..54f1da0f3 100644 --- a/PowerEditor/installer/nativeLang/english.xml +++ b/PowerEditor/installer/nativeLang/english.xml @@ -358,7 +358,7 @@ - + From 927d7310a48abbc9bfa10725ffd838aa3be91c29 Mon Sep 17 00:00:00 2001 From: Jan Schreiber Date: Mon, 3 Aug 2015 16:08:21 +0200 Subject: [PATCH 19/85] translation:uUpdated german.xml for 6.8 (closes #635) --- PowerEditor/installer/nativeLang/german.xml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/PowerEditor/installer/nativeLang/german.xml b/PowerEditor/installer/nativeLang/german.xml index b006e9808..69ecf0111 100644 --- a/PowerEditor/installer/nativeLang/german.xml +++ b/PowerEditor/installer/nativeLang/german.xml @@ -1,8 +1,8 @@ <{>@& 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 Wf|$KNE6!b6x*=E6R96giXe9uk{qR!& diff --git a/PowerEditor/src/fonts/sourceCodePro/SourceCodePro-It.ttf b/PowerEditor/src/fonts/sourceCodePro/SourceCodePro-It.ttf deleted file mode 100644 index e7f1541e7eb0d25acb82f20bb87ea9cf0112cab0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163624 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 z 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 vO94-f9=OXS^!!zStbEhE_F2@VW3jr+cT&a~ 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%0A_ga!fgk_H{|QsoYlXD8DIo)mg2t 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 - - + + From 7198ac74588779e47a061b4e54fef7bba9020983 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Thu, 13 Aug 2015 02:25:04 +0200 Subject: [PATCH 28/85] [REMOVE] Remove Source Code Pro font from vs project file --- PowerEditor/visual.net/notepadPlus.vcxproj | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/PowerEditor/visual.net/notepadPlus.vcxproj b/PowerEditor/visual.net/notepadPlus.vcxproj index 543911a79..5ae1dc036 100644 --- a/PowerEditor/visual.net/notepadPlus.vcxproj +++ b/PowerEditor/visual.net/notepadPlus.vcxproj @@ -206,10 +206,6 @@ copy ..\src\stylers.model.xml ..\bin\stylers.model.xml copy ..\src\shortcuts.xml ..\bin\shortcuts.xml copy ..\src\functionList.xml ..\bin\functionList.xml copy ..\src\contextMenu.xml ..\bin\contextMenu.xml -copy ..\src\fonts\sourceCodePro\SourceCodePro-Regular.ttf ..\bin\SourceCodePro-Regular.ttf -copy ..\src\fonts\sourceCodePro\SourceCodePro-Bold.ttf ..\bin\SourceCodePro-Bold.ttf -copy ..\src\fonts\sourceCodePro\SourceCodePro-It.ttf ..\bin\SourceCodePro-It.ttf -copy ..\src\fonts\sourceCodePro\SourceCodePro-BoldIt.ttf ..\bin\SourceCodePro-BoldIt.ttf ..\misc\vistaIconTool\changeIcon.bat "..\misc\vistaIconTool\ChangeIcon.exe" "$(OutDir)notepad++.exe" @@ -660,4 +656,4 @@ copy ..\src\contextMenu.xml ..\bin64\contextMenu.xml - + \ No newline at end of file From f6aae43fb210bba939829215d3cfda63b809d8f6 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Thu, 13 Aug 2015 02:26:46 +0200 Subject: [PATCH 29/85] [REMOVE] Remove Source Code Pro font (forgotten file) --- PowerEditor/src/Notepad_plus.cpp | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index 89b9aedbc..4bbfba7bd 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -56,11 +56,6 @@ enum tb_stat {tb_saved, tb_unsaved, tb_ro}; #define NPP_INTERNAL_FUCTION_STR TEXT("Notepad++::InternalFunction") -#define SOURCECODEPRO_FONT TEXT("SourceCodePro-Regular.ttf") -#define SOURCECODEPRO_I_FONT TEXT("SourceCodePro-It.ttf") -#define SOURCECODEPRO_B_FONT TEXT("SourceCodePro-Bold.ttf") -#define SOURCECODEPRO_IB_FONT TEXT("SourceCodePro-BoldIt.ttf") - int docTabIconIDs[] = {IDI_SAVED_ICON, IDI_UNSAVED_ICON, IDI_READONLY_ICON}; ToolBarButtonUnit toolBarIcons[] = { @@ -197,10 +192,6 @@ Notepad_plus::~Notepad_plus() delete _pProjectPanel_3; delete _pDocMap; delete _pFuncList; - ::RemoveFontResourceEx(SOURCECODEPRO_FONT, FR_PRIVATE, 0); - ::RemoveFontResourceEx(SOURCECODEPRO_I_FONT, FR_PRIVATE, 0); - ::RemoveFontResourceEx(SOURCECODEPRO_B_FONT, FR_PRIVATE, 0); - ::RemoveFontResourceEx(SOURCECODEPRO_IB_FONT, FR_PRIVATE, 0); } LRESULT Notepad_plus::init(HWND hwnd) @@ -208,12 +199,6 @@ LRESULT Notepad_plus::init(HWND hwnd) NppParameters *pNppParam = NppParameters::getInstance(); NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); - // Add Main font - ::AddFontResourceEx(SOURCECODEPRO_FONT, FR_PRIVATE, 0); - ::AddFontResourceEx(SOURCECODEPRO_I_FONT, FR_PRIVATE, 0); - ::AddFontResourceEx(SOURCECODEPRO_B_FONT, FR_PRIVATE, 0); - ::AddFontResourceEx(SOURCECODEPRO_IB_FONT, FR_PRIVATE, 0); - // Menu _mainMenuHandle = ::GetMenu(hwnd); int langPos2BeRemoved = MENUINDEX_LANGUAGE+1; From 3fb1d96671ccf1c3e751d5d2e23a3e41b047b875 Mon Sep 17 00:00:00 2001 From: Damien GERARD Date: Fri, 14 Aug 2015 04:32:38 -0700 Subject: [PATCH 30/85] Some warning fixes --- PowerEditor/src/Notepad_plus.cpp | 53 ++-- PowerEditor/src/NppBigSwitch.cpp | 4 +- PowerEditor/src/NppCommands.cpp | 12 +- PowerEditor/src/NppIO.cpp | 5 +- PowerEditor/src/Parameters.cpp | 284 ++++++++---------- PowerEditor/src/ScitillaComponent/Buffer.cpp | 61 ++-- .../ScitillaComponent/UserDefineDialog.cpp | 24 +- .../WinControls/Preference/preferenceDlg.cpp | 11 +- PowerEditor/src/WinControls/TabBar/TabBar.cpp | 9 +- PowerEditor/src/localization.cpp | 116 +++---- PowerEditor/visual.net/notepadPlus.vcxproj | 12 +- 11 files changed, 301 insertions(+), 290 deletions(-) diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index 4bbfba7bd..41ec4885b 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -602,7 +602,7 @@ LRESULT Notepad_plus::init(HWND hwnd) _toolBar.addToRebar(&_rebarTop); _rebarTop.setIDVisible(REBAR_BAR_TOOLBAR, willBeShown); - checkMacroState(); + checkMacroState(); //--Init dialogs--// _findReplaceDlg.init(_pPublicInterface->getHinst(), hwnd, &_pEditView); @@ -621,23 +621,29 @@ LRESULT Notepad_plus::init(HWND hwnd) bool uddShow = false; switch (uddStatus) - { - case UDD_SHOW : // show & undocked + { + case UDD_SHOW: // show & undocked + { udd->doDialog(true, _nativeLangSpeaker.isRTL()); _nativeLangSpeaker.changeUserDefineLang(udd); uddShow = true; - break; - case UDD_DOCKED : { // hide & docked + break; + } + case UDD_DOCKED: // hide & docked + { _isUDDocked = true; - break;} - case (UDD_SHOW | UDD_DOCKED) : // show & docked - udd->doDialog(true, _nativeLangSpeaker.isRTL()); - _nativeLangSpeaker.changeUserDefineLang(udd); - ::SendMessage(udd->getHSelf(), WM_COMMAND, IDC_DOCK_BUTTON, 0); - uddShow = true; break; + } + case (UDD_SHOW | UDD_DOCKED) : // show & docked + { + udd->doDialog(true, _nativeLangSpeaker.isRTL()); + _nativeLangSpeaker.changeUserDefineLang(udd); + ::SendMessage(udd->getHSelf(), WM_COMMAND, IDC_DOCK_BUTTON, 0); + uddShow = true; + break; + } - default : // hide & undocked + default: // hide & undocked break; } @@ -650,19 +656,21 @@ LRESULT Notepad_plus::init(HWND hwnd) // // Initialize the default foreground & background color // - StyleArray & globalStyles = (NppParameters::getInstance())->getGlobalStylers(); - int i = globalStyles.getStylerIndexByID(STYLE_DEFAULT); - if (i != -1) { - Style & style = globalStyles.getStyler(i); - (NppParameters::getInstance())->setCurrentDefaultFgColor(style._fgColor); - (NppParameters::getInstance())->setCurrentDefaultBgColor(style._bgColor); + StyleArray & globalStyles = (NppParameters::getInstance())->getGlobalStylers(); + int i = globalStyles.getStylerIndexByID(STYLE_DEFAULT); + if (i != -1) + { + Style & style = globalStyles.getStyler(i); + (NppParameters::getInstance())->setCurrentDefaultFgColor(style._fgColor); + (NppParameters::getInstance())->setCurrentDefaultBgColor(style._bgColor); + } } // // launch the plugin dlg memorized at the last session // - DockingManagerData &dmd = nppGUI._dockingData; + DockingManagerData& dmd = nppGUI._dockingData; _dockingManager.setDockedContSize(CONT_LEFT , nppGUI._dockingData._leftWidth); _dockingManager.setDockedContSize(CONT_RIGHT , nppGUI._dockingData._rightWidth); @@ -671,17 +679,13 @@ LRESULT Notepad_plus::init(HWND hwnd) for (size_t i = 0, len = dmd._pluginDockInfo.size(); i < len ; ++i) { - PluginDlgDockingInfo & pdi = dmd._pluginDockInfo[i]; + PluginDlgDockingInfo& pdi = dmd._pluginDockInfo[i]; if (pdi._isVisible) { if (pdi._name == NPP_INTERNAL_FUCTION_STR) - { _internalFuncIDs.push_back(pdi._internalID); - } else - { _pluginsManager.runPluginCommand(pdi._name.c_str(), pdi._internalID); - } } } @@ -690,6 +694,7 @@ LRESULT Notepad_plus::init(HWND hwnd) ContainerTabInfo & cti = dmd._containerTabInfo[i]; _dockingManager.setActiveTab(cti._cont, cti._activeTab); } + //Load initial docs into doctab loadBufferIntoView(_mainEditView.getCurrentBufferID(), MAIN_VIEW); loadBufferIntoView(_subEditView.getCurrentBufferID(), SUB_VIEW); diff --git a/PowerEditor/src/NppBigSwitch.cpp b/PowerEditor/src/NppBigSwitch.cpp index 81e2b3c4b..8600b3d45 100644 --- a/PowerEditor/src/NppBigSwitch.cpp +++ b/PowerEditor/src/NppBigSwitch.cpp @@ -122,8 +122,8 @@ LRESULT Notepad_plus_Window::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPA LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { LRESULT result = FALSE; - NppParameters *pNppParam = NppParameters::getInstance(); + switch (Message) { case WM_NCACTIVATE: @@ -2042,7 +2042,6 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa case NPPM_GETAPPDATAPLUGINSALLOWED: { - NppParameters *pNppParam = NppParameters::getInstance(); const TCHAR *appDataNpp = pNppParam->getAppDataNppDir(); if (appDataNpp[0]) { @@ -2058,7 +2057,6 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa // case NPPM_INTERNAL_SETTING_HISTORY_SIZE: { - NppParameters *pNppParam = NppParameters::getInstance(); _lastRecentFileList.setUserMaxNbLRF(pNppParam->getNbMaxRecentFile()); break; } diff --git a/PowerEditor/src/NppCommands.cpp b/PowerEditor/src/NppCommands.cpp index 2f93f8b61..52a29ae3d 100644 --- a/PowerEditor/src/NppCommands.cpp +++ b/PowerEditor/src/NppCommands.cpp @@ -1856,7 +1856,7 @@ void Notepad_plus::command(int id) return; } - Buffer * buf = _pEditView->getCurrentBuffer(); + Buffer* buf = _pEditView->getCurrentBuffer(); if (buf->isDirty()) { generic_string warning, title; @@ -1884,17 +1884,13 @@ void Notepad_plus::command(int id) TEXT("Lose Undo Ability Waning"), MB_YESNO); - if (answer == IDYES) - { - // Do nothing - } - else + if (answer != IDYES) return; } - if (!buf->isDirty()) + if (not buf->isDirty()) { - Buffer *buf = _pEditView->getCurrentBuffer(); + buf = _pEditView->getCurrentBuffer(); buf->setEncoding(encoding); buf->setUnicodeMode(uniCookie); fileReload(); diff --git a/PowerEditor/src/NppIO.cpp b/PowerEditor/src/NppIO.cpp index c19410d40..8fa42ca38 100644 --- a/PowerEditor/src/NppIO.cpp +++ b/PowerEditor/src/NppIO.cpp @@ -37,6 +37,9 @@ using namespace std; + + + BufferID Notepad_plus::doOpen(const generic_string& fileName, bool isRecursive, bool isReadOnly, int encoding, const TCHAR *backupFileName, time_t fileNameTimestamp) { const rsize_t longFileNameBufferSize = MAX_PATH; // TODO stop using fixed-size buffer @@ -180,7 +183,7 @@ BufferID Notepad_plus::doOpen(const generic_string& fileName, bool isRecursive, if (buffer != BUFFER_INVALID) { - bool isSnapshotMode = backupFileName != NULL && PathFileExists(backupFileName); + bool isSnapshotMode = (backupFileName != NULL and PathFileExists(backupFileName)); if (isSnapshotMode) { // To notify plugins that a snapshot dirty file is loaded on startup diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp index 1b6397348..ed64d03b3 100644 --- a/PowerEditor/src/Parameters.cpp +++ b/PowerEditor/src/Parameters.cpp @@ -3430,8 +3430,8 @@ void NppParameters::feedKeyWordsParameters(TiXmlNode *node) { if (_nbLang < NB_LANG) { - TiXmlElement *element = langNode->ToElement(); - const TCHAR *name = element->Attribute(TEXT("name")); + TiXmlElement* element = langNode->ToElement(); + const TCHAR* name = element->Attribute(TEXT("name")); if (name) { _langList[_nbLang] = new Lang(getLangIDFromStr(name), name); @@ -3439,9 +3439,10 @@ void NppParameters::feedKeyWordsParameters(TiXmlNode *node) _langList[_nbLang]->setCommentLineSymbol(element->Attribute(TEXT("commentLine"))); _langList[_nbLang]->setCommentStart(element->Attribute(TEXT("commentStart"))); _langList[_nbLang]->setCommentEnd(element->Attribute(TEXT("commentEnd"))); - int i; - if (element->Attribute(TEXT("tabSettings"), &i)) - _langList[_nbLang]->setTabInfo(i); + + int tabSettings; + if (element->Attribute(TEXT("tabSettings"), &tabSettings)) + _langList[_nbLang]->setTabInfo(tabSettings); for (TiXmlNode *kwNode = langNode->FirstChildElement(TEXT("Keywords")); kwNode ; @@ -3471,21 +3472,21 @@ typedef DWORD (WINAPI * EESFUNC) (LPCTSTR, LPTSTR, DWORD); void NppParameters::feedGUIParameters(TiXmlNode *node) { TiXmlNode *GUIRoot = node->FirstChildElement(TEXT("GUIConfigs")); - if (!GUIRoot) return; + if (nullptr == GUIRoot) + return; for (TiXmlNode *childNode = GUIRoot->FirstChildElement(TEXT("GUIConfig")); childNode ; childNode = childNode->NextSibling(TEXT("GUIConfig")) ) { - TiXmlElement *element = childNode->ToElement(); - const TCHAR *nm = element->Attribute(TEXT("name")); - if (!nm) continue; - - const TCHAR *val; + TiXmlElement* element = childNode->ToElement(); + const TCHAR* nm = element->Attribute(TEXT("name")); + if (nullptr == nm) + continue; if (!lstrcmp(nm, TEXT("ToolBar"))) { - val = element->Attribute(TEXT("visible")); + const TCHAR* val = element->Attribute(TEXT("visible")); if (val) { if (!lstrcmp(val, TEXT("no"))) @@ -3513,7 +3514,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) TiXmlNode *n = childNode->FirstChild(); if (n) { - val = n->Value(); + const TCHAR* val = n->Value(); if (val) { if (!lstrcmp(val, TEXT("hide"))) @@ -3528,7 +3529,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) TiXmlNode *n = childNode->FirstChild(); if (n) { - val = n->Value(); + const TCHAR* val = n->Value(); if (val) { if (!lstrcmp(val, TEXT("hide"))) @@ -3542,7 +3543,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) { bool isFailed = false; int oldValue = _nppGUI._tabStatus; - val = element->Attribute(TEXT("dragAndDrop")); + const TCHAR* val = element->Attribute(TEXT("dragAndDrop")); if (val) { if (!lstrcmp(val, TEXT("yes"))) @@ -3648,7 +3649,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) TiXmlNode *n = childNode->FirstChild(); if (n) { - val = n->Value(); + const TCHAR* val = n->Value(); if (val) { if (!lstrcmp(val, TEXT("yes"))) @@ -3672,7 +3673,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) TiXmlNode *n = childNode->FirstChild(); if (n) { - val = n->Value(); + const TCHAR* val = n->Value(); if (val) { if (!lstrcmp(val, TEXT("yes"))) @@ -3685,7 +3686,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) TiXmlNode *n = childNode->FirstChild(); if (n) { - val = n->Value(); + const TCHAR* val = n->Value(); if (val) { if (!lstrcmp(val, TEXT("yes"))) @@ -3700,7 +3701,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) TiXmlNode *n = childNode->FirstChild(); if (n) { - val = n->Value(); + const TCHAR* val = n->Value(); if (val) { if (!lstrcmp(val, TEXT("yes"))) @@ -3715,7 +3716,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) TiXmlNode *n = childNode->FirstChild(); if (n) { - val = n->Value(); + const TCHAR* val = n->Value(); if (val) { if (!lstrcmp(val, TEXT("yes"))) @@ -3731,7 +3732,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) TiXmlNode *n = childNode->FirstChild(); if (n) { - val = n->Value(); + const TCHAR* val = n->Value(); if (val) { if (!lstrcmp(val, TEXT("yes"))) @@ -3747,7 +3748,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) TiXmlNode *n = childNode->FirstChild(); if (n) { - val = n->Value(); + const TCHAR* val = n->Value(); if (val) { if (!lstrcmp(val, TEXT("yes"))) @@ -3763,16 +3764,16 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) TiXmlNode *n = childNode->FirstChild(); if (n) { - val = n->Value(); + const TCHAR* val = n->Value(); if (val) { _nppGUI._enableTagsMatchHilite = !lstrcmp(val, TEXT("yes")); const TCHAR *tahl = element->Attribute(TEXT("TagAttrHighLight")); - if (tahl) + if (tahl) _nppGUI._enableTagAttrsHilite = !lstrcmp(tahl, TEXT("yes")); tahl = element->Attribute(TEXT("HighLightNonHtmlZone")); - if (tahl) + if (tahl) _nppGUI._enableHiliteNonHTMLZone = !lstrcmp(tahl, TEXT("yes")); } } @@ -3783,7 +3784,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) TiXmlNode *n = childNode->FirstChild(); if (n) { - val = n->Value(); + const TCHAR* val = n->Value(); if (val) { _nppGUI._doTaskList = (!lstrcmp(val, TEXT("yes")))?true:false; @@ -3792,15 +3793,13 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) } else if (!lstrcmp(nm, TEXT("MRU"))) - { + { TiXmlNode *n = childNode->FirstChild(); if (n) { - val = n->Value(); + const TCHAR* val = n->Value(); if (val) - { - _nppGUI._styleMRU = (!lstrcmp(val, TEXT("yes")))?true:false; - } + _nppGUI._styleMRU = (!lstrcmp(val, TEXT("yes"))); } } @@ -3809,7 +3808,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) TiXmlNode *n = childNode->FirstChild(); if (n) { - val = n->Value(); + const TCHAR* val = n->Value(); if (val) { if (!lstrcmp(val, TEXT("1"))) @@ -3827,7 +3826,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) TiXmlNode *n = childNode->FirstChild(); if (n) { - val = n->Value(); + const TCHAR* val = n->Value(); if (val) { if (!lstrcmp(val, TEXT("no"))) @@ -3840,7 +3839,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) TiXmlNode *n = childNode->FirstChild(); if (n) { - val = n->Value(); + const TCHAR* val = n->Value(); if (val) { if (!lstrcmp(val, TEXT("vertical"))) @@ -3858,25 +3857,26 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) TiXmlNode *n = childNode->FirstChild(); if (n) { - val = n->Value(); - if (val) + const TCHAR* val = n->Value(); + if (val) { if (!lstrcmp(val, TEXT("hide"))) _nppGUI._userDefineDlgStatus = 0; else if (!lstrcmp(val, TEXT("show"))) _nppGUI._userDefineDlgStatus = UDD_SHOW; - else + else isFailed = true; } } - val = element->Attribute(TEXT("position")); - if (val) + + const TCHAR* val = element->Attribute(TEXT("position")); + if (val) { if (!lstrcmp(val, TEXT("docked"))) _nppGUI._userDefineDlgStatus |= UDD_DOCKED; else if (!lstrcmp(val, TEXT("undocked"))) _nppGUI._userDefineDlgStatus |= 0; - else + else isFailed = true; } if (isFailed) @@ -3885,7 +3885,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) else if (!lstrcmp(nm, TEXT("TabSetting"))) { int i; - val = element->Attribute(TEXT("size"), &i); + const TCHAR* val = element->Attribute(TEXT("size"), &i); if (val) _nppGUI._tabSize = i; @@ -3900,7 +3900,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) else if (!lstrcmp(nm, TEXT("Caret"))) { int i; - val = element->Attribute(TEXT("width"), &i); + const TCHAR* val = element->Attribute(TEXT("width"), &i); if (val) _nppGUI._caretWidth = i; @@ -3911,7 +3911,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) else if (!lstrcmp(nm, TEXT("ScintillaGlobalSettings"))) { - val = element->Attribute(TEXT("enableMultiSelection")); + const TCHAR* val = element->Attribute(TEXT("enableMultiSelection")); if (val && lstrcmp(val, TEXT("yes")) == 0) _nppGUI._enableMultiSelection = true; } @@ -3945,11 +3945,9 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) if (fuckUp) _nppGUI._appPos = oldRect; - val = element->Attribute(TEXT("isMaximized")); + const TCHAR* val = element->Attribute(TEXT("isMaximized")); if (val) - { _nppGUI._isMaximized = (lstrcmp(val, TEXT("yes")) == 0); - } } else if (!lstrcmp(nm, TEXT("NewDocDefaultSettings"))) { @@ -3966,13 +3964,14 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) if (element->Attribute(TEXT("codepage"), &i)) _nppGUI._newDocDefaultSettings._codepage = (LangType)i; - val = element->Attribute(TEXT("openAnsiAsUTF8")); + const TCHAR* val = element->Attribute(TEXT("openAnsiAsUTF8")); if (val) _nppGUI._newDocDefaultSettings._openAnsiAsUtf8 = (lstrcmp(val, TEXT("yes")) == 0); } else if (!lstrcmp(nm, TEXT("langsExcluded"))) { + // TODO int g0 = 0; // up to 8 int g1 = 0; // up to 16 int g2 = 0; // up to 24 @@ -3983,37 +3982,57 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) int g7 = 0; // up to 64 const int nbMax = 64; - int i; - if (element->Attribute(TEXT("gr0"), &i)) - if (i <= 255) - g0 = i; - if (element->Attribute(TEXT("gr1"), &i)) - if (i <= 255) - g1 = i; - if (element->Attribute(TEXT("gr2"), &i)) - if (i <= 255) - g2 = i; - if (element->Attribute(TEXT("gr3"), &i)) - if (i <= 255) - g3 = i; - if (element->Attribute(TEXT("gr4"), &i)) - if (i <= 255) - g4 = i; - if (element->Attribute(TEXT("gr5"), &i)) - if (i <= 255) - g5 = i; - if (element->Attribute(TEXT("gr6"), &i)) - if (i <= 255) - g6 = i; - if (element->Attribute(TEXT("gr7"), &i)) - if (i <= 255) - g7 = i; + // TODO some refactoring needed here.... + { + int i; + if (element->Attribute(TEXT("gr0"), &i)) + { + if (i <= 255) + g0 = i; + } + if (element->Attribute(TEXT("gr1"), &i)) + { + if (i <= 255) + g1 = i; + } + if (element->Attribute(TEXT("gr2"), &i)) + { + if (i <= 255) + g2 = i; + } + if (element->Attribute(TEXT("gr3"), &i)) + { + if (i <= 255) + g3 = i; + } + if (element->Attribute(TEXT("gr4"), &i)) + { + if (i <= 255) + g4 = i; + } + if (element->Attribute(TEXT("gr5"), &i)) + { + if (i <= 255) + g5 = i; + } + if (element->Attribute(TEXT("gr6"), &i)) + { + if (i <= 255) + g6 = i; + } + if (element->Attribute(TEXT("gr7"), &i)) + { + if (i <= 255) + g7 = i; + } + } bool langArray[nbMax]; - for (int i = 0 ; i < nbMax ; ++i) langArray[i] = false; - + for (int i = 0 ; i < nbMax ; ++i) + langArray[i] = false; + UCHAR mask = 1; - for (int i = 0 ; i < 8 ; ++i) + for (int i = 0 ; i < 8 ; ++i) { if (mask & g0) _nppGUI._excludedLangList.push_back(LangMenuItem((LangType)i)); @@ -4021,7 +4040,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) } mask = 1; - for (int i = 8 ; i < 16 ; ++i) + for (int i = 8 ; i < 16 ; ++i) { if (mask & g1) _nppGUI._excludedLangList.push_back(LangMenuItem((LangType)i)); @@ -4029,7 +4048,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) } mask = 1; - for (int i = 16 ; i < 24 ; ++i) + for (int i = 16 ; i < 24 ; ++i) { if (mask & g2) _nppGUI._excludedLangList.push_back(LangMenuItem((LangType)i)); @@ -4037,7 +4056,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) } mask = 1; - for (int i = 24 ; i < 32 ; ++i) + for (int i = 24 ; i < 32 ; ++i) { if (mask & g3) _nppGUI._excludedLangList.push_back(LangMenuItem((LangType)i)); @@ -4045,7 +4064,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) } mask = 1; - for (int i = 32 ; i < 40 ; ++i) + for (int i = 32 ; i < 40 ; ++i) { if (mask & g4) _nppGUI._excludedLangList.push_back(LangMenuItem((LangType)i)); @@ -4053,7 +4072,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) } mask = 1; - for (int i = 40 ; i < 48 ; ++i) + for (int i = 40 ; i < 48 ; ++i) { if (mask & g5) _nppGUI._excludedLangList.push_back(LangMenuItem((LangType)i)); @@ -4061,7 +4080,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) } mask = 1; - for (int i = 48 ; i < 56 ; ++i) + for (int i = 48 ; i < 56 ; ++i) { if (mask & g6) _nppGUI._excludedLangList.push_back(LangMenuItem((LangType)i)); @@ -4069,21 +4088,21 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) } mask = 1; - for (int i = 56 ; i < 64 ; ++i) + for (int i = 56 ; i < 64 ; ++i) { if (mask & g7) _nppGUI._excludedLangList.push_back(LangMenuItem((LangType)i)); mask <<= 1; } - - val = element->Attribute(TEXT("langMenuCompact")); + + const TCHAR* val = element->Attribute(TEXT("langMenuCompact")); if (val) _nppGUI._isLangMenuCompact = (!lstrcmp(val, TEXT("yes"))); } else if (!lstrcmp(nm, TEXT("Print"))) { - val = element->Attribute(TEXT("lineNumber")); + const TCHAR* val = element->Attribute(TEXT("lineNumber")); if (val) _nppGUI._printSettings._printLineNumber = (!lstrcmp(val, TEXT("yes"))); @@ -4163,14 +4182,14 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) _nppGUI._backup = (BackupFeature)i; const TCHAR *bDir = element->Attribute(TEXT("useCustumDir")); - if (bDir && !lstrcmp(bDir, TEXT("yes"))) + if (bDir && !lstrcmp(bDir, TEXT("yes"))) { _nppGUI._useDir = true; } const TCHAR *pDir = element->Attribute(TEXT("dir")); if (pDir) _nppGUI._backupDir = pDir; - + const TCHAR *isSnapshotModeStr = element->Attribute(TEXT("isSnapshotMode")); if (isSnapshotModeStr && !lstrcmp(isSnapshotModeStr, TEXT("no"))) _nppGUI._isSnapshotMode = false; @@ -4184,50 +4203,38 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) { feedDockingManager(element); } - + else if (!lstrcmp(nm, TEXT("globalOverride"))) { const TCHAR *bDir = element->Attribute(TEXT("fg")); - if (bDir && !lstrcmp(bDir, TEXT("yes"))) + if (bDir && !lstrcmp(bDir, TEXT("yes"))) { _nppGUI._globalOverride.enableFg = true; } bDir = element->Attribute(TEXT("bg")); - if (bDir && !lstrcmp(bDir, TEXT("yes"))) - { + if (bDir && !lstrcmp(bDir, TEXT("yes"))) _nppGUI._globalOverride.enableBg = true; - } bDir = element->Attribute(TEXT("font")); - if (bDir && !lstrcmp(bDir, TEXT("yes"))) - { + if (bDir && !lstrcmp(bDir, TEXT("yes"))) _nppGUI._globalOverride.enableFont = true; - } bDir = element->Attribute(TEXT("fontSize")); - if (bDir && !lstrcmp(bDir, TEXT("yes"))) - { + if (bDir && !lstrcmp(bDir, TEXT("yes"))) _nppGUI._globalOverride.enableFontSize = true; - } bDir = element->Attribute(TEXT("bold")); - if (bDir && !lstrcmp(bDir, TEXT("yes"))) - { + if (bDir && !lstrcmp(bDir, TEXT("yes"))) _nppGUI._globalOverride.enableBold = true; - } bDir = element->Attribute(TEXT("italic")); - if (bDir && !lstrcmp(bDir, TEXT("yes"))) - { + if (bDir && !lstrcmp(bDir, TEXT("yes"))) _nppGUI._globalOverride.enableItalic = true; - } bDir = element->Attribute(TEXT("underline")); - if (bDir && !lstrcmp(bDir, TEXT("yes"))) - { + if (bDir && !lstrcmp(bDir, TEXT("yes"))) _nppGUI._globalOverride.enableUnderLine = true; - } } else if (!lstrcmp(nm, TEXT("auto-completion"))) { @@ -4239,48 +4246,34 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) _nppGUI._autocFromLen = i; const TCHAR * funcParams = element->Attribute(TEXT("funcParams")); - if (funcParams && !lstrcmp(funcParams, TEXT("yes"))) - { + if (funcParams && !lstrcmp(funcParams, TEXT("yes"))) _nppGUI._funcParams = true; - } } else if (!lstrcmp(nm, TEXT("auto-insert"))) { const TCHAR * optName = element->Attribute(TEXT("htmlXmlTag")); - if (optName && !lstrcmp(optName, TEXT("yes"))) - { + if (optName && !lstrcmp(optName, TEXT("yes"))) _nppGUI._matchedPairConf._doHtmlXmlTag = true; - } optName = element->Attribute(TEXT("parentheses")); - if (optName && !lstrcmp(optName, TEXT("yes"))) - { + if (optName && !lstrcmp(optName, TEXT("yes"))) _nppGUI._matchedPairConf._doParentheses = true; - } optName = element->Attribute(TEXT("brackets")); - if (optName && !lstrcmp(optName, TEXT("yes"))) - { + if (optName && !lstrcmp(optName, TEXT("yes"))) _nppGUI._matchedPairConf._doBrackets = true; - } optName = element->Attribute(TEXT("curlyBrackets")); - if (optName && !lstrcmp(optName, TEXT("yes"))) - { + if (optName && !lstrcmp(optName, TEXT("yes"))) _nppGUI._matchedPairConf._doCurlyBrackets = true; - } optName = element->Attribute(TEXT("quotes")); - if (optName && !lstrcmp(optName, TEXT("yes"))) - { + if (optName && !lstrcmp(optName, TEXT("yes"))) _nppGUI._matchedPairConf._doQuotes = true; - } optName = element->Attribute(TEXT("doubleQuotes")); - if (optName && !lstrcmp(optName, TEXT("yes"))) - { + if (optName && !lstrcmp(optName, TEXT("yes"))) _nppGUI._matchedPairConf._doDoubleQuotes = true; - } for (TiXmlNode *subChildNode = childNode->FirstChildElement(TEXT("UserDefinePair")); subChildNode; @@ -4290,22 +4283,16 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) int openVal = 0; const TCHAR *openValStr = (subChildNode->ToElement())->Attribute(TEXT("open"), &openVal); if (openValStr && (openVal >= 0 && openVal < 128)) - { open = openVal; - } int close = -1; int closeVal = 0; const TCHAR *closeValStr = (subChildNode->ToElement())->Attribute(TEXT("close"), &closeVal); if (closeValStr && (closeVal >= 0 && closeVal <= 128)) - { close = closeVal; - } if (open != -1 && close != -1) - { _nppGUI._matchedPairConf._matchedPairsInit.push_back(pair(char(open), char(close))); - } } } else if (!lstrcmp(nm, TEXT("sessionExt"))) @@ -4313,7 +4300,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) TiXmlNode *n = childNode->FirstChild(); if (n) { - val = n->Value(); + const TCHAR* val = n->Value(); if (val) _nppGUI._definedSessionExt = val; } @@ -4323,24 +4310,18 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) TiXmlNode *n = childNode->FirstChild(); if (n) { - val = n->Value(); + const TCHAR* val = n->Value(); if (val) - { _nppGUI._autoUpdateOpt._doAutoUpdate = (!lstrcmp(val, TEXT("yes")))?false:true; - } - + int i; val = element->Attribute(TEXT("intervalDays"), &i); if (val) - { _nppGUI._autoUpdateOpt._intervalDays = i; - } val = element->Attribute(TEXT("nextUpdateDate")); if (val) - { _nppGUI._autoUpdateOpt._nextUpdateDate = Date(val); - } } } else if (!lstrcmp(nm, TEXT("openSaveDir"))) @@ -4355,6 +4336,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) else _nppGUI._openSaveDir = dir_followCurrent; } + const TCHAR * path = element->Attribute(TEXT("defaultDirPath")); if (path && path[0]) { @@ -4409,27 +4391,23 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) else if (!lstrcmp(nm, TEXT("MISC"))) { const TCHAR * optName = element->Attribute(TEXT("fileSwitcherWithoutExtColumn")); - if (optName && !lstrcmp(optName, TEXT("yes"))) - { + if (optName && !lstrcmp(optName, TEXT("yes"))) _nppGUI._fileSwitcherWithoutExtColumn = true; - } const TCHAR * optNameBackSlashEscape = element->Attribute(TEXT("backSlashIsEscapeCharacterForSql")); - if (optNameBackSlashEscape && !lstrcmp(optNameBackSlashEscape, TEXT("no"))) - { + if (optNameBackSlashEscape && !lstrcmp(optNameBackSlashEscape, TEXT("no"))) _nppGUI._backSlashIsEscapeCharacterForSql = false; - } } } } void NppParameters::feedScintillaParam(TiXmlNode *node) { - TiXmlElement *element = node->ToElement(); + TiXmlElement* element = node->ToElement(); // Line Number Margin const TCHAR *nm = element->Attribute(TEXT("lineNumberMargin")); - if (nm) + if (nm) { if (!lstrcmp(nm, TEXT("show"))) _svp._lineNumberMarginShow = true; @@ -4439,7 +4417,7 @@ void NppParameters::feedScintillaParam(TiXmlNode *node) // Bookmark Margin nm = element->Attribute(TEXT("bookMarkMargin")); - if (nm) + if (nm) { if (!lstrcmp(nm, TEXT("show"))) @@ -4448,7 +4426,7 @@ void NppParameters::feedScintillaParam(TiXmlNode *node) _svp._bookMarkMarginShow = false; } - // Indent GuideLine + // Indent GuideLine nm = element->Attribute(TEXT("indentGuideLine")); if (nm) { diff --git a/PowerEditor/src/ScitillaComponent/Buffer.cpp b/PowerEditor/src/ScitillaComponent/Buffer.cpp index 43df4e632..3a36698e6 100644 --- a/PowerEditor/src/ScitillaComponent/Buffer.cpp +++ b/PowerEditor/src/ScitillaComponent/Buffer.cpp @@ -1246,7 +1246,6 @@ inline bool FileManager::loadFileData(Document doc, const TCHAR * filename, char } _pscratchTilla->execute(SCI_CLEARALL); - WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); if (language < L_EXTERNAL) { @@ -1256,28 +1255,30 @@ inline bool FileManager::loadFileData(Document doc, const TCHAR * filename, char { int id = language - L_EXTERNAL; TCHAR * name = NppParameters::getInstance()->getELCFromIndex(id)._name; + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); const char *pName = wmc->wchar2char(name, CP_ACP); _pscratchTilla->execute(SCI_SETLEXERLANGUAGE, 0, (LPARAM)pName); } if (encoding != -1) - { _pscratchTilla->execute(SCI_SETCODEPAGE, SC_CP_UTF8); - } bool success = true; int format = -1; - __try { + __try + { // First allocate enough memory for the whole file (this will reduce memory copy during loading) _pscratchTilla->execute(SCI_ALLOCATE, WPARAM(bufferSizeRequested)); - if(_pscratchTilla->execute(SCI_GETSTATUS) != SC_STATUS_OK) throw; + if (_pscratchTilla->execute(SCI_GETSTATUS) != SC_STATUS_OK) + throw; size_t lenFile = 0; size_t lenConvert = 0; //just in case conversion results in 0, but file not empty bool isFirstTime = true; int incompleteMultibyteChar = 0; - do { + do + { lenFile = fread(data+incompleteMultibyteChar, 1, blockSize-incompleteMultibyteChar, fp) + incompleteMultibyteChar; if (lenFile == 0) break; @@ -1307,7 +1308,7 @@ inline bool FileManager::loadFileData(Document doc, const TCHAR * filename, char } else { - WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + WcharMbcsConvertor* wmc = WcharMbcsConvertor::getInstance(); int newDataLen = 0; const char *newData = wmc->encode(encoding, SC_CP_UTF8, data, lenFile, &newDataLen, &incompleteMultibyteChar); _pscratchTilla->execute(SCI_APPENDTEXT, newDataLen, (LPARAM)newData); @@ -1321,40 +1322,47 @@ inline bool FileManager::loadFileData(Document doc, const TCHAR * filename, char lenConvert = UnicodeConvertor->convert(data, lenFile); _pscratchTilla->execute(SCI_APPENDTEXT, lenConvert, (LPARAM)(UnicodeConvertor->getNewBuf())); } - if(_pscratchTilla->execute(SCI_GETSTATUS) != SC_STATUS_OK) throw; - if(incompleteMultibyteChar != 0) + if (_pscratchTilla->execute(SCI_GETSTATUS) != SC_STATUS_OK) + throw; + + if (incompleteMultibyteChar != 0) { // copy bytes to next buffer memcpy(data, data+blockSize-incompleteMultibyteChar, incompleteMultibyteChar); } - } while (lenFile > 0); - } __except(EXCEPTION_EXECUTE_HANDLER) { //TODO: should filter correctly for other exceptions; the old filter(GetExceptionCode(), GetExceptionInformation()) was only catching access violations + } + while (lenFile > 0); + } + __except(EXCEPTION_EXECUTE_HANDLER) //TODO: should filter correctly for other exceptions; the old filter(GetExceptionCode(), GetExceptionInformation()) was only catching access violations + { ::MessageBox(NULL, TEXT("File is too big to be opened by Notepad++"), TEXT("File open problem"), MB_OK|MB_APPLMODAL); success = false; } fclose(fp); - if (pFormat != NULL) - { - *pFormat = (format == -1)?WIN_FORMAT:(formatType)format; - } + if (pFormat != nullptr) + *pFormat = (format == -1) ? WIN_FORMAT : (formatType)format; + _pscratchTilla->execute(SCI_EMPTYUNDOBUFFER); _pscratchTilla->execute(SCI_SETSAVEPOINT); - if (ro) { + + if (ro) _pscratchTilla->execute(SCI_SETREADONLY, true); - } + _pscratchTilla->execute(SCI_SETDOCPOINTER, 0, _scratchDocDefault); return success; } -BufferID FileManager::getBufferFromName(const TCHAR * name) + +BufferID FileManager::getBufferFromName(const TCHAR* name) { TCHAR fullpath[MAX_PATH]; ::GetFullPathName(name, MAX_PATH, fullpath, NULL); ::GetLongPathName(fullpath, fullpath, MAX_PATH); + for(size_t i = 0; i < _buffers.size(); i++) { if (!lstrcmpi(name, _buffers.at(i)->getFullPathName())) @@ -1363,15 +1371,20 @@ BufferID FileManager::getBufferFromName(const TCHAR * name) return BUFFER_INVALID; } -BufferID FileManager::getBufferFromDocument(Document doc) { - for(size_t i = 0; i < _nrBufs; ++i) { + +BufferID FileManager::getBufferFromDocument(Document doc) +{ + for (size_t i = 0; i < _nrBufs; ++i) + { if (_buffers[i]->_doc == doc) return _buffers[i]->_id; } return BUFFER_INVALID; } -bool FileManager::createEmptyFile(const TCHAR * path) { + +bool FileManager::createEmptyFile(const TCHAR * path) +{ FILE * file = generic_fopen(path, TEXT("wb")); if (!file) return false; @@ -1379,15 +1392,19 @@ bool FileManager::createEmptyFile(const TCHAR * path) { return true; } -int FileManager::getFileNameFromBuffer(BufferID id, TCHAR * fn2copy) { + +int FileManager::getFileNameFromBuffer(BufferID id, TCHAR * fn2copy) +{ if (getBufferIndexByID(id) == -1) return -1; + Buffer* buf = getBufferByID(id); if (fn2copy) lstrcpy(fn2copy, buf->getFullPathName()); return lstrlen(buf->getFullPathName()); } + int FileManager::docLength(Buffer* buffer) const { _pscratchTilla->execute(SCI_SETDOCPOINTER, 0, buffer->_doc); diff --git a/PowerEditor/src/ScitillaComponent/UserDefineDialog.cpp b/PowerEditor/src/ScitillaComponent/UserDefineDialog.cpp index 1c441633c..c0270a873 100644 --- a/PowerEditor/src/ScitillaComponent/UserDefineDialog.cpp +++ b/PowerEditor/src/ScitillaComponent/UserDefineDialog.cpp @@ -1037,9 +1037,11 @@ void UserDefineDialog::updateDlg() _symbolsStyleDlg.updateDlg(); } + INT_PTR CALLBACK UserDefineDialog::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) { NppParameters *pNppParam = NppParameters::getInstance(); + switch (message) { case WM_INITDIALOG : @@ -1130,7 +1132,7 @@ INT_PTR CALLBACK UserDefineDialog::run_dlgProc(UINT message, WPARAM wParam, LPAR return TRUE; } - case WM_NOTIFY : + case WM_NOTIFY: { NMHDR *nmhdr = (NMHDR *)lParam; if (nmhdr->code == TCN_SELCHANGE) @@ -1144,7 +1146,7 @@ INT_PTR CALLBACK UserDefineDialog::run_dlgProc(UINT message, WPARAM wParam, LPAR break; } - case WM_HSCROLL : + case WM_HSCROLL: { if ((HWND)lParam == ::GetDlgItem(_hSelf, IDC_UD_PERCENTAGE_SLIDER)) { @@ -1211,10 +1213,13 @@ INT_PTR CALLBACK UserDefineDialog::run_dlgProc(UINT message, WPARAM wParam, LPAR ::SendMessage(_hParent, msg, 0, 0); return TRUE; } - case IDCANCEL : - ::SendMessage(_hParent, WM_CLOSE_USERDEFINE_DLG, 0, 0); - display(false); - return TRUE; + + case IDCANCEL: + { + ::SendMessage(_hParent, WM_CLOSE_USERDEFINE_DLG, 0, 0); + display(false); + return TRUE; + } case IDC_REMOVELANG_BUTTON : { @@ -1327,8 +1332,6 @@ INT_PTR CALLBACK UserDefineDialog::run_dlgProc(UINT message, WPARAM wParam, LPAR } case IDC_IMPORT_BUTTON : { - NppParameters *pNppParam = NppParameters::getInstance(); - FileDialog fDlg(_hSelf, ::GetModuleHandle(NULL)); fDlg.setExtFilter(TEXT("UDL"), TEXT(".xml"), NULL); TCHAR *fn = fDlg.doOpenSingleFileDlg(); @@ -1353,10 +1356,7 @@ INT_PTR CALLBACK UserDefineDialog::run_dlgProc(UINT message, WPARAM wParam, LPAR case IDC_EXPORT_BUTTON : { - NppParameters *pNppParam = NppParameters::getInstance(); - - int i2Export = ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_GETCURSEL, 0, 0); - + int i2Export = ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_GETCURSEL, 0, 0); if (i2Export == 0) { // maybe a better option would be to simply send IDC_SAVEAS_BUTTON message, and display "Save As..." dialog? diff --git a/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp index 9315eb317..30e93b1c9 100644 --- a/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp +++ b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp @@ -1138,10 +1138,10 @@ INT_PTR CALLBACK DefaultNewDocDlg::run_dlgProc(UINT Message, WPARAM wParam, LPAR default : //uni8Bit ID2Check = IDC_RADIO_ANSI; } - + int selIndex = -1; generic_string str; - EncodingMapper *em = EncodingMapper::getInstance(); + EncodingMapper* em = EncodingMapper::getInstance(); for (size_t i = 0, encodingArraySize = sizeof(encodings)/sizeof(int) ; i < encodingArraySize ; ++i) { int cmdID = em->getIndexFromEncoding(encodings[i]); @@ -1165,14 +1165,15 @@ INT_PTR CALLBACK DefaultNewDocDlg::run_dlgProc(UINT Message, WPARAM wParam, LPAR ID2Check = IDC_RADIO_OTHERCP; ::SendDlgItemMessage(_hSelf, IDC_COMBO_OTHERCP, CB_SETCURSEL, selIndex, 0); } + ::SendDlgItemMessage(_hSelf, ID2Check, BM_SETCHECK, BST_CHECKED, 0); ::SendDlgItemMessage(_hSelf, IDC_CHECK_OPENANSIASUTF8, BM_SETCHECK, (ID2Check == IDC_RADIO_UTF8SANSBOM && ndds._openAnsiAsUtf8)?BST_CHECKED:BST_UNCHECKED, 0); ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_OPENANSIASUTF8), ID2Check == IDC_RADIO_UTF8SANSBOM); - + int index = 0; for (int i = L_TEXT ; i < pNppParam->L_END ; ++i) { - generic_string str; + str.clear(); if ((LangType)i != L_USER) { int cmdID = pNppParam->langTypeToCommandID((LangType)i); @@ -1199,7 +1200,7 @@ INT_PTR CALLBACK DefaultNewDocDlg::run_dlgProc(UINT Message, WPARAM wParam, LPAR enableDlgTheme(_hSelf, ETDT_ENABLETAB); } - case WM_COMMAND : + case WM_COMMAND: switch (wParam) { case IDC_RADIO_UCS2BIG: diff --git a/PowerEditor/src/WinControls/TabBar/TabBar.cpp b/PowerEditor/src/WinControls/TabBar/TabBar.cpp index 110cc0f64..cb5f38883 100644 --- a/PowerEditor/src/WinControls/TabBar/TabBar.cpp +++ b/PowerEditor/src/WinControls/TabBar/TabBar.cpp @@ -800,19 +800,18 @@ void TabBarPlus::drawItem(DRAWITEMSTRUCT *pDrawItemStruct) if (hImgLst && tci.iImage >= 0) { IMAGEINFO info; - int yPos = 0, xPos = 0; - int marge = 0; - ImageList_GetImageInfo(hImgLst, tci.iImage, &info); - RECT & imageRect = info.rcImage; + RECT& imageRect = info.rcImage; + int yPos = 0; + int xPos = 0; if (_isVertical) xPos = (rect.left + (rect.right - rect.left) / 2 + NppParameters::getInstance()->_dpiManager.scaleX(2)) - (imageRect.right - imageRect.left) / 2; else yPos = (rect.top + (rect.bottom - rect.top) / 2 + (isSelected ? 0 : NppParameters::getInstance()->_dpiManager.scaleX(2))) - (imageRect.bottom - imageRect.top) / 2; - marge = spaceUnit; + int marge = spaceUnit; if (_isVertical) { diff --git a/PowerEditor/src/localization.cpp b/PowerEditor/src/localization.cpp index bba4ca21d..11877bb5b 100644 --- a/PowerEditor/src/localization.cpp +++ b/PowerEditor/src/localization.cpp @@ -219,16 +219,23 @@ MenuPosition & getMenuPosition(const char *id) void NativeLangSpeaker::changeMenuLang(HMENU menuHandle, generic_string & pluginsTrans, generic_string & windowTrans) { - if (!_nativeLangA) return; - TiXmlNodeA *mainMenu = _nativeLangA->FirstChild("Menu"); - if (!mainMenu) return; - mainMenu = mainMenu->FirstChild("Main"); - if (!mainMenu) return; - TiXmlNodeA *entriesRoot = mainMenu->FirstChild("Entries"); - if (!entriesRoot) return; - const char *idName = NULL; + if (nullptr == _nativeLangA) + return; - WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + TiXmlNodeA *mainMenu = _nativeLangA->FirstChild("Menu"); + if (nullptr == mainMenu) + return; + + mainMenu = mainMenu->FirstChild("Main"); + if (nullptr == mainMenu) + return; + + TiXmlNodeA *entriesRoot = mainMenu->FirstChild("Entries"); + if (nullptr == entriesRoot) + return; + + const char* idName = nullptr; + WcharMbcsConvertor* wmc = WcharMbcsConvertor::getInstance(); for (TiXmlNodeA *childNode = entriesRoot->FirstChildElement("Item"); childNode ; @@ -246,7 +253,7 @@ void NativeLangSpeaker::changeMenuLang(HMENU menuHandle, generic_string & plugin ::ModifyMenu(menuHandle, menuPos._x, MF_BYPOSITION, 0, nameW); } } - else + else { idName = element->Attribute("idName"); if (idName) @@ -286,24 +293,24 @@ void NativeLangSpeaker::changeMenuLang(HMENU menuHandle, generic_string & plugin childNode ; childNode = childNode->NextSibling("Item") ) { - TiXmlElementA *element = childNode->ToElement(); - int x, y, z; + TiXmlElementA* element = childNode->ToElement(); //const char *xStr = element->Attribute("posX", &x); //const char *yStr = element->Attribute("posY", &y); - const char *subMenuIdStr = element->Attribute("subMenuId"); - const char *name = element->Attribute("name"); + const char* subMenuIdStr = element->Attribute("subMenuId"); + const char* name = element->Attribute("name"); - if (!subMenuIdStr || !name) + if (nullptr == subMenuIdStr or nullptr == name) continue; - MenuPosition & menuPos = getMenuPosition(subMenuIdStr); - x = menuPos._x; - y = menuPos._y; - z = menuPos._z; + MenuPosition& menuPos = getMenuPosition(subMenuIdStr); + int x = menuPos._x; + int y = menuPos._y; + int z = menuPos._z; HMENU hSubMenu = ::GetSubMenu(menuHandle, x); if (!hSubMenu) continue; + HMENU hSubMenu2 = ::GetSubMenu(hSubMenu, y); if (!hSubMenu2) continue; @@ -326,42 +333,45 @@ void NativeLangSpeaker::changeMenuLang(HMENU menuHandle, generic_string & plugin } } -int tabContextMenuItemPos[] = { -0, // 0 : Close -1, // 1 : Close ALL BUT This -4, // 2 : Save -5, // 3 : Save As -9, // 4 : Print -21,// 5 : Move to Other View -22,// 6 : Clone to Other View -17,// 7 : Full File Path to Clipboard -18,// 8 : Filename to Clipboard -19,// 9 : Current Dir. Path to Clipboard -6, // 10: Rename -7, // 11: Move to Recycle Bin -14,// 12: Read-Only -15,// 13: Clear Read-Only Flag -23,// 14: Move to New Instance -24,// 15: Open to New Instance -8, // 16: Reload -2, // 17: Close ALL to the Left -3, // 18: Close ALL to the Right -11,// 19: Open Containing Folder in Explorer -12,// 20: Open Containing Folder in cmd --1 //-------End + +static const int tabContextMenuItemPos[] = +{ + 0, // 0 : Close + 1, // 1 : Close ALL BUT This + 4, // 2 : Save + 5, // 3 : Save As + 9, // 4 : Print + 21, // 5 : Move to Other View + 22, // 6 : Clone to Other View + 17, // 7 : Full File Path to Clipboard + 18, // 8 : Filename to Clipboard + 19, // 9 : Current Dir. Path to Clipboard + 6, // 10: Rename + 7, // 11: Move to Recycle Bin + 14, // 12: Read-Only + 15, // 13: Clear Read-Only Flag + 23, // 14: Move to New Instance + 24, // 15: Open to New Instance + 8, // 16: Reload + 2, // 17: Close ALL to the Left + 3, // 18: Close ALL to the Right + 11, // 19: Open Containing Folder in Explorer + 12, // 20: Open Containing Folder in cmd + -1 //-------End }; + void NativeLangSpeaker::changeLangTabContextMenu(HMENU hCM) { - if (_nativeLangA) + if (nullptr != _nativeLangA) { TiXmlNodeA *tabBarMenu = _nativeLangA->FirstChild("Menu"); - if (tabBarMenu) + if (tabBarMenu) { tabBarMenu = tabBarMenu->FirstChild("TabBar"); if (tabBarMenu) { - WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + WcharMbcsConvertor* wmc = WcharMbcsConvertor::getInstance(); int nbCMItems = sizeof(tabContextMenuItemPos)/sizeof(int); for (TiXmlNodeA *childNode = tabBarMenu->FirstChildElement("Item"); @@ -395,12 +405,13 @@ void NativeLangSpeaker::changeLangTabDrapContextMenu(HMENU hCM) if (_nativeLangA) { - const char *goToViewA = NULL; - const char *cloneToViewA = NULL; - + const char *goToViewA = nullptr; + const char *cloneToViewA = nullptr; + TiXmlNodeA *tabBarMenu = _nativeLangA->FirstChild("Menu"); if (tabBarMenu) tabBarMenu = tabBarMenu->FirstChild("TabBar"); + if (tabBarMenu) { for (TiXmlNodeA *childNode = tabBarMenu->FirstChildElement("Item"); @@ -433,13 +444,16 @@ void NativeLangSpeaker::changeLangTabDrapContextMenu(HMENU hCM) } } + void NativeLangSpeaker::changeConfigLang(HWND hDlg) { - if (!_nativeLangA) return; + if (nullptr == _nativeLangA) + return; TiXmlNodeA *styleConfDlgNode = _nativeLangA->FirstChild("Dialog"); - if (!styleConfDlgNode) return; - + if (!styleConfDlgNode) + return; + styleConfDlgNode = styleConfDlgNode->FirstChild("StyleConfig"); if (!styleConfDlgNode) return; diff --git a/PowerEditor/visual.net/notepadPlus.vcxproj b/PowerEditor/visual.net/notepadPlus.vcxproj index 5ae1dc036..cdbbb4117 100644 --- a/PowerEditor/visual.net/notepadPlus.vcxproj +++ b/PowerEditor/visual.net/notepadPlus.vcxproj @@ -1,5 +1,5 @@  - + Unicode Debug @@ -27,24 +27,24 @@ Application - v120_xp + v140_xp Unicode true Application - v120_xp + v140_xp Unicode true Application - v120_xp + v140_xp Unicode Application - v120_xp + v140_xp Unicode @@ -100,7 +100,7 @@ UninitializedLocalUsageCheck MultiThreadedDebug Level4 - true + false ProgramDatabase true true From 2ad6ba5a441ca203482f352c5a0a892cdaf9594f Mon Sep 17 00:00:00 2001 From: Damien GERARD Date: Fri, 14 Aug 2015 05:57:19 -0700 Subject: [PATCH 31/85] Code: using enum class for FormatType --- PowerEditor/src/Notepad_plus.cpp | 33 +++--- PowerEditor/src/Notepad_plus.h | 4 +- PowerEditor/src/NppBigSwitch.cpp | 11 +- PowerEditor/src/NppCommands.cpp | 17 +-- PowerEditor/src/Parameters.cpp | 39 ++++++- PowerEditor/src/Parameters.h | 41 +++++-- PowerEditor/src/ScitillaComponent/Buffer.cpp | 102 ++++++++++-------- PowerEditor/src/ScitillaComponent/Buffer.h | 9 +- .../ScitillaComponent/ScintillaEditView.cpp | 2 +- .../WinControls/Preference/preferenceDlg.cpp | 34 +++--- 10 files changed, 188 insertions(+), 104 deletions(-) diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index 41ec4885b..af8bc0582 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -1816,6 +1816,7 @@ void Notepad_plus::checkDocState() bool isUserReadOnly = curBuf->getUserReadOnly(); ::CheckMenuItem(_mainMenuHandle, IDM_EDIT_SETREADONLY, MF_BYCOMMAND | (isUserReadOnly?MF_CHECKED:MF_UNCHECKED)); } + enableCommand(IDM_FILE_DELETE, isFileExisting, MENU); enableCommand(IDM_FILE_RENAME, isFileExisting, MENU); @@ -2116,23 +2117,20 @@ void Notepad_plus::setLangStatus(LangType langType) } -void Notepad_plus::setDisplayFormat(formatType f) +void Notepad_plus::setDisplayFormat(FormatType format) { - generic_string str; - switch (f) + const TCHAR* str = TEXT("??"); + switch (format) { - case MAC_FORMAT : - str = TEXT("Macintosh"); - break; - case UNIX_FORMAT : - str = TEXT("UNIX"); - break; - default : - str = TEXT("Dos\\Windows"); + case FormatType::windows: str = TEXT("Dos\\Windows"); break; + case FormatType::macos: str = TEXT("Macintosh"); break; + case FormatType::unix: str = TEXT("UNIX"); break; + case FormatType::unknown: str = TEXT("Unknown"); assert(false); break; } - _statusBar.setText(str.c_str(), STATUSBAR_EOF_FORMAT); + _statusBar.setText(str, STATUSBAR_EOF_FORMAT); } + void Notepad_plus::setUniModeText() { Buffer *buf = _pEditView->getCurrentBuffer(); @@ -3480,6 +3478,7 @@ void Notepad_plus::staticCheckMenuAndTB() const checkMenuItem(IDM_VIEW_WRAP_SYMBOL, _pEditView->isWrapSymbolVisible()); } + void Notepad_plus::dynamicCheckMenuAndTB() const { //Format conversion @@ -3487,13 +3486,15 @@ void Notepad_plus::dynamicCheckMenuAndTB() const checkUnicodeMenuItems(); } -void Notepad_plus::enableConvertMenuItems(formatType f) const + +void Notepad_plus::enableConvertMenuItems(FormatType format) const { - enableCommand(IDM_FORMAT_TODOS, (f != WIN_FORMAT), MENU); - enableCommand(IDM_FORMAT_TOUNIX, (f != UNIX_FORMAT), MENU); - enableCommand(IDM_FORMAT_TOMAC, (f != MAC_FORMAT), MENU); + enableCommand(IDM_FORMAT_TODOS, (format != FormatType::windows), MENU); + enableCommand(IDM_FORMAT_TOUNIX, (format != FormatType::unix), MENU); + enableCommand(IDM_FORMAT_TOMAC, (format != FormatType::macos), MENU); } + void Notepad_plus::checkUnicodeMenuItems() const { Buffer *buf = _pEditView->getCurrentBuffer(); diff --git a/PowerEditor/src/Notepad_plus.h b/PowerEditor/src/Notepad_plus.h index b20a30a08..231e17c36 100644 --- a/PowerEditor/src/Notepad_plus.h +++ b/PowerEditor/src/Notepad_plus.h @@ -495,14 +495,14 @@ private: void getMainClientRect(RECT & rc) const; void staticCheckMenuAndTB() const; void dynamicCheckMenuAndTB() const; - void enableConvertMenuItems(formatType f) const; + void enableConvertMenuItems(FormatType f) const; void checkUnicodeMenuItems() const; generic_string getLangDesc(LangType langType, bool getName = false); void setLangStatus(LangType langType); - void setDisplayFormat(formatType f); + void setDisplayFormat(FormatType f); int getCmdIDFromEncoding(int encoding) const; void setUniModeText(); void checkLangsMenu(int id) const ; diff --git a/PowerEditor/src/NppBigSwitch.cpp b/PowerEditor/src/NppBigSwitch.cpp index 8600b3d45..459a7e310 100644 --- a/PowerEditor/src/NppBigSwitch.cpp +++ b/PowerEditor/src/NppBigSwitch.cpp @@ -318,19 +318,24 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa return -1; BufferID id = (BufferID)wParam; Buffer * b = MainFileManager->getBufferByID(id); - return b->getFormat(); + return static_cast(b->getFormat()); } case NPPM_SETBUFFERFORMAT: { if (!wParam) return FALSE; - if (lParam < WIN_FORMAT || lParam >= UNIX_FORMAT) + + FormatType newFormat = convertIntToFormatType(static_cast(lParam), FormatType::unknown); + if (FormatType::unknown == newFormat) + { + assert(false and "invalid buffer format message"); return FALSE; + } BufferID id = (BufferID)wParam; Buffer * b = MainFileManager->getBufferByID(id); - b->setFormat((formatType)lParam); + b->setFormat(newFormat); return TRUE; } diff --git a/PowerEditor/src/NppCommands.cpp b/PowerEditor/src/NppCommands.cpp index 52a29ae3d..581ffa54a 100644 --- a/PowerEditor/src/NppCommands.cpp +++ b/PowerEditor/src/NppCommands.cpp @@ -1694,16 +1694,17 @@ void Notepad_plus::command(int id) break; } - case IDM_FORMAT_TODOS : - case IDM_FORMAT_TOUNIX : - case IDM_FORMAT_TOMAC : + case IDM_FORMAT_TODOS: + case IDM_FORMAT_TOUNIX: + case IDM_FORMAT_TOMAC: { - Buffer * buf = _pEditView->getCurrentBuffer(); + FormatType newFormat = (id == IDM_FORMAT_TODOS) + ? FormatType::windows + : (id == IDM_FORMAT_TOUNIX) ? FormatType::unix : FormatType::macos; - int f = int((id == IDM_FORMAT_TODOS)?SC_EOL_CRLF:(id == IDM_FORMAT_TOUNIX)?SC_EOL_LF:SC_EOL_CR); - - buf->setFormat((formatType)f); - _pEditView->execute(SCI_CONVERTEOLS, buf->getFormat()); + Buffer* buf = _pEditView->getCurrentBuffer(); + buf->setFormat(newFormat); + _pEditView->execute(SCI_CONVERTEOLS, static_cast(buf->getFormat())); break; } diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp index ed64d03b3..313cf9e45 100644 --- a/PowerEditor/src/Parameters.cpp +++ b/PowerEditor/src/Parameters.cpp @@ -3953,7 +3953,24 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) { int i; if (element->Attribute(TEXT("format"), &i)) - _nppGUI._newDocDefaultSettings._format = (formatType)i; + { + FormatType newFormat = FormatType::osdefault; + switch (i) + { + case static_cast(FormatType::windows) : + newFormat = FormatType::windows; + break; + case static_cast(FormatType::macos) : + newFormat = FormatType::macos; + break; + case static_cast(FormatType::unix) : + newFormat = FormatType::unix; + break; + default: + assert(false and "invalid buffer format - fallback to default"); + } + _nppGUI._newDocDefaultSettings._format = newFormat; + } if (element->Attribute(TEXT("encoding"), &i)) _nppGUI._newDocDefaultSettings._unicodeMode = (UniMode)i; @@ -4992,7 +5009,7 @@ bool NppParameters::writeGUIParams() } else if (!lstrcmp(nm, TEXT("NewDocDefaultSettings"))) { - element->SetAttribute(TEXT("format"), _nppGUI._newDocDefaultSettings._format); + element->SetAttribute(TEXT("format"), static_cast(_nppGUI._newDocDefaultSettings._format)); element->SetAttribute(TEXT("encoding"), _nppGUI._newDocDefaultSettings._unicodeMode); element->SetAttribute(TEXT("lang"), _nppGUI._newDocDefaultSettings._lang); element->SetAttribute(TEXT("codepage"), _nppGUI._newDocDefaultSettings._codepage); @@ -5268,7 +5285,7 @@ bool NppParameters::writeGUIParams() { TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); GUIConfigElement->SetAttribute(TEXT("name"), TEXT("NewDocDefaultSettings")); - GUIConfigElement->SetAttribute(TEXT("format"), _nppGUI._newDocDefaultSettings._format); + GUIConfigElement->SetAttribute(TEXT("format"), static_cast(_nppGUI._newDocDefaultSettings._format)); GUIConfigElement->SetAttribute(TEXT("encoding"), _nppGUI._newDocDefaultSettings._unicodeMode); GUIConfigElement->SetAttribute(TEXT("lang"), _nppGUI._newDocDefaultSettings._lang); GUIConfigElement->SetAttribute(TEXT("codepage"), _nppGUI._newDocDefaultSettings._codepage); @@ -6260,3 +6277,19 @@ void Date::now() _month = timeinfo->tm_mon + 1; _day = timeinfo->tm_mday; } + + +FormatType convertIntToFormatType(int value, FormatType defvalue) +{ + switch (value) + { + case static_cast(FormatType::windows): + return FormatType::windows; + case static_cast(FormatType::macos): + return FormatType::macos; + case static_cast(FormatType::unix): + return FormatType::unix; + default: + return defvalue; + } +} \ No newline at end of file diff --git a/PowerEditor/src/Parameters.h b/PowerEditor/src/Parameters.h index a83cdd55e..03665f6a7 100644 --- a/PowerEditor/src/Parameters.h +++ b/PowerEditor/src/Parameters.h @@ -95,7 +95,28 @@ const int TAB_VERTICAL = 64; // 0100 0000 const int TAB_MULTILINE = 128; // 1000 0000 const int TAB_HIDE = 256; //1 0000 0000 -enum formatType {WIN_FORMAT, MAC_FORMAT, UNIX_FORMAT}; + +enum class FormatType: std::uint8_t +{ + windows, + macos, + unix, + + // special values + unknown, // can not be the first value for legacy code + osdefault = windows, +}; + +/*! +** \brief Convert an int into a FormatType +** \param value An arbitrary int +** \param defvalue The default value to use if an invalid value is provided +*/ +FormatType convertIntToFormatType(int value, FormatType defvalue = FormatType::osdefault); + + + + enum UniMode {uni8Bit=0, uniUTF8=1, uni16BE=2, uni16LE=3, uniCookie=4, uni7Bit=5, uni16BE_NoBOM=6, uni16LE_NoBOM=7, uniEnd}; enum ChangeDetect {cdDisabled=0, cdEnabled=1, cdAutoUpdate=2, cdGo2end=3, cdAutoUpdateGo2end=4}; enum BackupFeature {bak_none = 0, bak_simple = 1, bak_verbose = 2}; @@ -519,17 +540,19 @@ private : int _nbLexerStyler; }; -struct NewDocDefaultSettings + +struct NewDocDefaultSettings final { - formatType _format; - UniMode _unicodeMode; - bool _openAnsiAsUtf8; - LangType _lang; - int _codepage; // -1 when not using - NewDocDefaultSettings():_format(WIN_FORMAT), _unicodeMode(uniCookie), _openAnsiAsUtf8(true), _lang(L_TEXT), _codepage(-1){}; + FormatType _format = FormatType::osdefault; + UniMode _unicodeMode = uniCookie; + bool _openAnsiAsUtf8 = true; + LangType _lang = L_TEXT; + int _codepage = -1; // -1 when not using }; -struct LangMenuItem { + +struct LangMenuItem +{ LangType _langType; int _cmdID; generic_string _langName; diff --git a/PowerEditor/src/ScitillaComponent/Buffer.cpp b/PowerEditor/src/ScitillaComponent/Buffer.cpp index 3a36698e6..3354c40cc 100644 --- a/PowerEditor/src/ScitillaComponent/Buffer.cpp +++ b/PowerEditor/src/ScitillaComponent/Buffer.cpp @@ -49,6 +49,37 @@ long Buffer::_recentTagCtr = 0; + +namespace // anonymous +{ + + static FormatType getEOLFormatForm(const char* const data, size_t length, FormatType defvalue = FormatType::osdefault) + { + assert(length == 0 or data != nullptr && "invalid buffer for getEOLFormatForm()"); + + for (size_t i = 0; i != length; ++i) + { + if (data[i] == CR) + { + if (i + 1 < length && data[i + 1] == LF) + return FormatType::windows; + + return FormatType::macos; + } + + if (data[i] == LF) + return FormatType::unix; + } + + return defvalue; // fallback unknown + } + + +} // anonymous namespace + + + + Buffer::Buffer(FileManager * pManager, BufferID id, Document doc, DocFileStatus type, const TCHAR *fileName) // type must be either DOC_REGULAR or DOC_UNNAMED : _pManager(pManager) @@ -72,7 +103,7 @@ Buffer::Buffer(FileManager * pManager, BufferID id, Document doc, DocFileStatus checkFileState(); // reset after initialization - _isDirty = false; + _isDirty = false; _canNotify = true; _needLexer = false; // new buffers do not need lexing, Scintilla takes care of that } @@ -560,21 +591,25 @@ BufferID FileManager::loadFile(const TCHAR * filename, Document doc, int encodin Utf8_16_Read UnicodeConvertor; //declare here so we can get information after loading is done char data[blockSize + 8]; // +8 for incomplete multibyte char - formatType format; - bool res = loadFileData(doc, backupFileName?backupFileName:fullpath, data, &UnicodeConvertor, L_TEXT, encoding, &format); + FormatType bkformat = FormatType::unknown; + + bool res = loadFileData(doc, backupFileName?backupFileName:fullpath, data, &UnicodeConvertor, L_TEXT, encoding, &bkformat); if (res) { Buffer* newBuf = new Buffer(this, _nextBufferID, doc, DOC_REGULAR, fullpath); BufferID id = (BufferID) newBuf; newBuf->_id = id; + if (backupFileName != NULL) { newBuf->_backupFileName = backupFileName; if (!PathFileExists(fullpath)) newBuf->_currentStatus = DOC_UNNAMED; } + if (fileNameTimestamp != 0) newBuf->_timeStamp = fileNameTimestamp; + _buffers.push_back(newBuf); ++_nrBufs; Buffer* buf = _buffers.at(_nrBufs - 1); @@ -590,11 +625,11 @@ BufferID FileManager::loadFile(const TCHAR * filename, Document doc, int encodin // 3 formats : WIN_FORMAT, UNIX_FORMAT and MAC_FORMAT if (nullptr != UnicodeConvertor.getNewBuf()) { - int format = getEOLFormatForm(UnicodeConvertor.getNewBuf(), UnicodeConvertor.getNewSize()); - buf->setFormat(format == -1?WIN_FORMAT:(formatType)format); + FormatType format = getEOLFormatForm(UnicodeConvertor.getNewBuf(), UnicodeConvertor.getNewSize()); + buf->setFormat(format); } else - buf->setFormat(WIN_FORMAT); + buf->setFormat(FormatType::osdefault); UniMode um = UnicodeConvertor.getEncoding(); if (um == uni7Bit) @@ -607,7 +642,7 @@ BufferID FileManager::loadFile(const TCHAR * filename, Document doc, int encodin // Test if encoding is set to UTF8 w/o BOM (usually for utf8 indicator of xml or html) buf->setEncoding((encoding == SC_CP_UTF8)?-1:encoding); buf->setUnicodeMode(uniCookie); - buf->setFormat(format); + buf->setFormat(bkformat); } //determine buffer properties @@ -631,28 +666,29 @@ bool FileManager::reloadBuffer(BufferID id) buf->_canNotify = false; //disable notify during file load, we dont want dirty to be triggered int encoding = buf->getEncoding(); char data[blockSize + 8]; // +8 for incomplete multibyte char - formatType format; - bool res = loadFileData(doc, buf->getFullPathName(), data, &UnicodeConvertor, buf->getLangType(), encoding, &format); + FormatType bkformat; + + bool res = loadFileData(doc, buf->getFullPathName(), data, &UnicodeConvertor, buf->getLangType(), encoding, &bkformat); buf->_canNotify = true; + if (res) { if (encoding == -1) { if (nullptr != UnicodeConvertor.getNewBuf()) { - int format = getEOLFormatForm(UnicodeConvertor.getNewBuf(), UnicodeConvertor.getNewSize()); - buf->setFormat(format == -1?WIN_FORMAT:(formatType)format); + FormatType format = getEOLFormatForm(UnicodeConvertor.getNewBuf(), UnicodeConvertor.getNewSize()); + buf->setFormat(format); } else - { - buf->setFormat(WIN_FORMAT); - } + buf->setFormat(FormatType::osdefault); + buf->setUnicodeMode(UnicodeConvertor.getEncoding()); } else { buf->setEncoding(encoding); - buf->setFormat(format); + buf->setFormat(bkformat); buf->setUnicodeMode(uniCookie); } } @@ -1209,7 +1245,7 @@ int FileManager::detectCodepage(char* buf, size_t len) } inline bool FileManager::loadFileData(Document doc, const TCHAR * filename, char* data, Utf8_16_Read * UnicodeConvertor, - LangType language, int & encoding, formatType *pFormat) + LangType language, int & encoding, FormatType* pFormat) { FILE *fp = generic_fopen(filename, TEXT("rb")); if (!fp) @@ -1264,7 +1300,7 @@ inline bool FileManager::loadFileData(Document doc, const TCHAR * filename, char _pscratchTilla->execute(SCI_SETCODEPAGE, SC_CP_UTF8); bool success = true; - int format = -1; + FormatType format = FormatType::unknown; __try { // First allocate enough memory for the whole file (this will reduce memory copy during loading) @@ -1314,8 +1350,8 @@ inline bool FileManager::loadFileData(Document doc, const TCHAR * filename, char _pscratchTilla->execute(SCI_APPENDTEXT, newDataLen, (LPARAM)newData); } - if (format == -1) - format = getEOLFormatForm(data, lenFile); + if (format == FormatType::unknown) + format = getEOLFormatForm(data, lenFile, FormatType::unknown); } else { @@ -1343,8 +1379,9 @@ inline bool FileManager::loadFileData(Document doc, const TCHAR * filename, char fclose(fp); + // broadcast the format if (pFormat != nullptr) - *pFormat = (format == -1) ? WIN_FORMAT : (formatType)format; + *pFormat = (format != FormatType::unknown) ? format : FormatType::osdefault; _pscratchTilla->execute(SCI_EMPTYUNDOBUFFER); _pscratchTilla->execute(SCI_SETSAVEPOINT); @@ -1411,29 +1448,4 @@ int FileManager::docLength(Buffer* buffer) const int docLen = _pscratchTilla->getCurrentDocLen(); _pscratchTilla->execute(SCI_SETDOCPOINTER, 0, _scratchDocDefault); return docLen; -} - -int FileManager::getEOLFormatForm(const char* const data, size_t length) const -{ - assert(data != nullptr && "invalid buffer for getEOLFormatForm()"); - - for (size_t i = 0; i != length; ++i) - { - if (data[i] == CR) - { - if (i+1 < length && data[i+1] == LF) - { - return int(WIN_FORMAT); - } - else - { - return int(MAC_FORMAT); - } - } - if (data[i] == LF) - { - return int(UNIX_FORMAT); - } - } - return -1; } \ No newline at end of file diff --git a/PowerEditor/src/ScitillaComponent/Buffer.h b/PowerEditor/src/ScitillaComponent/Buffer.h index 43d455c22..cc0e91926 100644 --- a/PowerEditor/src/ScitillaComponent/Buffer.h +++ b/PowerEditor/src/ScitillaComponent/Buffer.h @@ -105,14 +105,13 @@ public: void destroyInstance() { delete _pSelf; }; int getFileNameFromBuffer(BufferID id, TCHAR * fn2copy); int docLength(Buffer * buffer) const; - int getEOLFormatForm(const char* const data, size_t length) const; size_t nextUntitledNewNumber() const; private: ~FileManager(); int detectCodepage(char* buf, size_t len); - bool loadFileData(Document doc, const TCHAR* filename, char* buffer, Utf8_16_Read* UnicodeConvertor, LangType language, int& encoding, formatType* pFormat = nullptr); + bool loadFileData(Document doc, const TCHAR* filename, char* buffer, Utf8_16_Read* UnicodeConvertor, LangType language, int& encoding, FormatType* pFormat = nullptr); private: @@ -196,11 +195,11 @@ public: doNotify(BufferChangeReadonly); } - formatType getFormat() const { + FormatType getFormat() const { return _format; } - void setFormat(formatType format) { + void setFormat(FormatType format) { _format = format; doNotify(BufferChangeFormat); } @@ -365,7 +364,7 @@ private: LangType _lang; generic_string _userLangExt; // it's useful if only (_lang == L_USER) bool _isDirty = false; - formatType _format; + FormatType _format = FormatType::osdefault; UniMode _unicodeMode; int _encoding = -1; bool _isUserReadOnly = false; diff --git a/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp b/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp index 544903220..2263370bf 100644 --- a/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp +++ b/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp @@ -1577,7 +1577,7 @@ void ScintillaEditView::bufferUpdated(Buffer * buffer, int mask) if (mask & BufferChangeFormat) { - execute(SCI_SETEOLMODE, _currentBuffer->getFormat()); + execute(SCI_SETEOLMODE, static_cast(_currentBuffer->getFormat())); } if (mask & BufferChangeReadonly) { diff --git a/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp index 30e93b1c9..6feea0142 100644 --- a/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp +++ b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp @@ -1100,23 +1100,25 @@ INT_PTR CALLBACK DefaultNewDocDlg::run_dlgProc(UINT Message, WPARAM wParam, LPAR NppGUI & nppGUI = (NppGUI & )pNppParam->getNppGUI(); NewDocDefaultSettings & ndds = (NewDocDefaultSettings &)nppGUI.getNewDocDefaultSettings(); - switch (Message) + switch (Message) { - case WM_INITDIALOG : + case WM_INITDIALOG: { - int ID2Check = 0; - + int ID2Check = IDC_RADIO_F_WIN; switch (ndds._format) { - case MAC_FORMAT : + case FormatType::windows: + ID2Check = IDC_RADIO_F_WIN; + break; + case FormatType::macos: ID2Check = IDC_RADIO_F_MAC; break; - case UNIX_FORMAT : + case FormatType::unix: ID2Check = IDC_RADIO_F_UNIX; break; - - default : //WIN_FORMAT - ID2Check = IDC_RADIO_F_WIN; + case FormatType::unknown: + assert(false); + break; } ::SendDlgItemMessage(_hSelf, ID2Check, BM_SETCHECK, BST_CHECKED, 0); @@ -1252,16 +1254,23 @@ INT_PTR CALLBACK DefaultNewDocDlg::run_dlgProc(UINT Message, WPARAM wParam, LPAR } case IDC_RADIO_F_MAC: - ndds._format = MAC_FORMAT; + { + ndds._format = FormatType::macos; return TRUE; + } case IDC_RADIO_F_UNIX: - ndds._format = UNIX_FORMAT; + { + ndds._format = FormatType::unix; return TRUE; + } case IDC_RADIO_F_WIN: - ndds._format = WIN_FORMAT; + { + ndds._format = FormatType::windows; return TRUE; + } default: + { if (HIWORD(wParam) == CBN_SELCHANGE) { if (LOWORD(wParam) == IDC_COMBO_DEFAULTLANG) @@ -1279,6 +1288,7 @@ INT_PTR CALLBACK DefaultNewDocDlg::run_dlgProc(UINT Message, WPARAM wParam, LPAR } } return FALSE; + } } } return FALSE; From dc3ef779ce30065231ce1dca8476eca4aa487e63 Mon Sep 17 00:00:00 2001 From: Damien GERARD Date: Fri, 14 Aug 2015 05:59:29 -0700 Subject: [PATCH 32/85] SplitterContainer: removed useless code --- .../src/WinControls/SplitterContainer/SplitterContainer.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.cpp b/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.cpp index f09beb713..7badd615c 100644 --- a/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.cpp +++ b/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.cpp @@ -249,8 +249,6 @@ LRESULT SplitterContainer::runProc(UINT message, WPARAM wParam, LPARAM lParam) if (!_hPopupMenu) { - POINT p; - ::GetCursorPos(&p); _hPopupMenu = ::CreatePopupMenu(); ::InsertMenu(_hPopupMenu, 1, MF_BYPOSITION, ROTATION_A_GAUCHE, TEXT("Rotate to left")); ::InsertMenu(_hPopupMenu, 0, MF_BYPOSITION, ROTATION_A_DROITE, TEXT("Rotate to right")); From d56d42269fa36ec35450aeb5be8b745e9b24d58c Mon Sep 17 00:00:00 2001 From: Damien GERARD Date: Fri, 14 Aug 2015 06:06:50 -0700 Subject: [PATCH 33/85] Code: remove useless code --- PowerEditor/src/NppCommands.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/PowerEditor/src/NppCommands.cpp b/PowerEditor/src/NppCommands.cpp index 581ffa54a..85bf17b38 100644 --- a/PowerEditor/src/NppCommands.cpp +++ b/PowerEditor/src/NppCommands.cpp @@ -1891,7 +1891,6 @@ void Notepad_plus::command(int id) if (not buf->isDirty()) { - buf = _pEditView->getCurrentBuffer(); buf->setEncoding(encoding); buf->setUnicodeMode(uniCookie); fileReload(); From a30de2e605cc5e7fb77efb538641b7286bcf2443 Mon Sep 17 00:00:00 2001 From: Damien GERARD Date: Fri, 14 Aug 2015 18:29:59 +0200 Subject: [PATCH 34/85] Build: revert changes on platform toolset --- PowerEditor/visual.net/notepadPlus.vcxproj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) mode change 100644 => 100755 PowerEditor/visual.net/notepadPlus.vcxproj diff --git a/PowerEditor/visual.net/notepadPlus.vcxproj b/PowerEditor/visual.net/notepadPlus.vcxproj old mode 100644 new mode 100755 index cdbbb4117..73abd320b --- a/PowerEditor/visual.net/notepadPlus.vcxproj +++ b/PowerEditor/visual.net/notepadPlus.vcxproj @@ -1,5 +1,5 @@  - + Unicode Debug @@ -27,24 +27,24 @@ Application - v140_xp + v120_xp Unicode true Application - v140_xp + v120_xp Unicode true Application - v140_xp + v120_xp Unicode Application - v140_xp + v120_xp Unicode @@ -656,4 +656,4 @@ copy ..\src\contextMenu.xml ..\bin64\contextMenu.xml - \ No newline at end of file + From e4b0b8c0b5377fed557c8219ed246e74b68707de Mon Sep 17 00:00:00 2001 From: Rikk Date: Wed, 12 Aug 2015 20:49:53 -0300 Subject: [PATCH 35/85] Fix: manually selected language not persistent when opening file in a new instance --- PowerEditor/src/Notepad_plus.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index af8bc0582..32a1d01d3 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -3281,6 +3281,8 @@ void Notepad_plus::docOpenInNewInstance(FileTransferMode mode, int x, int y) command += pX; command += TEXT(" -y"); command += pY; + command += TEXT(" -l"); + command += ScintillaEditView::langNames[buf->getLangType()].lexerName; Command cmd(command); cmd.run(_pPublicInterface->getHSelf()); From ee563e5dbae54eb2e726d136e8cbdceea24d4c71 Mon Sep 17 00:00:00 2001 From: Rikk Date: Wed, 12 Aug 2015 22:23:20 -0300 Subject: [PATCH 36/85] Remember line and column when opening file in a new instance --- PowerEditor/src/Notepad_plus.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index 32a1d01d3..00c21277c 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -3283,6 +3283,10 @@ void Notepad_plus::docOpenInNewInstance(FileTransferMode mode, int x, int y) command += pY; command += TEXT(" -l"); command += ScintillaEditView::langNames[buf->getLangType()].lexerName; + command += TEXT(" -n"); + command += to_wstring(_pEditView->getCurrentLineNumber() + 1); + command += TEXT(" -c"); + command += to_wstring(_pEditView->getCurrentColumnNumber() + 1); Command cmd(command); cmd.run(_pPublicInterface->getHSelf()); From 592bd76244c07bf8e7d518ac2ccea626a903e333 Mon Sep 17 00:00:00 2001 From: Rikk Date: Thu, 13 Aug 2015 20:22:54 -0300 Subject: [PATCH 37/85] [BUG_FIXED] Fix "Open in/Move to new instance" issue (closes #709, fixes the new window always started at top-left corner of screen, and did not remember maximized state. Now it will use the last saved window position and state. --- PowerEditor/src/Notepad_plus.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index 00c21277c..c554cf775 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -3272,15 +3272,21 @@ void Notepad_plus::docOpenInNewInstance(FileTransferMode mode, int x, int y) generic_string command = TEXT("\""); command += nppName; command += TEXT("\""); + command += TEXT(" \"$(FULL_CURRENT_PATH)\" -multiInst -nosession"); - command += TEXT(" \"$(FULL_CURRENT_PATH)\" -multiInst -nosession -x"); - TCHAR pX[10], pY[10]; - generic_itoa(x, pX, 10); - generic_itoa(y, pY, 10); + if (x) { + TCHAR pX[10]; + generic_itoa(x, pX, 10); + command += TEXT(" -x"); + command += pX; + } + if (y) { + TCHAR pY[10]; + generic_itoa(y, pY, 10); + command += TEXT(" -y"); + command += pY; + } - command += pX; - command += TEXT(" -y"); - command += pY; command += TEXT(" -l"); command += ScintillaEditView::langNames[buf->getLangType()].lexerName; command += TEXT(" -n"); From a53c25499e54980f2a7ead924ff21ec3466c6635 Mon Sep 17 00:00:00 2001 From: Damien GERARD Date: Fri, 14 Aug 2015 21:47:47 +0200 Subject: [PATCH 38/85] Code simplification --- PowerEditor/src/Parameters.cpp | 1331 +++++++++++++---------- PowerEditor/src/Parameters.h | 1456 +++++++++++++------------- PowerEditor/src/localizationString.h | Bin 10588 -> 10432 bytes 3 files changed, 1482 insertions(+), 1305 deletions(-) diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp index 313cf9e45..849ec9f8f 100644 --- a/PowerEditor/src/Parameters.cpp +++ b/PowerEditor/src/Parameters.cpp @@ -7,13 +7,13 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable -// installer, such as those produced by InstallShield. +// installer, such as those produced by InstallShield. // 3. Links to a library or executes a program that does any of the above. // // This program is distributed in the hope that it will be useful, @@ -84,7 +84,7 @@ WinMenuKeyDefinition winKeyDefs[] = { {VK_NULL, IDM_FILE_PRINTNOW, false, false, false, NULL}, {VK_F4, IDM_FILE_EXIT, false, true, false, NULL}, - { VK_T, IDM_FILE_RESTORELASTCLOSEDFILE, true, false, true, TEXT("Restore Recent Closed File")}, + { VK_T, IDM_FILE_RESTORELASTCLOSEDFILE, true, false, true, TEXT("Restore Recent Closed File")}, // {VK_NULL, IDM_EDIT_UNDO, false, false, false, NULL}, // {VK_NULL, IDM_EDIT_REDO, false, false, false, NULL}, @@ -146,11 +146,11 @@ WinMenuKeyDefinition winKeyDefs[] = { {VK_F3, IDM_SEARCH_FINDPREV, false, false, true, NULL}, {VK_F3, IDM_SEARCH_VOLATILE_FINDNEXT, true, true, false, NULL}, {VK_F3, IDM_SEARCH_VOLATILE_FINDPREV, true, true, true, NULL}, - {VK_F3, IDM_SEARCH_SETANDFINDNEXT, true, false, false, NULL}, - {VK_F3, IDM_SEARCH_SETANDFINDPREV, true, false, true, NULL}, - {VK_F4, IDM_SEARCH_GOTONEXTFOUND, false, false, false, NULL}, - {VK_F4, IDM_SEARCH_GOTOPREVFOUND, false, false, true, NULL}, - {VK_F7, IDM_FOCUS_ON_FOUND_RESULTS, false, false, false, NULL}, + {VK_F3, IDM_SEARCH_SETANDFINDNEXT, true, false, false, NULL}, + {VK_F3, IDM_SEARCH_SETANDFINDPREV, true, false, true, NULL}, + {VK_F4, IDM_SEARCH_GOTONEXTFOUND, false, false, false, NULL}, + {VK_F4, IDM_SEARCH_GOTOPREVFOUND, false, false, true, NULL}, + {VK_F7, IDM_FOCUS_ON_FOUND_RESULTS, false, false, false, NULL}, {VK_H, IDM_SEARCH_REPLACE, true, false, false, NULL}, {VK_I, IDM_SEARCH_FINDINCREMENT, true, true, false, NULL}, {VK_G, IDM_SEARCH_GOTOLINE, true, false, false, NULL}, @@ -165,12 +165,12 @@ WinMenuKeyDefinition winKeyDefs[] = { {VK_NULL, IDM_SEARCH_PASTEMARKEDLINES, false, false, false, NULL}, {VK_NULL, IDM_SEARCH_DELETEMARKEDLINES, false, false, false, NULL}, {VK_NULL, IDM_SEARCH_MARK, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_MARKALLEXT1, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_MARKALLEXT2, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_MARKALLEXT3, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_MARKALLEXT1, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_MARKALLEXT2, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_MARKALLEXT3, false, false, false, NULL}, {VK_NULL, IDM_SEARCH_MARKALLEXT4, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_MARKALLEXT5, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_UNMARKALLEXT1, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_MARKALLEXT5, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_UNMARKALLEXT1, false, false, false, NULL}, {VK_NULL, IDM_SEARCH_UNMARKALLEXT2, false, false, false, NULL}, {VK_NULL, IDM_SEARCH_UNMARKALLEXT3, false, false, false, NULL}, {VK_NULL, IDM_SEARCH_UNMARKALLEXT4, false, false, false, NULL}, @@ -247,54 +247,54 @@ WinMenuKeyDefinition winKeyDefs[] = { {VK_NULL, IDM_FORMAT_CONV2_UTF_8, false, false, false, NULL}, {VK_NULL, IDM_FORMAT_CONV2_UCS_2BE, false, false, false, NULL}, {VK_NULL, IDM_FORMAT_CONV2_UCS_2LE, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_6, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1256, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_13, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1257, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_14, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_5, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_MAC_CYRILLIC, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_KOI8R_CYRILLIC, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_KOI8U_CYRILLIC, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1251, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1250, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_437, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_720, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_737, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_775, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_850, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_852, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_855, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_857, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_858, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_860, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_861, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_862, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_863, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_865, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_866, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_869, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_BIG5, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_GB2312, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_2, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_7, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1253, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_8, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1255, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_SHIFT_JIS, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_EUC_KR, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_10, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_15, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_4, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_16, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_3, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_11, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_TIS_620, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_9, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1254, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1252, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_1, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1258, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_6, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_WIN_1256, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_13, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_WIN_1257, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_14, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_5, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_MAC_CYRILLIC, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_KOI8R_CYRILLIC, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_KOI8U_CYRILLIC, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_WIN_1251, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_WIN_1250, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_437, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_720, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_737, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_775, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_850, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_852, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_855, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_857, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_858, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_860, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_861, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_862, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_863, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_865, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_866, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_869, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_BIG5, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_GB2312, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_2, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_7, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_WIN_1253, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_8, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_WIN_1255, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_SHIFT_JIS, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_EUC_KR, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_10, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_15, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_4, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_16, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_3, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_11, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_TIS_620, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_9, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_WIN_1254, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_WIN_1252, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_1, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_WIN_1258, false, false, false, NULL}, {VK_NULL, IDM_SETTING_PREFERECE, false, false, false, NULL}, {VK_NULL, IDM_LANGSTYLE_CONFIG_DLG, false, false, false, NULL}, @@ -446,13 +446,13 @@ ScintillaKeyDefinition scintKeyDefs[] = { //array of accelerator keys for all po // {TEXT("SCI_CLEARREGISTEREDIMAGES"), SCI_CLEARREGISTEREDIMAGES, false, false, false, 0, 0}, // {TEXT("SCI_HOMEDISPLAYEXTEND"), SCI_HOMEDISPLAYEXTEND, false, true, true, VK_HOME, 0}, // {TEXT("SCI_LINEENDDISPLAYEXTEND"), SCI_LINEENDDISPLAYEXTEND, false, true, true, VK_END, 0}, - // + // // {TEXT("SCI_DELWORDRIGHTEND"), SCI_DELWORDRIGHTEND, false, false, false, 0, 0}, // {TEXT("SCI_LOWERCASE"), SCI_LOWERCASE, false, false, false, 0, 0}, // {TEXT("SCI_UPPERCASE"), SCI_UPPERCASE, false, false, false, 0, 0}, // {TEXT("SCI_LOWERCASE"), SCI_LOWERCASE, true, false, false, VK_U, 0}, // {TEXT("SCI_UPPERCASE"), SCI_UPPERCASE, true, false, true, VK_U, 0}, - // + // // {TEXT("SCI_FORMFEED"), SCI_FORMFEED, true, false, false, VK_L, 0}, // {TEXT("SCI_CLEARALLCMDKEYS"), SCI_CLEARALLCMDKEYS, false, false, false, 0, 0}, // {TEXT("SCI_STARTRECORD"), SCI_STARTRECORD, false, false, false, 0, 0}, @@ -465,39 +465,61 @@ ScintillaKeyDefinition scintKeyDefs[] = { //array of accelerator keys for all po }; -static int strVal(const TCHAR *str, int base) { - if (!str) return -1; - if (!str[0]) return 0; - TCHAR *finStr; - int result = generic_strtol(str, &finStr, base); - if (*finStr != '\0') + + + + + + + +namespace // anonymous namespace +{ + + static int strVal(const TCHAR *str, int base) + { + if (!str) return -1; + if (!str[0]) return 0; + + TCHAR *finStr; + int result = generic_strtol(str, &finStr, base); + if (*finStr != '\0') + return -1; + return result; + } + + + static int decStrVal(const TCHAR *str) + { + return strVal(str, 10); + } + + static int hexStrVal(const TCHAR *str) + { + return strVal(str, 16); + } + + static int getKwClassFromName(const TCHAR *str) + { + if (!lstrcmp(TEXT("instre1"), str)) return LANG_INDEX_INSTR; + if (!lstrcmp(TEXT("instre2"), str)) return LANG_INDEX_INSTR2; + if (!lstrcmp(TEXT("type1"), str)) return LANG_INDEX_TYPE; + if (!lstrcmp(TEXT("type2"), str)) return LANG_INDEX_TYPE2; + if (!lstrcmp(TEXT("type3"), str)) return LANG_INDEX_TYPE3; + if (!lstrcmp(TEXT("type4"), str)) return LANG_INDEX_TYPE4; + if (!lstrcmp(TEXT("type5"), str)) return LANG_INDEX_TYPE5; + + if ((str[1] == '\0') && (str[0] >= '0') && (str[0] <= '8')) // up to KEYWORDSET_MAX + return str[0] - '0'; + return -1; - return result; -}; + } -static int decStrVal(const TCHAR *str) { - return strVal(str, 10); -}; +} // anonymous namespace -static int hexStrVal(const TCHAR *str) { - return strVal(str, 16); -}; -static int getKwClassFromName(const TCHAR *str) { - if (!lstrcmp(TEXT("instre1"), str)) return LANG_INDEX_INSTR; - if (!lstrcmp(TEXT("instre2"), str)) return LANG_INDEX_INSTR2; - if (!lstrcmp(TEXT("type1"), str)) return LANG_INDEX_TYPE; - if (!lstrcmp(TEXT("type2"), str)) return LANG_INDEX_TYPE2; - if (!lstrcmp(TEXT("type3"), str)) return LANG_INDEX_TYPE3; - if (!lstrcmp(TEXT("type4"), str)) return LANG_INDEX_TYPE4; - if (!lstrcmp(TEXT("type5"), str)) return LANG_INDEX_TYPE5; - if ((str[1] == '\0') && (str[0] >= '0') && (str[0] <= '8')) // up to KEYWORDSET_MAX - return str[0] - '0'; - return -1; -}; wstring LocalizationSwitcher::getLangFromXmlFileName(const wchar_t *fn) const @@ -570,7 +592,7 @@ winVer getWindowsVersion() if (!bOsVersionInfoEx) { osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); - if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) + if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) return WV_UNKNOWN; } @@ -632,12 +654,12 @@ winVer getWindowsVersion() if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) { return WV_95; - } + } if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) { return WV_98; - } + } if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) { @@ -646,13 +668,13 @@ winVer getWindowsVersion() } break; - case VER_PLATFORM_WIN32s: + case VER_PLATFORM_WIN32s: return WV_WIN32S; - + default : return WV_UNKNOWN; } - return WV_UNKNOWN; + return WV_UNKNOWN; } @@ -681,7 +703,7 @@ NppParameters::NppParameters() : _pXmlDoc(NULL),_pXmlUserDoc(NULL), _pXmlUserSty // Prepare for default path TCHAR nppPath[MAX_PATH]; ::GetModuleFileName(NULL, nppPath, MAX_PATH); - + PathRemoveFileSpec(nppPath); _nppPath = nppPath; @@ -693,7 +715,7 @@ NppParameters::NppParameters() : _pXmlDoc(NULL),_pXmlUserDoc(NULL), _pXmlUserSty _appdataNppDir = TEXT(""); generic_string notepadStylePath(_nppPath); PathAppend(notepadStylePath, notepadStyleFile); - + _asNotepadStyle = (PathFileExists(notepadStylePath.c_str()) == TRUE); //Load initial accelerator key definitions @@ -701,7 +723,7 @@ NppParameters::NppParameters() : _pXmlDoc(NULL),_pXmlUserDoc(NULL), _pXmlUserSty initScintillaKeys(); } -NppParameters::~NppParameters() +NppParameters::~NppParameters() { for (int i = 0 ; i < _nbLang ; ++i) delete _langList[i]; @@ -772,7 +794,7 @@ bool NppParameters::reloadStylers(TCHAR *stylePath) getUserStylersFromXmlTree(); // Reload plugin styles. - for( size_t i = 0; i < getExternalLexerDoc()->size(); ++i) + for( size_t i = 0; i < getExternalLexerDoc()->size(); ++i) { getExternalLexerFromXmlTree( getExternalLexerDoc()->at(i) ); } @@ -788,7 +810,7 @@ bool NppParameters::reloadLang() if (!PathFileExists(nativeLangPath.c_str())) { nativeLangPath = _nppPath; - PathAppend(nativeLangPath, generic_string(TEXT("nativeLang.xml"))); + PathAppend(nativeLangPath, generic_string(TEXT("nativeLang.xml"))); if (!PathFileExists(nativeLangPath.c_str())) return false; } @@ -836,7 +858,7 @@ int base64ToAscii(char *dest, const char *base64Str) 49, 50, 51\ }; - size_t b64StrLen = strlen(base64Str); + size_t b64StrLen = strlen(base64Str); size_t nbLoop = b64StrLen / 4; size_t i = 0; @@ -920,7 +942,7 @@ bool NppParameters::load() L_END = L_EXTERNAL; bool isAllLaoded = true; for (int i = 0 ; i < NB_LANG ; _langList[i] = NULL, ++i); - + // Make localConf.xml path generic_string localConfPath(_nppPath); PathAppend(localConfPath, localConfFile); @@ -946,7 +968,7 @@ bool NppParameters::load() TCHAR nppDirLocation[MAX_PATH]; lstrcpy(nppDirLocation, _nppPath.c_str()); ::PathRemoveFileSpec(nppDirLocation); - + if (lstrcmp(progPath, nppDirLocation) == 0) _isLocal = false; } @@ -982,7 +1004,7 @@ bool NppParameters::load() // Detection cloud settings generic_string cloudChoicePath = _userPath; cloudChoicePath += TEXT("\\cloud\\choice"); - + // cloudChoicePath doesn't exist, just quit if (::PathFileExists(cloudChoicePath.c_str())) { @@ -990,7 +1012,7 @@ bool NppParameters::load() std::string cloudChoiceStr = getFileContent(cloudChoicePath.c_str()); WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); std::wstring cloudChoiceStrW = wmc->char2wchar(cloudChoiceStr.c_str(), SC_CP_UTF8); - + if (cloudChoiceStrW != TEXT("") && ::PathFileExists(cloudChoiceStrW.c_str())) { _userPath = cloudChoiceStrW; @@ -1006,7 +1028,7 @@ bool NppParameters::load() HMODULE hUser32 = ::GetModuleHandle(TEXT("User32")); if (hUser32) _transparentFuncAddr = (WNDPROC)::GetProcAddress(hUser32, "SetLayeredWindowAttributes"); - + //---------------------------------------------// // Dlg theme texture function for xp and vista // //---------------------------------------------// @@ -1020,19 +1042,19 @@ bool NppParameters::load() generic_string langs_xml_path(_userPath); PathAppend(langs_xml_path, TEXT("langs.xml")); - BOOL doRecover = FALSE; - if (::PathFileExists(langs_xml_path.c_str())) - { - struct _stat buf; - - if (generic_stat(langs_xml_path.c_str(), &buf)==0) - if (buf.st_size == 0) - doRecover = ::MessageBox(NULL, TEXT("Load langs.xml failed!\rDo you want to recover your langs.xml?"), TEXT("Configurator"),MB_YESNO); - } - else - doRecover = true; - - if (doRecover) + BOOL doRecover = FALSE; + if (::PathFileExists(langs_xml_path.c_str())) + { + struct _stat buf; + + if (generic_stat(langs_xml_path.c_str(), &buf)==0) + if (buf.st_size == 0) + doRecover = ::MessageBox(NULL, TEXT("Load langs.xml failed!\rDo you want to recover your langs.xml?"), TEXT("Configurator"),MB_YESNO); + } + else + doRecover = true; + + if (doRecover) { generic_string srcLangsPath(_nppPath); PathAppend(srcLangsPath, TEXT("langs.model.xml")); @@ -1040,7 +1062,7 @@ bool NppParameters::load() } _pXmlDoc = new TiXmlDocument(langs_xml_path); - + bool loadOkay = _pXmlDoc->LoadFile(); if (!loadOkay) @@ -1058,7 +1080,7 @@ bool NppParameters::load() //---------------------------// generic_string configPath(_userPath); PathAppend(configPath, TEXT("config.xml")); - + generic_string srcConfigPath(_nppPath); PathAppend(srcConfigPath, TEXT("config.model.xml")); @@ -1098,7 +1120,7 @@ bool NppParameters::load() //----------------------------// // stylers.xml : for per user // //----------------------------// - + _stylerPath = _userPath; PathAppend(_stylerPath, TEXT("stylers.xml")); @@ -1148,11 +1170,11 @@ bool NppParameters::load() } else getUserDefineLangsFromXmlTree(); - + //----------------------------------------------// - // nativeLang.xml : for per user // + // nativeLang.xml : for per user // // In case of absence of user's nativeLang.xml, // - // We'll look in the Notepad++ Dir. // + // We'll look in the Notepad++ Dir. // //----------------------------------------------// generic_string nativeLangPath; @@ -1232,7 +1254,7 @@ bool NppParameters::load() getMacrosFromXmlTree(); getUserCmdsFromXmlTree(); - // fill out _scintillaModifiedKeys : + // fill out _scintillaModifiedKeys : // those user defined Scintilla key will be used remap Scintilla Key Array getScintKeysFromXmlTree(); } @@ -1263,7 +1285,7 @@ bool NppParameters::load() //----------------------------// // session.xml : for per user // //----------------------------// - + PathAppend(_sessionPath, TEXT("session.xml")); // Don't load session.xml if not required in order to speed up!! @@ -1285,21 +1307,21 @@ bool NppParameters::load() _pXmlSessionDoc = NULL; } - //------------------------------// + //------------------------------// // blacklist.xml : for per user // //------------------------------// _blacklistPath = _userPath; PathAppend(_blacklistPath, TEXT("blacklist.xml")); - if (PathFileExists(_blacklistPath.c_str())) + if (PathFileExists(_blacklistPath.c_str())) { - _pXmlBlacklistDoc = new TiXmlDocument(_blacklistPath); - loadOkay = _pXmlBlacklistDoc->LoadFile(); - if (loadOkay) - { - getBlackListFromXmlTree(); - } - } + _pXmlBlacklistDoc = new TiXmlDocument(_blacklistPath); + loadOkay = _pXmlBlacklistDoc->LoadFile(); + if (loadOkay) + { + getBlackListFromXmlTree(); + } + } return isAllLaoded; } @@ -1318,9 +1340,9 @@ void NppParameters::destroyInstance() delete _pXmlUserStylerDoc; if (_pXmlUserLangDoc) - { + { delete _pXmlUserLangDoc; - } + } for (int i = 0 ; i < _nbImportedULD ; ++i) { @@ -1351,12 +1373,149 @@ void NppParameters::destroyInstance() _pSelf = NULL; } + +void NppParameters::saveConfig_xml() +{ + if (_pXmlUserDoc) + _pXmlUserDoc->SaveFile(); +} + + +void NppParameters::setWorkSpaceFilePath(int i, const TCHAR* wsFile) +{ + if (i < 0 || i > 2 || !wsFile) + return; + _workSpaceFilePathes[i] = wsFile; +} + + +void NppParameters::removeTransparent(HWND hwnd) +{ + if (hwnd != NULL) + ::SetWindowLongPtr(hwnd, GWL_EXSTYLE, ::GetWindowLongPtr(hwnd, GWL_EXSTYLE) & ~0x00080000); +} + + +void NppParameters::SetTransparent(HWND hwnd, int percent) +{ + if (!_transparentFuncAddr) + return; + + ::SetWindowLongPtr(hwnd, GWL_EXSTYLE, ::GetWindowLongPtr(hwnd, GWL_EXSTYLE) | 0x00080000); + if (percent > 255) + percent = 255; + if (percent < 0) + percent = 0; + _transparentFuncAddr(hwnd, 0, percent, 0x00000002); +} + + +bool NppParameters::isExistingExternalLangName(const TCHAR *newName) const +{ + if ((!newName) || (!newName[0])) + return true; + + for (int i = 0 ; i < _nbExternalLang ; ++i) + { + if (!lstrcmp(_externalLangArray[i]->_name, newName)) + return true; + } + return false; +} + + +const TCHAR* NppParameters::getUserDefinedLangNameFromExt(TCHAR *ext, TCHAR *fullName) const +{ + if ((!ext) || (!ext[0])) + return nullptr; + + std::vector extVect; + for (int i = 0 ; i < _nbUserLang ; ++i) + { + extVect.clear(); + cutString(_userLangArray[i]->_ext.c_str(), extVect); + + for (size_t j = 0, len = extVect.size(); j < len; ++j) + { + if (!generic_stricmp(extVect[j].c_str(), ext) || (_tcschr(fullName, '.') && !generic_stricmp(extVect[j].c_str(), fullName))) + return _userLangArray[i]->_name.c_str(); + } + } + return nullptr; +} + + +int NppParameters::getExternalLangIndexFromName(const TCHAR* externalLangName) const +{ + for (int i = 0 ; i < _nbExternalLang ; ++i) + { + if (!lstrcmp(externalLangName, _externalLangArray[i]->_name)) + return i; + } + return -1; +} + + +UserLangContainer* NppParameters::getULCFromName(const TCHAR *userLangName) +{ + for (int i = 0 ; i < _nbUserLang ; ++i) + { + if (0 == lstrcmp(userLangName, _userLangArray[i]->_name.c_str())) + return _userLangArray[i]; + } + + //qui doit etre jamais passer + return nullptr; +} + + +COLORREF NppParameters::getCurLineHilitingColour() +{ + int i = _widgetStyleArray.getStylerIndexByName(TEXT("Current line background colour")); + if (i == -1) + return i; + Style & style = _widgetStyleArray.getStyler(i); + return style._bgColor; +} + + +void NppParameters::setCurLineHilitingColour(COLORREF colour2Set) +{ + int i = _widgetStyleArray.getStylerIndexByName(TEXT("Current line background colour")); + if (i == -1) + return; + + Style& style = _widgetStyleArray.getStyler(i); + style._bgColor = colour2Set; +} + + + +static int CALLBACK EnumFontFamExProc(const LOGFONT* lpelfe, const TEXTMETRIC*, DWORD, LPARAM lParam) +{ + std::vector& strVect = *(std::vector *)lParam; + const size_t vectSize = strVect.size(); + const TCHAR* lfFaceName = ((ENUMLOGFONTEX*)lpelfe)->elfLogFont.lfFaceName; + + //Search through all the fonts, EnumFontFamiliesEx never states anything about order + //Start at the end though, that's the most likely place to find a duplicate + for (int i = vectSize - 1 ; i >= 0 ; i--) + { + if (0 == lstrcmp(strVect[i].c_str(), lfFaceName)) + return 1; //we already have seen this typeface, ignore it + } + + //We can add the font + //Add the face name and not the full name, we do not care about any styles + strVect.push_back(lfFaceName); + return 1; // I want to get all fonts +} + void NppParameters::setFontList(HWND hWnd) { //---------------// // Sys font list // //---------------// - LOGFONT lf; _fontlist.clear(); _fontlist.push_back(TEXT("")); @@ -1365,18 +1524,17 @@ void NppParameters::setFontList(HWND hWnd) lf.lfFaceName[0]='\0'; lf.lfPitchAndFamily = 0; HDC hDC = ::GetDC(hWnd); - ::EnumFontFamiliesEx(hDC, &lf, EnumFontFamExProc, (LPARAM)&_fontlist, 0); } void NppParameters::getLangKeywordsFromXmlTree() { - TiXmlNode *root = - _pXmlDoc->FirstChild(TEXT("NotepadPlus")); + TiXmlNode *root = + _pXmlDoc->FirstChild(TEXT("NotepadPlus")); if (!root) return; feedKeyWordsParameters(root); } - + void NppParameters::getExternalLexerFromXmlTree(TiXmlDocument *doc) { TiXmlNode *root = doc->FirstChild(TEXT("NotepadPlus")); @@ -1424,7 +1582,7 @@ bool NppParameters::getUserParametersFromXmlTree() //Get Find history parameters feedFindHistoryParameters(root); - + //Get Project Panel parameters feedProjectPanelsParameters(root); @@ -1435,9 +1593,9 @@ bool NppParameters::getUserDefineLangsFromXmlTree(TiXmlDocument *tixmldoc) { if (!tixmldoc) return false; - + TiXmlNode *root = tixmldoc->FirstChild(TEXT("NotepadPlus")); - if (!root) + if (!root) return false; return feedUserLang(root); @@ -1449,9 +1607,9 @@ bool NppParameters::getShortcutsFromXmlTree() { if (!_pXmlShortcutDoc) return false; - + TiXmlNode *root = _pXmlShortcutDoc->FirstChild(TEXT("NotepadPlus")); - if (!root) + if (!root) return false; feedShortcut(root); @@ -1462,9 +1620,9 @@ bool NppParameters::getMacrosFromXmlTree() { if (!_pXmlShortcutDoc) return false; - + TiXmlNode *root = _pXmlShortcutDoc->FirstChild(TEXT("NotepadPlus")); - if (!root) + if (!root) return false; feedMacros(root); @@ -1475,9 +1633,9 @@ bool NppParameters::getUserCmdsFromXmlTree() { if (!_pXmlShortcutDoc) return false; - + TiXmlNode *root = _pXmlShortcutDoc->FirstChild(TEXT("NotepadPlus")); - if (!root) + if (!root) return false; feedUserCmds(root); @@ -1489,9 +1647,9 @@ bool NppParameters::getPluginCmdsFromXmlTree() { if (!_pXmlShortcutDoc) return false; - + TiXmlNode *root = _pXmlShortcutDoc->FirstChild(TEXT("NotepadPlus")); - if (!root) + if (!root) return false; feedPluginCustomizedCmds(root); @@ -1503,9 +1661,9 @@ bool NppParameters::getScintKeysFromXmlTree() { if (!_pXmlShortcutDoc) return false; - + TiXmlNode *root = _pXmlShortcutDoc->FirstChild(TEXT("NotepadPlus")); - if (!root) + if (!root) return false; feedScintKeys(root); @@ -1514,21 +1672,21 @@ bool NppParameters::getScintKeysFromXmlTree() bool NppParameters::getBlackListFromXmlTree() { - if (!_pXmlBlacklistDoc) + if (!_pXmlBlacklistDoc) return false; - + TiXmlNode *root = _pXmlBlacklistDoc->FirstChild(TEXT("NotepadPlus")); - if (!root) + if (!root) return false; return feedBlacklist(root); } -void NppParameters::initMenuKeys() +void NppParameters::initMenuKeys() { int nrCommands = sizeof(winKeyDefs)/sizeof(WinMenuKeyDefinition); WinMenuKeyDefinition wkd; - for(int i = 0; i < nrCommands; ++i) + for(int i = 0; i < nrCommands; ++i) { wkd = winKeyDefs[i]; Shortcut sc((wkd.specialName?wkd.specialName:TEXT("")), wkd.isCtrl, wkd.isAlt, wkd.isShift, (unsigned char)wkd.vKey); @@ -1544,7 +1702,7 @@ void NppParameters::initScintillaKeys() { ScintillaKeyDefinition skd; int prevIndex = -1; int prevID = -1; - for(int i = 0; i < nrCommands; ++i) + for(int i = 0; i < nrCommands; ++i) { skd = scintKeyDefs[i]; if (skd.functionId == prevID) @@ -1660,7 +1818,7 @@ bool NppParameters::getContextMenuFromXmlTree(HMENU mainMenuHadle, HMENU plugins if (!_pXmlContextMenuDocA) return false; TiXmlNodeA *root = _pXmlContextMenuDocA->FirstChild("NotepadPlus"); - if (!root) + if (!root) return false; WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); @@ -1728,7 +1886,7 @@ bool NppParameters::getContextMenuFromXmlTree(HMENU mainMenuHadle, HMENU plugins void NppParameters::setWorkingDir(const TCHAR * newPath) { - if (newPath && newPath[0]) + if (newPath && newPath[0]) { _currentDirectory = newPath; } @@ -1772,11 +1930,11 @@ bool NppParameters::getSessionFromXmlTree(TiXmlDocument *pSessionDoc, Session *p if (!*ppSessionDoc) return false; - + TiXmlNode *root = (*ppSessionDoc)->FirstChild(TEXT("NotepadPlus")); - if (!root) + if (!root) return false; - + TiXmlNode *sessionRoot = root->FirstChildElement(TEXT("Session")); if (!sessionRoot) return false; @@ -1863,7 +2021,7 @@ bool NppParameters::getSessionFromXmlTree(TiXmlDocument *pSessionDoc, Session *p } } } - + return true; } @@ -1906,7 +2064,7 @@ void NppParameters::feedProjectPanelsParameters(TiXmlNode *node) { TiXmlNode *projPanelRoot = node->FirstChildElement(TEXT("ProjectPanels")); if (!projPanelRoot) return; - + for (TiXmlNode *childNode = projPanelRoot->FirstChildElement(TEXT("ProjectPanel")); childNode; childNode = childNode->NextSibling(TEXT("ProjectPanel")) ) @@ -1933,13 +2091,13 @@ void NppParameters::feedFindHistoryParameters(TiXmlNode *node) if ((_findHistory._nbMaxFindHistoryPath > 0) && (_findHistory._nbMaxFindHistoryPath <= NB_MAX_FINDHISTORY_PATH)) { for (TiXmlNode *childNode = findHistoryRoot->FirstChildElement(TEXT("Path")); - childNode && (_findHistory._findHistoryPaths.size() < NB_MAX_FINDHISTORY_PATH); + childNode && (_findHistory._findHistoryPaths.size() < NB_MAX_FINDHISTORY_PATH); childNode = childNode->NextSibling(TEXT("Path")) ) { const TCHAR *filePath = (childNode->ToElement())->Attribute(TEXT("name")); if (filePath) { - _findHistory._findHistoryPaths.push_back(generic_string(filePath)); + _findHistory._findHistoryPaths.push_back(generic_string(filePath)); } } } @@ -2058,9 +2216,9 @@ void NppParameters::feedShortcut(TiXmlNode *node) { //find the commandid that matches this Shortcut sc and alter it, push back its index in the modified list, if not present int len = (int)_shortcuts.size(); - for(int i = 0; i < len; ++i) + for(int i = 0; i < len; ++i) { - if (_shortcuts[i].getID() == (unsigned long)id) + if (_shortcuts[i].getID() == (unsigned long)id) { //found our match getShortcuts(childNode, _shortcuts[i]); addUserModifiedIndex(i); @@ -2172,10 +2330,10 @@ void NppParameters::feedPluginCustomizedCmds(TiXmlNode *node) //Find the corresponding plugincommand and alter it, put the index in the list int len = (int)_pluginCommands.size(); - for(int i = 0; i < len; ++i) + for(int i = 0; i < len; ++i) { PluginCmdShortcut & pscOrig = _pluginCommands[i]; - if (!generic_strnicmp(pscOrig.getModuleName(), moduleName, lstrlen(moduleName)) && pscOrig.getInternalID() == internalID) + if (!generic_strnicmp(pscOrig.getModuleName(), moduleName, lstrlen(moduleName)) && pscOrig.getInternalID() == internalID) { //Found matching command getShortcuts(childNode, _pluginCommands[i]); @@ -2204,10 +2362,10 @@ void NppParameters::feedScintKeys(TiXmlNode *node) keyStr = (childNode->ToElement())->Attribute(TEXT("menuCmdID"), &menuID); if (!keyStr) continue; - + //Find the corresponding scintillacommand and alter it, put the index in the list size_t len = _scintillaKeyCommands.size(); - for(size_t i = 0; i < len; ++i) + for(size_t i = 0; i < len; ++i) { ScintillaKeyMap & skmOrig = _scintillaKeyCommands[i]; if (skmOrig.getScintillaKeyID() == (unsigned long)scintKey && skmOrig.getMenuCmdID() == menuID) @@ -2259,13 +2417,13 @@ bool NppParameters::feedBlacklist(TiXmlNode *node) childNode ; childNode = childNode->NextSibling(TEXT("Plugin")) ) { - const TCHAR *name = (childNode->ToElement())->Attribute(TEXT("name")); - if (name) - { - _blacklist.push_back(name); - } - } - return true; + const TCHAR *name = (childNode->ToElement())->Attribute(TEXT("name")); + if (name) + { + _blacklist.push_back(name); + } + } + return true; } bool NppParameters::getShortcuts(TiXmlNode *node, Shortcut & sc) @@ -2303,8 +2461,8 @@ bool NppParameters::getShortcuts(TiXmlNode *node, Shortcut & sc) bool NppParameters::feedUserLang(TiXmlNode *node) { - bool isEverythingOK = true; - bool hasFoundElement = false; + bool isEverythingOK = true; + bool hasFoundElement = false; for (TiXmlNode *childNode = node->FirstChildElement(TEXT("UserLang")); childNode && (_nbUserLang < NB_MAX_USER_LANG); @@ -2313,7 +2471,7 @@ bool NppParameters::feedUserLang(TiXmlNode *node) const TCHAR *name = (childNode->ToElement())->Attribute(TEXT("name")); const TCHAR *ext = (childNode->ToElement())->Attribute(TEXT("ext")); const TCHAR *udlVersion = (childNode->ToElement())->Attribute(TEXT("udlVersion")); - hasFoundElement = true; + hasFoundElement = true; try { if (!name || !name[0] || !ext) throw std::runtime_error("NppParameters::feedUserLang : UserLang name is missing"); @@ -2325,7 +2483,7 @@ bool NppParameters::feedUserLang(TiXmlNode *node) ++_nbUserLang; TiXmlNode *settingsRoot = childNode->FirstChildElement(TEXT("Settings")); - if (!settingsRoot) + if (!settingsRoot) throw std::runtime_error("NppParameters::feedUserLang : Settings node is missing"); feedUserSettings(settingsRoot); @@ -2342,7 +2500,7 @@ bool NppParameters::feedUserLang(TiXmlNode *node) feedUserStyles(stylesRoot); - // styles that were not read from xml file should get default values + // styles that were not read from xml file should get default values for (int i=0; i_styleArray.getStyler(i); @@ -2352,49 +2510,49 @@ bool NppParameters::feedUserLang(TiXmlNode *node) } catch (std::exception e) { delete _userLangArray[--_nbUserLang]; - isEverythingOK = false; + isEverythingOK = false; } } - if (isEverythingOK) - isEverythingOK = hasFoundElement; - return isEverythingOK; + if (isEverythingOK) + isEverythingOK = hasFoundElement; + return isEverythingOK; } bool NppParameters::importUDLFromFile(generic_string sourceFile) { if (_nbImportedULD >= NB_MAX_IMPORTED_UDL) return false; - - TiXmlDocument *pXmlUserLangDoc = new TiXmlDocument(sourceFile); + + TiXmlDocument *pXmlUserLangDoc = new TiXmlDocument(sourceFile); bool loadOkay = pXmlUserLangDoc->LoadFile(); if (loadOkay) { loadOkay = getUserDefineLangsFromXmlTree(pXmlUserLangDoc); - } + } _importedULD[_nbImportedULD++] = pXmlUserLangDoc; - return loadOkay; + return loadOkay; } bool NppParameters::exportUDLToFile(int langIndex2export, generic_string fileName2save) { - if (langIndex2export != -1 && langIndex2export >= _nbUserLang) - return false; + if (langIndex2export != -1 && langIndex2export >= _nbUserLang) + return false; - TiXmlDocument *pNewXmlUserLangDoc = new TiXmlDocument(fileName2save); - TiXmlNode *newRoot2export = pNewXmlUserLangDoc->InsertEndChild(TiXmlElement(TEXT("NotepadPlus"))); + TiXmlDocument *pNewXmlUserLangDoc = new TiXmlDocument(fileName2save); + TiXmlNode *newRoot2export = pNewXmlUserLangDoc->InsertEndChild(TiXmlElement(TEXT("NotepadPlus"))); + + bool b = false; - bool b = false; - if ( langIndex2export >= NB_MAX_USER_LANG ) { return false; } - insertUserLang2Tree(newRoot2export, _userLangArray[langIndex2export]); - b = pNewXmlUserLangDoc->SaveFile(); - - delete pNewXmlUserLangDoc; - return b; + insertUserLang2Tree(newRoot2export, _userLangArray[langIndex2export]); + b = pNewXmlUserLangDoc->SaveFile(); + + delete pNewXmlUserLangDoc; + return b; } LangType NppParameters::getLangFromExt(const TCHAR *ext) @@ -2411,7 +2569,7 @@ LangType NppParameters::getLangFromExt(const TCHAR *ext) LexerStylerArray &lsa = getLStylerArray(); const TCHAR *lName = l->getLangName(); LexerStyler *pLS = lsa.getLexerStylerByName(lName); - + if (pLS) userList = pLS->getLexerUserExt(); @@ -2490,7 +2648,7 @@ bool NppParameters::writeSettingsFilesOnCloudForThe1stTime(const generic_string { return false; } - + // config.xml generic_string cloudConfigPath = cloudSettingsPath; PathAppend(cloudConfigPath, TEXT("config.xml")); @@ -2568,7 +2726,7 @@ bool NppParameters::writeSettingsFilesOnCloudForThe1stTime(const generic_string if (!isOK) return false; } - + /* // functionList.xml generic_string cloudFunctionListPath = cloudSettingsPath; @@ -2594,11 +2752,11 @@ void NppParameters::writeUserDefinedLang() stylerStrOp(DUP); TiXmlNode *root = _pXmlUserLangDoc->FirstChild(TEXT("NotepadPlus")); - if (root) + if (root) { _pXmlUserLangDoc->RemoveChild(root); } - + _pXmlUserLangDoc->InsertEndChild(TiXmlElement(TEXT("NotepadPlus"))); root = _pXmlUserLangDoc->FirstChild(TEXT("NotepadPlus")); @@ -2623,6 +2781,7 @@ void NppParameters::insertCmd(TiXmlNode *shortcutsRoot, const CommandShortcut & sc->ToElement()->SetAttribute(TEXT("Key"), key._key); } + void NppParameters::insertMacro(TiXmlNode *macrosRoot, const MacroShortcut & macro) { const KeyCombo & key = macro.getKeyCombo(); @@ -2632,6 +2791,7 @@ void NppParameters::insertMacro(TiXmlNode *macrosRoot, const MacroShortcut & mac macroRoot->ToElement()->SetAttribute(TEXT("Alt"), key._isAlt?TEXT("yes"):TEXT("no")); macroRoot->ToElement()->SetAttribute(TEXT("Shift"), key._isShift?TEXT("yes"):TEXT("no")); macroRoot->ToElement()->SetAttribute(TEXT("Key"), key._key); + for (size_t i = 0, len = macro._macro.size(); i < len ; ++i) { TiXmlNode *actionNode = macroRoot->InsertEndChild(TiXmlElement(TEXT("Action"))); @@ -2644,6 +2804,7 @@ void NppParameters::insertMacro(TiXmlNode *macrosRoot, const MacroShortcut & mac } } + void NppParameters::insertUserCmd(TiXmlNode *userCmdRoot, const UserCommand & userCmd) { const KeyCombo & key = userCmd.getKeyCombo(); @@ -2656,6 +2817,7 @@ void NppParameters::insertUserCmd(TiXmlNode *userCmdRoot, const UserCommand & us cmdRoot->InsertEndChild(TiXmlText(userCmd._cmd.c_str())); } + void NppParameters::insertPluginCmd(TiXmlNode *pluginCmdRoot, const PluginCmdShortcut & pluginCmd) { const KeyCombo & key = pluginCmd.getKeyCombo(); @@ -2668,6 +2830,7 @@ void NppParameters::insertPluginCmd(TiXmlNode *pluginCmdRoot, const PluginCmdSho pluginCmdNode->ToElement()->SetAttribute(TEXT("Key"), key._key); } + void NppParameters::insertScintKey(TiXmlNode *scintKeyRoot, const ScintillaKeyMap & scintKeyMap) { TiXmlNode *keyRoot = scintKeyRoot->InsertEndChild(TiXmlElement(TEXT("ScintKey"))); @@ -2683,9 +2846,11 @@ void NppParameters::insertScintKey(TiXmlNode *scintKeyRoot, const ScintillaKeyMa //Add additional shortcuts size_t size = scintKeyMap.getSize(); - if (size > 1) { + if (size > 1) + { TiXmlNode * keyNext; - for(size_t i = 1; i < size; ++i) { + for (size_t i = 1; i < size; ++i) + { keyNext = keyRoot->InsertEndChild(TiXmlElement(TEXT("NextKey"))); key = scintKeyMap.getKeyComboByIndex(i); keyNext->ToElement()->SetAttribute(TEXT("Ctrl"), key._isCtrl?TEXT("yes"):TEXT("no")); @@ -2696,6 +2861,7 @@ void NppParameters::insertScintKey(TiXmlNode *scintKeyRoot, const ScintillaKeyMa } } + void NppParameters::writeSession(const Session & session, const TCHAR *fileName) { const TCHAR *pathName = fileName?fileName:_sessionPath.c_str(); @@ -2760,9 +2926,9 @@ void NppParameters::writeSession(const Session & session, const TCHAR *fileName) } } _pXmlSessionDoc->SaveFile(); - } + void NppParameters::writeShortcuts() { if (!_pXmlShortcutDoc) @@ -2803,9 +2969,9 @@ void NppParameters::writeShortcuts() TiXmlNode *userCmdRoot = root->FirstChild(TEXT("UserDefinedCommands")); if (userCmdRoot) root->RemoveChild(userCmdRoot); - + userCmdRoot = root->InsertEndChild(TiXmlElement(TEXT("UserDefinedCommands"))); - + for (size_t i = 0, len = _userCommands.size(); i < len ; ++i) { insertUserCmd(userCmdRoot, _userCommands[i]); @@ -2833,10 +2999,12 @@ void NppParameters::writeShortcuts() _pXmlShortcutDoc->SaveFile(); } + int NppParameters::addUserLangToEnd(const UserLangContainer & userLang, const TCHAR *newName) { if (isExistingUserLangName(newName)) return -1; + _userLangArray[_nbUserLang] = new UserLangContainer(); *(_userLangArray[_nbUserLang]) = userLang; _userLangArray[_nbUserLang]->_name = newName; @@ -2844,6 +3012,7 @@ int NppParameters::addUserLangToEnd(const UserLangContainer & userLang, const TC return _nbUserLang-1; } + void NppParameters::removeUserLang(int index) { if (index >= _nbUserLang ) @@ -2854,6 +3023,7 @@ void NppParameters::removeUserLang(int index) _nbUserLang--; } + void NppParameters::feedUserSettings(TiXmlNode *settingsRoot) { const TCHAR *boolStr; @@ -2862,129 +3032,130 @@ void NppParameters::feedUserSettings(TiXmlNode *settingsRoot) { boolStr = (globalSettingNode->ToElement())->Attribute(TEXT("caseIgnored")); if (boolStr) - _userLangArray[_nbUserLang - 1]->_isCaseIgnored = !lstrcmp(TEXT("yes"), boolStr); + _userLangArray[_nbUserLang - 1]->_isCaseIgnored = !lstrcmp(TEXT("yes"), boolStr); boolStr = (globalSettingNode->ToElement())->Attribute(TEXT("allowFoldOfComments")); if (boolStr) - _userLangArray[_nbUserLang - 1]->_allowFoldOfComments = !lstrcmp(TEXT("yes"), boolStr); + _userLangArray[_nbUserLang - 1]->_allowFoldOfComments = !lstrcmp(TEXT("yes"), boolStr); (globalSettingNode->ToElement())->Attribute(TEXT("forcePureLC"), &_userLangArray[_nbUserLang - 1]->_forcePureLC); (globalSettingNode->ToElement())->Attribute(TEXT("decimalSeparator"), &_userLangArray[_nbUserLang - 1]->_decimalSeparator); boolStr = (globalSettingNode->ToElement())->Attribute(TEXT("foldCompact")); if (boolStr) - _userLangArray[_nbUserLang - 1]->_foldCompact = !lstrcmp(TEXT("yes"), boolStr); + _userLangArray[_nbUserLang - 1]->_foldCompact = !lstrcmp(TEXT("yes"), boolStr); } TiXmlNode *prefixNode = settingsRoot->FirstChildElement(TEXT("Prefix")); if (prefixNode) { - const TCHAR *udlVersion = _userLangArray[_nbUserLang - 1]->_udlVersion.c_str(); - if (!lstrcmp(udlVersion, TEXT("2.1")) || !lstrcmp(udlVersion, TEXT("2.0"))) - { - for (int i = 0 ; i < SCE_USER_TOTAL_KEYWORD_GROUPS ; ++i) - { - boolStr = (prefixNode->ToElement())->Attribute(globalMappper().keywordNameMapper[i+SCE_USER_KWLIST_KEYWORDS1]); - if (boolStr) - _userLangArray[_nbUserLang - 1]->_isPrefix[i] = !lstrcmp(TEXT("yes"), boolStr); - } - } - else // support for old style (pre 2.0) - { - TCHAR names[SCE_USER_TOTAL_KEYWORD_GROUPS][7] = {TEXT("words1"), TEXT("words2"), TEXT("words3"), TEXT("words4")}; - for (int i = 0 ; i < 4 ; ++i) - { - boolStr = (prefixNode->ToElement())->Attribute(names[i]); - if (boolStr) - _userLangArray[_nbUserLang - 1]->_isPrefix[i] = !lstrcmp(TEXT("yes"), boolStr); - } - } + const TCHAR *udlVersion = _userLangArray[_nbUserLang - 1]->_udlVersion.c_str(); + if (!lstrcmp(udlVersion, TEXT("2.1")) || !lstrcmp(udlVersion, TEXT("2.0"))) + { + for (int i = 0 ; i < SCE_USER_TOTAL_KEYWORD_GROUPS ; ++i) + { + boolStr = (prefixNode->ToElement())->Attribute(globalMappper().keywordNameMapper[i+SCE_USER_KWLIST_KEYWORDS1]); + if (boolStr) + _userLangArray[_nbUserLang - 1]->_isPrefix[i] = !lstrcmp(TEXT("yes"), boolStr); + } + } + else // support for old style (pre 2.0) + { + TCHAR names[SCE_USER_TOTAL_KEYWORD_GROUPS][7] = {TEXT("words1"), TEXT("words2"), TEXT("words3"), TEXT("words4")}; + for (int i = 0 ; i < 4 ; ++i) + { + boolStr = (prefixNode->ToElement())->Attribute(names[i]); + if (boolStr) + _userLangArray[_nbUserLang - 1]->_isPrefix[i] = !lstrcmp(TEXT("yes"), boolStr); + } + } } } + void NppParameters::feedUserKeywordList(TiXmlNode *node) { - const TCHAR * udlVersion = _userLangArray[_nbUserLang - 1]->_udlVersion.c_str(); - const TCHAR * keywordsName = NULL; - TCHAR *kwl = NULL; - int id = -1; + const TCHAR * udlVersion = _userLangArray[_nbUserLang - 1]->_udlVersion.c_str(); + const TCHAR * keywordsName = nullptr; + TCHAR *kwl = nullptr; + int id = -1; for (TiXmlNode *childNode = node->FirstChildElement(TEXT("Keywords")); childNode ; childNode = childNode->NextSibling(TEXT("Keywords"))) { keywordsName = (childNode->ToElement())->Attribute(TEXT("name")); - kwl = NULL; + kwl = nullptr; - TiXmlNode *valueNode = childNode->FirstChild(); - if (valueNode) - { - if (!lstrcmp(udlVersion, TEXT("")) && !lstrcmp(keywordsName, TEXT("Delimiters"))) // support for old style (pre 2.0) - { - basic_string temp = TEXT(""); - kwl = (valueNode)?valueNode->Value():TEXT("000000"); - - temp += TEXT("00"); if (kwl[0] != '0') temp += kwl[0]; temp += TEXT(" 01"); - temp += TEXT(" 02"); if (kwl[3] != '0') temp += kwl[3]; - temp += TEXT(" 03"); if (kwl[1] != '0') temp += kwl[1]; temp += TEXT(" 04"); - temp += TEXT(" 05"); if (kwl[4] != '0') temp += kwl[4]; - temp += TEXT(" 06"); if (kwl[2] != '0') temp += kwl[2]; temp += TEXT(" 07"); - temp += TEXT(" 08"); if (kwl[5] != '0') temp += kwl[5]; - - temp += TEXT(" 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23"); - lstrcpy(_userLangArray[_nbUserLang - 1]->_keywordLists[SCE_USER_KWLIST_DELIMITERS], temp.c_str()); - } - else if (!lstrcmp(keywordsName, TEXT("Comment"))) - { - kwl = (valueNode)?valueNode->Value():TEXT(""); - //int len = _tcslen(kwl); - basic_string temp = TEXT(" "); - - temp += kwl; - size_t pos = 0; - - pos = temp.find(TEXT(" 0")); - while (pos != string::npos) - { - temp.replace(pos, 2, TEXT(" 00")); - pos = temp.find(TEXT(" 0"), pos+1); - } - pos = temp.find(TEXT(" 1")); - while (pos != string::npos) - { - temp.replace(pos, 2, TEXT(" 03")); - pos = temp.find(TEXT(" 1")); - } - pos = temp.find(TEXT(" 2")); - while (pos != string::npos) - { - temp.replace(pos, 2, TEXT(" 04")); - pos = temp.find(TEXT(" 2")); - } - - temp += TEXT(" 01 02"); - if (temp[0] == ' ') - temp.erase(0, 1); - - lstrcpy(_userLangArray[_nbUserLang - 1]->_keywordLists[SCE_USER_KWLIST_COMMENTS], temp.c_str()); - } - else - { - kwl = (valueNode)?valueNode->Value():TEXT(""); - if (globalMappper().keywordIdMapper.find(keywordsName) != globalMappper().keywordIdMapper.end()) - { - id = globalMappper().keywordIdMapper[keywordsName]; - lstrcpy(_userLangArray[_nbUserLang - 1]->_keywordLists[id], kwl); - } - } - } + TiXmlNode *valueNode = childNode->FirstChild(); + if (valueNode) + { + if (!lstrcmp(udlVersion, TEXT("")) && !lstrcmp(keywordsName, TEXT("Delimiters"))) // support for old style (pre 2.0) + { + basic_string temp = TEXT(""); + kwl = (valueNode)?valueNode->Value():TEXT("000000"); + + temp += TEXT("00"); if (kwl[0] != '0') temp += kwl[0]; temp += TEXT(" 01"); + temp += TEXT(" 02"); if (kwl[3] != '0') temp += kwl[3]; + temp += TEXT(" 03"); if (kwl[1] != '0') temp += kwl[1]; temp += TEXT(" 04"); + temp += TEXT(" 05"); if (kwl[4] != '0') temp += kwl[4]; + temp += TEXT(" 06"); if (kwl[2] != '0') temp += kwl[2]; temp += TEXT(" 07"); + temp += TEXT(" 08"); if (kwl[5] != '0') temp += kwl[5]; + + temp += TEXT(" 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23"); + lstrcpy(_userLangArray[_nbUserLang - 1]->_keywordLists[SCE_USER_KWLIST_DELIMITERS], temp.c_str()); + } + else if (!lstrcmp(keywordsName, TEXT("Comment"))) + { + kwl = (valueNode)?valueNode->Value():TEXT(""); + //int len = _tcslen(kwl); + basic_string temp = TEXT(" "); + + temp += kwl; + size_t pos = 0; + + pos = temp.find(TEXT(" 0")); + while (pos != string::npos) + { + temp.replace(pos, 2, TEXT(" 00")); + pos = temp.find(TEXT(" 0"), pos+1); + } + pos = temp.find(TEXT(" 1")); + while (pos != string::npos) + { + temp.replace(pos, 2, TEXT(" 03")); + pos = temp.find(TEXT(" 1")); + } + pos = temp.find(TEXT(" 2")); + while (pos != string::npos) + { + temp.replace(pos, 2, TEXT(" 04")); + pos = temp.find(TEXT(" 2")); + } + + temp += TEXT(" 01 02"); + if (temp[0] == ' ') + temp.erase(0, 1); + + lstrcpy(_userLangArray[_nbUserLang - 1]->_keywordLists[SCE_USER_KWLIST_COMMENTS], temp.c_str()); + } + else + { + kwl = (valueNode)?valueNode->Value():TEXT(""); + if (globalMappper().keywordIdMapper.find(keywordsName) != globalMappper().keywordIdMapper.end()) + { + id = globalMappper().keywordIdMapper[keywordsName]; + lstrcpy(_userLangArray[_nbUserLang - 1]->_keywordLists[id], kwl); + } + } + } } } void NppParameters::feedUserStyles(TiXmlNode *node) { - const TCHAR *styleName = NULL; - int id = -1; + const TCHAR *styleName = NULL; + int id = -1; for (TiXmlNode *childNode = node->FirstChildElement(TEXT("WordsStyle")); childNode ; @@ -2993,86 +3164,86 @@ void NppParameters::feedUserStyles(TiXmlNode *node) styleName = (childNode->ToElement())->Attribute(TEXT("name")); if (styleName) { - if (globalMappper().styleIdMapper.find(styleName) != globalMappper().styleIdMapper.end()) - { - id = globalMappper().styleIdMapper[styleName]; + if (globalMappper().styleIdMapper.find(styleName) != globalMappper().styleIdMapper.end()) + { + id = globalMappper().styleIdMapper[styleName]; _userLangArray[_nbUserLang - 1]->_styleArray.addStyler((id | L_USER << 16), childNode); - } + } } } } bool NppParameters::feedStylerArray(TiXmlNode *node) { - TiXmlNode *styleRoot = node->FirstChildElement(TEXT("LexerStyles")); - if (!styleRoot) return false; + TiXmlNode *styleRoot = node->FirstChildElement(TEXT("LexerStyles")); + if (!styleRoot) return false; - // For each lexer - for (TiXmlNode *childNode = styleRoot->FirstChildElement(TEXT("LexerType")); + // For each lexer + for (TiXmlNode *childNode = styleRoot->FirstChildElement(TEXT("LexerType")); childNode ; childNode = childNode->NextSibling(TEXT("LexerType")) ) - { - if (!_lexerStylerArray.hasEnoughSpace()) return false; + { + if (!_lexerStylerArray.hasEnoughSpace()) return false; - TiXmlElement *element = childNode->ToElement(); - const TCHAR *lexerName = element->Attribute(TEXT("name")); + TiXmlElement *element = childNode->ToElement(); + const TCHAR *lexerName = element->Attribute(TEXT("name")); const TCHAR *lexerDesc = element->Attribute(TEXT("desc")); const TCHAR *lexerUserExt = element->Attribute(TEXT("ext")); const TCHAR *lexerExcluded = element->Attribute(TEXT("excluded")); - if (lexerName) - { - _lexerStylerArray.addLexerStyler(lexerName, lexerDesc, lexerUserExt, childNode); + if (lexerName) + { + _lexerStylerArray.addLexerStyler(lexerName, lexerDesc, lexerUserExt, childNode); if (lexerExcluded != NULL && !lstrcmp(lexerExcluded, TEXT("yes"))) { int index = getExternalLangIndexFromName(lexerName); if (index != -1) _nppGUI._excludedLangList.push_back(LangMenuItem((LangType)(index + L_EXTERNAL))); } - } - } + } + } - // The global styles for all lexers - TiXmlNode *globalStyleRoot = node->FirstChildElement(TEXT("GlobalStyles")); - if (!globalStyleRoot) return false; + // The global styles for all lexers + TiXmlNode *globalStyleRoot = node->FirstChildElement(TEXT("GlobalStyles")); + if (!globalStyleRoot) return false; - for (TiXmlNode *childNode = globalStyleRoot->FirstChildElement(TEXT("WidgetStyle")); + for (TiXmlNode *childNode = globalStyleRoot->FirstChildElement(TEXT("WidgetStyle")); childNode ; childNode = childNode->NextSibling(TEXT("WidgetStyle")) ) - { - if (!_widgetStyleArray.hasEnoughSpace()) return false; + { + if (!_widgetStyleArray.hasEnoughSpace()) return false; - TiXmlElement *element = childNode->ToElement(); - const TCHAR *styleIDStr = element->Attribute(TEXT("styleID")); + TiXmlElement *element = childNode->ToElement(); + const TCHAR *styleIDStr = element->Attribute(TEXT("styleID")); - int styleID = -1; + int styleID = -1; if ((styleID = decStrVal(styleIDStr)) != -1) { - _widgetStyleArray.addStyler(styleID, childNode); - } - } + _widgetStyleArray.addStyler(styleID, childNode); + } + } return true; } void LexerStylerArray::addLexerStyler(const TCHAR *lexerName, const TCHAR *lexerDesc, const TCHAR *lexerUserExt , TiXmlNode *lexerNode) { - LexerStyler & ls = _lexerStylerArray[_nbLexerStyler++]; - ls.setLexerName(lexerName); + LexerStyler & ls = _lexerStylerArray[_nbLexerStyler++]; + ls.setLexerName(lexerName); if (lexerDesc) ls.setLexerDesc(lexerDesc); if (lexerUserExt) ls.setLexerUserExt(lexerUserExt); - - for (TiXmlNode *childNode = lexerNode->FirstChildElement(TEXT("WordsStyle")); + + for (TiXmlNode *childNode = lexerNode->FirstChildElement(TEXT("WordsStyle")); childNode ; childNode = childNode->NextSibling(TEXT("WordsStyle")) ) - { - - if (!ls.hasEnoughSpace()) return; + { + if (!ls.hasEnoughSpace()) + return; TiXmlElement *element = childNode->ToElement(); const TCHAR *styleIDStr = element->Attribute(TEXT("styleID")); - + if (styleIDStr) { int styleID = -1; @@ -3081,7 +3252,7 @@ void LexerStylerArray::addLexerStyler(const TCHAR *lexerName, const TCHAR *lexer ls.addStyler(styleID, childNode); } } - } + } } void LexerStylerArray::eraseAll() @@ -3108,11 +3279,11 @@ void StyleArray::addStyler(int styleID, TiXmlNode *styleNode) } _styleArray[index]._styleID = styleID; - + if (styleNode) { TiXmlElement *element = styleNode->ToElement(); - + // TODO: translate to English // Pour _fgColor, _bgColor : // RGB() | (result & 0xFF000000) c'est pour le cas de -1 (0xFFFFFFFF) @@ -3131,9 +3302,9 @@ void StyleArray::addStyler(int styleID, TiXmlNode *styleNode) { unsigned long result = hexStrVal(str); _styleArray[index]._fgColor = (RGB((result >> 16) & 0xFF, (result >> 8) & 0xFF, result & 0xFF)) | (result & 0xFF000000); - + } - + str = element->Attribute(TEXT("bgColor")); if (str) { @@ -3146,16 +3317,16 @@ void StyleArray::addStyler(int styleID, TiXmlNode *styleNode) { _styleArray[index]._colorStyle = decStrVal(str); } - + str = element->Attribute(TEXT("fontName")); _styleArray[index]._fontName = str; - + str = element->Attribute(TEXT("fontStyle")); if (str) { _styleArray[index]._fontStyle = decStrVal(str); } - + str = element->Attribute(TEXT("fontSize")); if (str) { @@ -3186,13 +3357,13 @@ void StyleArray::addStyler(int styleID, TiXmlNode *styleNode) bool NppParameters::writeRecentFileHistorySettings(int nbMaxFile) const { if (!_pXmlUserDoc) return false; - + TiXmlNode *nppRoot = _pXmlUserDoc->FirstChild(TEXT("NotepadPlus")); if (!nppRoot) return false; - + TiXmlNode *historyNode = nppRoot->FirstChildElement(TEXT("History")); if (!historyNode) return false; - + (historyNode->ToElement())->SetAttribute(TEXT("nbMaxFile"), nbMaxFile!=-1?nbMaxFile:_nbMaxRecentFile); (historyNode->ToElement())->SetAttribute(TEXT("inSubMenu"), _putRecentFileInSubMenu?TEXT("yes"):TEXT("no")); (historyNode->ToElement())->SetAttribute(TEXT("customLength"), _recentFileCustomLength); @@ -3202,10 +3373,10 @@ bool NppParameters::writeRecentFileHistorySettings(int nbMaxFile) const bool NppParameters::writeProjectPanelsSettings() const { if (!_pXmlUserDoc) return false; - + TiXmlNode *nppRoot = _pXmlUserDoc->FirstChild(TEXT("NotepadPlus")); if (!nppRoot) return false; - + TiXmlNode *oldProjPanelRootNode = nppRoot->FirstChildElement(TEXT("ProjectPanels")); if (nullptr != oldProjPanelRootNode) { @@ -3238,7 +3409,7 @@ bool NppParameters::writeHistory(const TCHAR *fullpath) TiXmlNode *historyNode = nppRoot->FirstChildElement(TEXT("History")); if (!historyNode) return false; - + TiXmlElement recentFileNode(TEXT("File")); (recentFileNode.ToElement())->SetAttribute(TEXT("filename"), fullpath); @@ -3247,7 +3418,7 @@ bool NppParameters::writeHistory(const TCHAR *fullpath) } TiXmlNode * NppParameters::getChildElementByAttribut(TiXmlNode *pere, const TCHAR *childName,\ - const TCHAR *attributName, const TCHAR *attributVal) const + const TCHAR *attributName, const TCHAR *attributVal) const { for (TiXmlNode *childNode = pere->FirstChildElement(childName); childNode ; @@ -3420,7 +3591,7 @@ generic_string NppParameters::getLocPathFromStr(const generic_string & localizat void NppParameters::feedKeyWordsParameters(TiXmlNode *node) { - + TiXmlNode *langRoot = node->FirstChildElement(TEXT("Languages")); if (!langRoot) return; @@ -3440,9 +3611,9 @@ void NppParameters::feedKeyWordsParameters(TiXmlNode *node) _langList[_nbLang]->setCommentStart(element->Attribute(TEXT("commentStart"))); _langList[_nbLang]->setCommentEnd(element->Attribute(TEXT("commentEnd"))); - int tabSettings; - if (element->Attribute(TEXT("tabSettings"), &tabSettings)) - _langList[_nbLang]->setTabInfo(tabSettings); + int tabSettings; + if (element->Attribute(TEXT("tabSettings"), &tabSettings)) + _langList[_nbLang]->setTabInfo(tabSettings); for (TiXmlNode *kwNode = langNode->FirstChildElement(TEXT("Keywords")); kwNode ; @@ -3655,13 +3826,13 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) if (!lstrcmp(val, TEXT("yes"))) _nppGUI._fileAutoDetection = cdEnabled; else if (!lstrcmp(val, TEXT("auto"))) - _nppGUI._fileAutoDetection = cdAutoUpdate; + _nppGUI._fileAutoDetection = cdAutoUpdate; else if (!lstrcmp(val, TEXT("Update2End"))) - _nppGUI._fileAutoDetection = cdGo2end; + _nppGUI._fileAutoDetection = cdGo2end; else if (!lstrcmp(val, TEXT("autoUpdate2End"))) - _nppGUI._fileAutoDetection = cdAutoUpdateGo2end; - else //(!lstrcmp(val, TEXT("no"))) - _nppGUI._fileAutoDetection = cdDisabled; + _nppGUI._fileAutoDetection = cdAutoUpdateGo2end; + else //(!lstrcmp(val, TEXT("no"))) + _nppGUI._fileAutoDetection = cdDisabled; _nppGUI._fileAutoDetectionOriginalValue = _nppGUI._fileAutoDetection; } @@ -3909,7 +4080,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) _nppGUI._caretBlinkRate = i; } - else if (!lstrcmp(nm, TEXT("ScintillaGlobalSettings"))) + else if (!lstrcmp(nm, TEXT("ScintillaGlobalSettings"))) { const TCHAR* val = element->Attribute(TEXT("enableMultiSelection")); if (val && lstrcmp(val, TEXT("yes")) == 0) @@ -4329,16 +4500,16 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) { const TCHAR* val = n->Value(); if (val) - _nppGUI._autoUpdateOpt._doAutoUpdate = (!lstrcmp(val, TEXT("yes")))?false:true; + _nppGUI._autoUpdateOpt._doAutoUpdate = (!lstrcmp(val, TEXT("yes")))?false:true; - int i; - val = element->Attribute(TEXT("intervalDays"), &i); - if (val) - _nppGUI._autoUpdateOpt._intervalDays = i; + int i; + val = element->Attribute(TEXT("intervalDays"), &i); + if (val) + _nppGUI._autoUpdateOpt._intervalDays = i; - val = element->Attribute(TEXT("nextUpdateDate")); - if (val) - _nppGUI._autoUpdateOpt._nextUpdateDate = Date(val); + val = element->Attribute(TEXT("nextUpdateDate")); + if (val) + _nppGUI._autoUpdateOpt._nextUpdateDate = Date(val); } } else if (!lstrcmp(nm, TEXT("openSaveDir"))) @@ -4397,7 +4568,7 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) else _nppGUI._delimiterSelectionOnEntireDocument = false; } - else if (!lstrcmp(nm, TEXT("multiInst"))) + else if (!lstrcmp(nm, TEXT("multiInst"))) { int val = 0; element->Attribute(TEXT("setting"), &val); @@ -4420,10 +4591,10 @@ void NppParameters::feedGUIParameters(TiXmlNode *node) void NppParameters::feedScintillaParam(TiXmlNode *node) { - TiXmlElement* element = node->ToElement(); + TiXmlElement* element = node->ToElement(); - // Line Number Margin - const TCHAR *nm = element->Attribute(TEXT("lineNumberMargin")); + // Line Number Margin + const TCHAR *nm = element->Attribute(TEXT("lineNumberMargin")); if (nm) { if (!lstrcmp(nm, TEXT("show"))) @@ -4443,8 +4614,8 @@ void NppParameters::feedScintillaParam(TiXmlNode *node) _svp._bookMarkMarginShow = false; } - // Indent GuideLine - nm = element->Attribute(TEXT("indentGuideLine")); + // Indent GuideLine + nm = element->Attribute(TEXT("indentGuideLine")); if (nm) { if (!lstrcmp(nm, TEXT("show"))) @@ -4453,8 +4624,8 @@ void NppParameters::feedScintillaParam(TiXmlNode *node) _svp._indentGuideLineShow= false; } - // Folder Mark Style - nm = element->Attribute(TEXT("folderMarkStyle")); + // Folder Mark Style + nm = element->Attribute(TEXT("folderMarkStyle")); if (nm) { if (!lstrcmp(nm, TEXT("box"))) @@ -4481,8 +4652,8 @@ void NppParameters::feedScintillaParam(TiXmlNode *node) _svp._lineWrapMethod = LINEWRAP_INDENT; } - // Current Line Highlighting State - nm = element->Attribute(TEXT("currentLineHilitingShow")); + // Current Line Highlighting State + nm = element->Attribute(TEXT("currentLineHilitingShow")); if (nm) { if (!lstrcmp(nm, TEXT("show"))) @@ -4491,8 +4662,8 @@ void NppParameters::feedScintillaParam(TiXmlNode *node) _svp._currentLineHilitingShow = false; } - // Disable Advanced Scrolling - nm = element->Attribute(TEXT("disableAdvancedScrolling")); + // Disable Advanced Scrolling + nm = element->Attribute(TEXT("disableAdvancedScrolling")); if (nm) { if (!lstrcmp(nm, TEXT("yes"))) @@ -4501,8 +4672,8 @@ void NppParameters::feedScintillaParam(TiXmlNode *node) _svp._disableAdvancedScrolling = false; } - // Current wrap symbol visibility State - nm = element->Attribute(TEXT("wrapSymbolShow")); + // Current wrap symbol visibility State + nm = element->Attribute(TEXT("wrapSymbolShow")); if (nm) { if (!lstrcmp(nm, TEXT("show"))) @@ -4512,7 +4683,7 @@ void NppParameters::feedScintillaParam(TiXmlNode *node) } // Do Wrap - nm = element->Attribute(TEXT("Wrap")); + nm = element->Attribute(TEXT("Wrap")); if (nm) { if (!lstrcmp(nm, TEXT("yes"))) @@ -4522,7 +4693,7 @@ void NppParameters::feedScintillaParam(TiXmlNode *node) } // Do Edge - nm = element->Attribute(TEXT("edge")); + nm = element->Attribute(TEXT("edge")); if (nm) { if (!lstrcmp(nm, TEXT("background"))) @@ -4532,7 +4703,7 @@ void NppParameters::feedScintillaParam(TiXmlNode *node) else _svp._edgeMode = EDGE_NONE; } - + int val; nm = element->Attribute(TEXT("edgeNbColumn"), &val); if (nm) @@ -4553,7 +4724,7 @@ void NppParameters::feedScintillaParam(TiXmlNode *node) } // White Space visibility State - nm = element->Attribute(TEXT("whiteSpaceShow")); + nm = element->Attribute(TEXT("whiteSpaceShow")); if (nm) { if (!lstrcmp(nm, TEXT("show"))) @@ -4563,7 +4734,7 @@ void NppParameters::feedScintillaParam(TiXmlNode *node) } // EOL visibility State - nm = element->Attribute(TEXT("eolShow")); + nm = element->Attribute(TEXT("eolShow")); if (nm) { if (!lstrcmp(nm, TEXT("show"))) @@ -4571,7 +4742,7 @@ void NppParameters::feedScintillaParam(TiXmlNode *node) else if (!lstrcmp(nm, TEXT("hide"))) _svp._eolShow = false; } - + nm = element->Attribute(TEXT("borderWidth"), &val); if (nm) { @@ -4593,9 +4764,9 @@ void NppParameters::feedScintillaParam(TiXmlNode *node) void NppParameters::feedDockingManager(TiXmlNode *node) { - TiXmlElement *element = node->ToElement(); + TiXmlElement *element = node->ToElement(); - int i; + int i; if (element->Attribute(TEXT("leftWidth"), &i)) _nppGUI._dockingData._leftWidth = i; @@ -4608,7 +4779,7 @@ void NppParameters::feedDockingManager(TiXmlNode *node) if (element->Attribute(TEXT("bottomHeight"), &i)) _nppGUI._dockingData._bottomHight = i; - + for (TiXmlNode *childNode = node->FirstChildElement(TEXT("FloatingWindow")); childNode ; @@ -4637,7 +4808,7 @@ void NppParameters::feedDockingManager(TiXmlNode *node) { TiXmlElement *dlgElement = childNode->ToElement(); const TCHAR *name = dlgElement->Attribute(TEXT("pluginName")); - + int id; const TCHAR *idStr = dlgElement->Attribute(TEXT("id"), &id); if (name && idStr) @@ -4664,7 +4835,7 @@ void NppParameters::feedDockingManager(TiXmlNode *node) childNode = childNode->NextSibling(TEXT("ActiveTabs")) ) { TiXmlElement *dlgElement = childNode->ToElement(); - + int cont; if (dlgElement->Attribute(TEXT("cont"), &cont)) { @@ -4675,7 +4846,7 @@ void NppParameters::feedDockingManager(TiXmlNode *node) } } -bool NppParameters::writeScintillaParams(const ScintillaViewParams & svp) +bool NppParameters::writeScintillaParams(const ScintillaViewParams & svp) { if (!_pXmlUserDoc) return false; @@ -4759,7 +4930,7 @@ bool NppParameters::writeGUIParams() bool smartHighLightCaseSensitiveExist = false; bool tagsMatchHighLightExist = false; bool caretExist = false; - bool ScintillaGlobalSettingsExist = false; + bool ScintillaGlobalSettingsExist = false; bool openSaveDirExist = false; bool titleBarExist = false; bool stylerThemeExist = false; @@ -4830,8 +5001,8 @@ bool NppParameters::writeGUIParams() element->SetAttribute(TEXT("doubleClick2Close"), pStr); pStr = (_nppGUI._tabStatus & TAB_VERTICAL)?TEXT("yes"):TEXT("no"); - element->SetAttribute(TEXT("vertical"), pStr); - + element->SetAttribute(TEXT("vertical"), pStr); + pStr = (_nppGUI._tabStatus & TAB_MULTILINE)?TEXT("yes"):TEXT("no"); element->SetAttribute(TEXT("multiLine"), pStr); @@ -4856,7 +5027,7 @@ bool NppParameters::writeGUIParams() n->SetValue(pStr); else childNode->InsertEndChild(TiXmlText(pStr)); - + pStr = (_nppGUI._userDefineDlgStatus & UDD_DOCKED)?TEXT("docked"):TEXT("undocked"); element->SetAttribute(TEXT("position"), pStr); } @@ -4872,10 +5043,10 @@ bool NppParameters::writeGUIParams() element->SetAttribute(TEXT("width"), _nppGUI._caretWidth); element->SetAttribute(TEXT("blinkRate"), _nppGUI._caretBlinkRate); } - else if (!lstrcmp(nm, TEXT("ScintillaGlobalSettings"))) + else if (!lstrcmp(nm, TEXT("ScintillaGlobalSettings"))) { ScintillaGlobalSettingsExist = true; - element->SetAttribute(TEXT("enableMultiSelection"), _nppGUI._enableMultiSelection?TEXT("yes"):TEXT("no")); + element->SetAttribute(TEXT("enableMultiSelection"), _nppGUI._enableMultiSelection?TEXT("yes"):TEXT("no")); } else if (!lstrcmp(nm, TEXT("Auto-detection"))) { @@ -5041,7 +5212,7 @@ bool NppParameters::writeGUIParams() { MRUExist = true; const TCHAR *pStr = _nppGUI._styleMRU?TEXT("yes"):TEXT("no"); - + TiXmlNode *n = childNode->FirstChild(); if (n) n->SetValue(pStr); @@ -5102,7 +5273,7 @@ bool NppParameters::writeGUIParams() else if (!lstrcmp(nm, TEXT("auto-insert"))) { autocInsetExist = true; - + const TCHAR * pStr = _nppGUI._matchedPairConf._doParentheses?TEXT("yes"):TEXT("no"); element->SetAttribute(TEXT("parentheses"), pStr); @@ -5151,10 +5322,10 @@ bool NppParameters::writeGUIParams() else if (!lstrcmp(nm, TEXT("MISC"))) { miscExist = true; - + const TCHAR * pStr = _nppGUI._fileSwitcherWithoutExtColumn?TEXT("yes"):TEXT("no"); element->SetAttribute(TEXT("fileSwitcherWithoutExtColumn"), pStr); - + const TCHAR * pStrBackSlashEscape = _nppGUI._backSlashIsEscapeCharacterForSql ? TEXT("yes") : TEXT("no"); element->SetAttribute(TEXT("backSlashIsEscapeCharacterForSql"), pStrBackSlashEscape); } @@ -5170,11 +5341,11 @@ bool NppParameters::writeGUIParams() else if (!lstrcmp(nm, TEXT("noUpdate"))) { noUpdateExist = true; - const TCHAR *pStr = _nppGUI._autoUpdateOpt._doAutoUpdate?TEXT("no"):TEXT("yes"); - - element->SetAttribute(TEXT("intervalDays"), _nppGUI._autoUpdateOpt._intervalDays); - element->SetAttribute(TEXT("nextUpdateDate"), _nppGUI._autoUpdateOpt._nextUpdateDate.toString().c_str()); - + const TCHAR *pStr = _nppGUI._autoUpdateOpt._doAutoUpdate?TEXT("no"):TEXT("yes"); + + element->SetAttribute(TEXT("intervalDays"), _nppGUI._autoUpdateOpt._intervalDays); + element->SetAttribute(TEXT("nextUpdateDate"), _nppGUI._autoUpdateOpt._nextUpdateDate.toString().c_str()); + TiXmlNode *n = childNode->FirstChild(); if (n) n->SetValue(pStr); @@ -5220,7 +5391,7 @@ bool NppParameters::writeGUIParams() if (!noUpdateExist) { - insertGUIConfigBoolNode(GUIRoot, TEXT("noUpdate"), _nppGUI._autoUpdateOpt._doAutoUpdate); + insertGUIConfigBoolNode(GUIRoot, TEXT("noUpdate"), _nppGUI._autoUpdateOpt._doAutoUpdate); } if (!autoDetectionExist) @@ -5253,7 +5424,7 @@ bool NppParameters::writeGUIParams() { insertGUIConfigBoolNode(GUIRoot, TEXT("TrayIcon"), _nppGUI._isMinimizedToTray); } - + if (!maitainIndentExist) { insertGUIConfigBoolNode(GUIRoot, TEXT("MaitainIndent"), _nppGUI._maitainIndent); @@ -5340,7 +5511,7 @@ bool NppParameters::writeGUIParams() GUIConfigElement->SetAttribute(TEXT("name"), TEXT("URL")); GUIConfigElement->InsertEndChild(TiXmlText(pStr)); } - + if (!globalOverrideExist) { TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); @@ -5353,7 +5524,7 @@ bool NppParameters::writeGUIParams() GUIConfigElement->SetAttribute(TEXT("italic"), _nppGUI._globalOverride.enableItalic?TEXT("yes"):TEXT("no")); GUIConfigElement->SetAttribute(TEXT("underline"), _nppGUI._globalOverride.enableUnderLine?TEXT("yes"):TEXT("no")); } - + if (!autocExist) { TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); @@ -5369,7 +5540,7 @@ bool NppParameters::writeGUIParams() { TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); GUIConfigElement->SetAttribute(TEXT("name"), TEXT("auto-insert")); - + GUIConfigElement->SetAttribute(TEXT("parentheses"), _nppGUI._matchedPairConf._doParentheses?TEXT("yes"):TEXT("no")); GUIConfigElement->SetAttribute(TEXT("brackets"), _nppGUI._matchedPairConf._doBrackets?TEXT("yes"):TEXT("no")); GUIConfigElement->SetAttribute(TEXT("curlyBrackets"), _nppGUI._matchedPairConf._doCurlyBrackets?TEXT("yes"):TEXT("no")); @@ -5403,7 +5574,7 @@ bool NppParameters::writeGUIParams() GUIConfigElement->SetAttribute(TEXT("name"), TEXT("sessionExt")); GUIConfigElement->InsertEndChild(TiXmlText(_nppGUI._definedSessionExt.c_str())); } - + if (!menuBarExist) { TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); @@ -5419,12 +5590,12 @@ bool NppParameters::writeGUIParams() GUIConfigElement->SetAttribute(TEXT("blinkRate"), _nppGUI._caretBlinkRate); } - if (!ScintillaGlobalSettingsExist) - { - TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); + if (!ScintillaGlobalSettingsExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); GUIConfigElement->SetAttribute(TEXT("name"), TEXT("ScintillaGlobalSettings")); - GUIConfigElement->SetAttribute(TEXT("enableMultiSelection"), _nppGUI._enableMultiSelection?TEXT("yes"):TEXT("no")); - } + GUIConfigElement->SetAttribute(TEXT("enableMultiSelection"), _nppGUI._enableMultiSelection?TEXT("yes"):TEXT("no")); + } if (!openSaveDirExist) { @@ -5488,9 +5659,9 @@ bool NppParameters::writeFindHistory() } findHistoryRoot->Clear(); - (findHistoryRoot->ToElement())->SetAttribute(TEXT("nbMaxFindHistoryPath"), _findHistory._nbMaxFindHistoryPath); + (findHistoryRoot->ToElement())->SetAttribute(TEXT("nbMaxFindHistoryPath"), _findHistory._nbMaxFindHistoryPath); (findHistoryRoot->ToElement())->SetAttribute(TEXT("nbMaxFindHistoryFilter"), _findHistory._nbMaxFindHistoryFilter); - (findHistoryRoot->ToElement())->SetAttribute(TEXT("nbMaxFindHistoryFind"), _findHistory._nbMaxFindHistoryFind); + (findHistoryRoot->ToElement())->SetAttribute(TEXT("nbMaxFindHistoryFind"), _findHistory._nbMaxFindHistoryFind); (findHistoryRoot->ToElement())->SetAttribute(TEXT("nbMaxFindHistoryReplace"), _findHistory._nbMaxFindHistoryReplace); (findHistoryRoot->ToElement())->SetAttribute(TEXT("matchWord"), _findHistory._isMatchWord?TEXT("yes"):TEXT("no")); @@ -5512,7 +5683,7 @@ bool NppParameters::writeFindHistory() TiXmlElement hist_element(TEXT("")); hist_element.SetValue(TEXT("Path")); - for (size_t i = 0, len = _findHistory._findHistoryPaths.size(); i < len; ++i) + for (size_t i = 0, len = _findHistory._findHistoryPaths.size(); i < len; ++i) { (hist_element.ToElement())->SetAttribute(TEXT("name"), _findHistory._findHistoryPaths[i].c_str()); findHistoryRoot->InsertEndChild(hist_element); @@ -5550,7 +5721,7 @@ void NppParameters::insertDockingParamNode(TiXmlNode *GUIRoot) DMNode.SetAttribute(TEXT("rightWidth"), _nppGUI._dockingData._rightWidth); DMNode.SetAttribute(TEXT("topHeight"), _nppGUI._dockingData._topHeight); DMNode.SetAttribute(TEXT("bottomHeight"), _nppGUI._dockingData._bottomHight); - + for (size_t i = 0, len = _nppGUI._dockingData._flaotingWindowInfo.size(); i < len ; ++i) { FloatingWindowInfo & fwi = _nppGUI._dockingData._flaotingWindowInfo[i]; @@ -5686,15 +5857,15 @@ TiXmlElement * NppParameters::insertGUIConfigBoolNode(TiXmlNode *r2w, const TCHA } int RGB2int(COLORREF color) { - return (((((DWORD)color) & 0x0000FF) << 16) | ((((DWORD)color) & 0x00FF00)) | ((((DWORD)color) & 0xFF0000) >> 16)); + return (((((DWORD)color) & 0x0000FF) << 16) | ((((DWORD)color) & 0x00FF00)) | ((((DWORD)color) & 0xFF0000) >> 16)); } -int NppParameters::langTypeToCommandID(LangType lt) const +int NppParameters::langTypeToCommandID(LangType lt) const { int id; switch (lt) { - case L_C : + case L_C : id = IDM_LANG_C; break; case L_CPP : id = IDM_LANG_CPP; break; @@ -5706,7 +5877,7 @@ int NppParameters::langTypeToCommandID(LangType lt) const id = IDM_LANG_OBJC; break; case L_HTML : id = IDM_LANG_HTML; break; - case L_XML : + case L_XML : id = IDM_LANG_XML; break; case L_JS : id = IDM_LANG_JS; break; @@ -5714,7 +5885,7 @@ int NppParameters::langTypeToCommandID(LangType lt) const id = IDM_LANG_PHP; break; case L_ASP : id = IDM_LANG_ASP; break; - case L_JSP : + case L_JSP : id = IDM_LANG_JSP; break; case L_CSS : id = IDM_LANG_CSS; break; @@ -5738,9 +5909,9 @@ int NppParameters::langTypeToCommandID(LangType lt) const id = IDM_LANG_RC; break; case L_TEX : id = IDM_LANG_TEX; break; - case L_FORTRAN : + case L_FORTRAN : id = IDM_LANG_FORTRAN; break; - case L_BASH : + case L_BASH : id = IDM_LANG_BASH; break; case L_FLASH : id = IDM_LANG_FLASH; break; @@ -5748,75 +5919,75 @@ int NppParameters::langTypeToCommandID(LangType lt) const id = IDM_LANG_NSIS; break; case L_USER : id = IDM_LANG_USER; break; - case L_SQL : - id = IDM_LANG_SQL; break; - case L_VB : - id = IDM_LANG_VB; break; + case L_SQL : + id = IDM_LANG_SQL; break; + case L_VB : + id = IDM_LANG_VB; break; case L_TCL : - id = IDM_LANG_TCL; break; + id = IDM_LANG_TCL; break; case L_LISP : - id = IDM_LANG_LISP; break; + id = IDM_LANG_LISP; break; case L_SCHEME : - id = IDM_LANG_SCHEME; break; + id = IDM_LANG_SCHEME; break; case L_ASM : - id = IDM_LANG_ASM; break; + id = IDM_LANG_ASM; break; case L_DIFF : - id = IDM_LANG_DIFF; break; + id = IDM_LANG_DIFF; break; case L_PROPS : - id = IDM_LANG_PROPS; break; + id = IDM_LANG_PROPS; break; case L_PS : - id = IDM_LANG_PS; break; + id = IDM_LANG_PS; break; case L_RUBY : - id = IDM_LANG_RUBY; break; + id = IDM_LANG_RUBY; break; case L_SMALLTALK : - id = IDM_LANG_SMALLTALK; break; + id = IDM_LANG_SMALLTALK; break; case L_VHDL : - id = IDM_LANG_VHDL; break; + id = IDM_LANG_VHDL; break; case L_ADA : - id = IDM_LANG_ADA; break; + id = IDM_LANG_ADA; break; case L_MATLAB : - id = IDM_LANG_MATLAB; break; + id = IDM_LANG_MATLAB; break; case L_HASKELL : - id = IDM_LANG_HASKELL; break; + id = IDM_LANG_HASKELL; break; case L_KIX : - id = IDM_LANG_KIX; break; + id = IDM_LANG_KIX; break; case L_AU3 : - id = IDM_LANG_AU3; break; + id = IDM_LANG_AU3; break; case L_VERILOG : - id = IDM_LANG_VERILOG; break; + id = IDM_LANG_VERILOG; break; case L_CAML : - id = IDM_LANG_CAML; break; + id = IDM_LANG_CAML; break; case L_INNO : - id = IDM_LANG_INNO; break; + id = IDM_LANG_INNO; break; case L_CMAKE : - id = IDM_LANG_CMAKE; break; + id = IDM_LANG_CMAKE; break; case L_YAML : - id = IDM_LANG_YAML; break; + id = IDM_LANG_YAML; break; case L_COBOL : - id = IDM_LANG_COBOL; break; + id = IDM_LANG_COBOL; break; case L_D : - id = IDM_LANG_D; break; + id = IDM_LANG_D; break; case L_GUI4CLI : - id = IDM_LANG_GUI4CLI; break; + id = IDM_LANG_GUI4CLI; break; case L_POWERSHELL : - id = IDM_LANG_POWERSHELL; break; + id = IDM_LANG_POWERSHELL; break; case L_R : - id = IDM_LANG_R; break; + id = IDM_LANG_R; break; case L_COFFEESCRIPT : - id = IDM_LANG_COFFEESCRIPT; break; + id = IDM_LANG_COFFEESCRIPT; break; case L_SEARCHRESULT : id = -1; break; @@ -5842,11 +6013,11 @@ void NppParameters::writeStyles(LexerStylerArray & lexersStylers, StyleArray & g { TiXmlElement *element = childNode->ToElement(); const TCHAR *nm = element->Attribute(TEXT("name")); - - LexerStyler *pLs = _lexerStylerArray.getLexerStylerByName(nm); - LexerStyler *pLs2 = lexersStylers.getLexerStylerByName(nm); - if (pLs) + LexerStyler *pLs = _lexerStylerArray.getLexerStylerByName(nm); + LexerStyler *pLs2 = lexersStylers.getLexerStylerByName(nm); + + if (pLs) { const TCHAR *extStr = pLs->getLexerUserExt(); element->SetAttribute(TEXT("ext"), extStr); @@ -5855,20 +6026,20 @@ void NppParameters::writeStyles(LexerStylerArray & lexersStylers, StyleArray & g grChildNode = grChildNode->NextSibling(TEXT("WordsStyle"))) { TiXmlElement *grElement = grChildNode->ToElement(); - const TCHAR *styleName = grElement->Attribute(TEXT("name")); + const TCHAR *styleName = grElement->Attribute(TEXT("name")); - int i = pLs->getStylerIndexByName(styleName); - if (i != -1) + int i = pLs->getStylerIndexByName(styleName); + if (i != -1) { - Style & style = pLs->getStyler(i); - Style & style2Sync = pLs2->getStyler(i); + Style & style = pLs->getStyler(i); + Style & style2Sync = pLs2->getStyler(i); - writeStyle2Element(style, style2Sync, grElement); - } + writeStyle2Element(style, style2Sync, grElement); + } } } } - + for(size_t x = 0; x < _pXmlExternalLexerDoc.size(); ++x) { TiXmlNode *lexersRoot = ( _pXmlExternalLexerDoc[x]->FirstChild(TEXT("NotepadPlus")))->FirstChildElement(TEXT("LexerStyles")); @@ -5878,11 +6049,11 @@ void NppParameters::writeStyles(LexerStylerArray & lexersStylers, StyleArray & g { TiXmlElement *element = childNode->ToElement(); const TCHAR *nm = element->Attribute(TEXT("name")); - + LexerStyler *pLs = _lexerStylerArray.getLexerStylerByName(nm); LexerStyler *pLs2 = lexersStylers.getLexerStylerByName(nm); - if (pLs) + if (pLs) { const TCHAR *extStr = pLs->getLexerUserExt(); element->SetAttribute(TEXT("ext"), extStr); @@ -5910,22 +6081,22 @@ void NppParameters::writeStyles(LexerStylerArray & lexersStylers, StyleArray & g TiXmlNode *globalStylesRoot = (_pXmlUserStylerDoc->FirstChild(TEXT("NotepadPlus")))->FirstChildElement(TEXT("GlobalStyles")); - for (TiXmlNode *childNode = globalStylesRoot->FirstChildElement(TEXT("WidgetStyle")); + for (TiXmlNode *childNode = globalStylesRoot->FirstChildElement(TEXT("WidgetStyle")); childNode ; childNode = childNode->NextSibling(TEXT("WidgetStyle"))) - { - TiXmlElement *pElement = childNode->ToElement(); - const TCHAR *styleName = pElement->Attribute(TEXT("name")); - int i = _widgetStyleArray.getStylerIndexByName(styleName); + { + TiXmlElement *pElement = childNode->ToElement(); + const TCHAR *styleName = pElement->Attribute(TEXT("name")); + int i = _widgetStyleArray.getStylerIndexByName(styleName); - if (i != -1) + if (i != -1) { - Style & style = _widgetStyleArray.getStyler(i); - Style & style2Sync = globalStylers.getStyler(i); + Style & style = _widgetStyleArray.getStyler(i); + Style & style2Sync = globalStylers.getStyler(i); - writeStyle2Element(style, style2Sync, pElement); - } - } + writeStyle2Element(style, style2Sync, pElement); + } + } _pXmlUserStylerDoc->SaveFile(); } @@ -5933,95 +6104,95 @@ void NppParameters::writeStyles(LexerStylerArray & lexersStylers, StyleArray & g 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")); + 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(); + TiXmlElement *element = childNode->ToElement(); const TCHAR *nm = element->Attribute(TEXT("name")); - if (nm && lstrcmp(langName, nm) == 0) - { - childNode->ToElement()->SetAttribute(TEXT("tabSettings"), tabInfo); + if (nm && lstrcmp(langName, nm) == 0) + { + childNode->ToElement()->SetAttribute(TEXT("tabSettings"), tabInfo); _pXmlDoc->SaveFile(); - return true; - } - } - return false; + return true; + } + } + return false; } void NppParameters::writeStyle2Element(Style & style2Write, Style & style2Sync, TiXmlElement *element) { - if (HIBYTE(HIWORD(style2Write._fgColor)) != 0xFF) - { - int rgbVal = RGB2int(style2Write._fgColor); - TCHAR fgStr[7]; - wsprintf(fgStr, TEXT("%.6X"), rgbVal); - element->SetAttribute(TEXT("fgColor"), fgStr); - } + if (HIBYTE(HIWORD(style2Write._fgColor)) != 0xFF) + { + int rgbVal = RGB2int(style2Write._fgColor); + TCHAR fgStr[7]; + wsprintf(fgStr, TEXT("%.6X"), rgbVal); + element->SetAttribute(TEXT("fgColor"), fgStr); + } - if (HIBYTE(HIWORD(style2Write._bgColor)) != 0xFF) - { - int rgbVal = RGB2int(style2Write._bgColor); - TCHAR bgStr[7]; - wsprintf(bgStr, TEXT("%.6X"), rgbVal); - element->SetAttribute(TEXT("bgColor"), bgStr); - } + if (HIBYTE(HIWORD(style2Write._bgColor)) != 0xFF) + { + int rgbVal = RGB2int(style2Write._bgColor); + TCHAR bgStr[7]; + wsprintf(bgStr, TEXT("%.6X"), rgbVal); + element->SetAttribute(TEXT("bgColor"), bgStr); + } if (style2Write._colorStyle != COLORSTYLE_ALL) - { - element->SetAttribute(TEXT("colorStyle"), style2Write._colorStyle); - } + { + element->SetAttribute(TEXT("colorStyle"), style2Write._colorStyle); + } - if (style2Write._fontName) - { - const TCHAR *oldFontName = element->Attribute(TEXT("fontName")); - if (lstrcmp(oldFontName, style2Write._fontName)) - { - element->SetAttribute(TEXT("fontName"), style2Write._fontName); - style2Sync._fontName = style2Write._fontName = element->Attribute(TEXT("fontName")); - } - } + if (style2Write._fontName) + { + const TCHAR *oldFontName = element->Attribute(TEXT("fontName")); + if (lstrcmp(oldFontName, style2Write._fontName)) + { + element->SetAttribute(TEXT("fontName"), style2Write._fontName); + style2Sync._fontName = style2Write._fontName = element->Attribute(TEXT("fontName")); + } + } - if (style2Write._fontSize != STYLE_NOT_USED) - { - if (!style2Write._fontSize) - element->SetAttribute(TEXT("fontSize"), TEXT("")); - else - element->SetAttribute(TEXT("fontSize"), style2Write._fontSize); - } + if (style2Write._fontSize != STYLE_NOT_USED) + { + if (!style2Write._fontSize) + element->SetAttribute(TEXT("fontSize"), TEXT("")); + else + element->SetAttribute(TEXT("fontSize"), style2Write._fontSize); + } + + if (style2Write._fontStyle != STYLE_NOT_USED) + { + element->SetAttribute(TEXT("fontStyle"), style2Write._fontStyle); + } - if (style2Write._fontStyle != STYLE_NOT_USED) - { - element->SetAttribute(TEXT("fontStyle"), style2Write._fontStyle); - } - if (style2Write._keywords) - { + { TiXmlNode *teteDeNoeud = element->LastChild(); if (teteDeNoeud) teteDeNoeud->SetValue(style2Write._keywords->c_str()); - else + else element->InsertEndChild(TiXmlText(style2Write._keywords->c_str())); - } + } } -void NppParameters::insertUserLang2Tree(TiXmlNode *node, UserLangContainer *userLang) +void NppParameters::insertUserLang2Tree(TiXmlNode *node, UserLangContainer *userLang) { TiXmlElement *rootElement = (node->InsertEndChild(TiXmlElement(TEXT("UserLang"))))->ToElement(); - TCHAR temp[32]; - generic_string udlVersion = TEXT(""); - udlVersion += generic_itoa(SCE_UDL_VERSION_MAJOR, temp, 10); - udlVersion += TEXT("."); - udlVersion += generic_itoa(SCE_UDL_VERSION_MINOR, temp, 10); + TCHAR temp[32]; + generic_string udlVersion = TEXT(""); + udlVersion += generic_itoa(SCE_UDL_VERSION_MAJOR, temp, 10); + udlVersion += TEXT("."); + udlVersion += generic_itoa(SCE_UDL_VERSION_MINOR, temp, 10); rootElement->SetAttribute(TEXT("name"), userLang->_name); rootElement->SetAttribute(TEXT("ext"), userLang->_ext); - rootElement->SetAttribute(TEXT("udlVersion"), udlVersion.c_str()); + rootElement->SetAttribute(TEXT("udlVersion"), udlVersion.c_str()); TiXmlElement *settingsElement = (rootElement->InsertEndChild(TiXmlElement(TEXT("Settings"))))->ToElement(); { @@ -6029,8 +6200,8 @@ void NppParameters::insertUserLang2Tree(TiXmlNode *node, UserLangContainer *user globalElement->SetAttribute(TEXT("caseIgnored"), userLang->_isCaseIgnored ? TEXT("yes"):TEXT("no")); globalElement->SetAttribute(TEXT("allowFoldOfComments"), userLang->_allowFoldOfComments ? TEXT("yes"):TEXT("no")); globalElement->SetAttribute(TEXT("foldCompact"), userLang->_foldCompact ? TEXT("yes"):TEXT("no")); - globalElement->SetAttribute(TEXT("forcePureLC"), userLang->_forcePureLC); - globalElement->SetAttribute(TEXT("decimalSeparator"), userLang->_decimalSeparator); + globalElement->SetAttribute(TEXT("forcePureLC"), userLang->_forcePureLC); + globalElement->SetAttribute(TEXT("decimalSeparator"), userLang->_decimalSeparator); TiXmlElement *prefixElement = (settingsElement->InsertEndChild(TiXmlElement(TEXT("Prefix"))))->ToElement(); for (int i = 0 ; i < SCE_USER_TOTAL_KEYWORD_GROUPS ; ++i) @@ -6052,10 +6223,10 @@ void NppParameters::insertUserLang2Tree(TiXmlNode *node, UserLangContainer *user { TiXmlElement *styleElement = (styleRootElement->InsertEndChild(TiXmlElement(TEXT("WordsStyle"))))->ToElement(); Style style2Write = userLang->_styleArray.getStyler(i); - + if (style2Write._styleID == -1) continue; - + styleElement->SetAttribute(TEXT("name"), style2Write._styleDesc); //if (HIBYTE(HIWORD(style2Write._fgColor)) != 0xFF) @@ -6100,19 +6271,19 @@ void NppParameters::insertUserLang2Tree(TiXmlNode *node, UserLangContainer *user else styleElement->SetAttribute(TEXT("fontSize"), style2Write._fontSize); } - + styleElement->SetAttribute(TEXT("nesting"), style2Write._nesting); } } -void NppParameters::stylerStrOp(bool op) +void NppParameters::stylerStrOp(bool op) { for (int i = 0 ; i < _nbUserLang ; ++i) { for (int j = 0 ; j < SCE_USER_STYLE_TOTAL_STYLES ; ++j) { Style & style = _userLangArray[i]->_styleArray.getStyler(j); - + if (op == DUP) { TCHAR *str = new TCHAR[lstrlen(style._styleDesc) + 1]; @@ -6138,55 +6309,55 @@ void NppParameters::stylerStrOp(bool op) } } -void NppParameters::addUserModifiedIndex(int index) +void NppParameters::addUserModifiedIndex(int index) { size_t len = _customizedShortcuts.size(); bool found = false; - for(size_t i = 0; i < len; ++i) + for(size_t i = 0; i < len; ++i) { - if (_customizedShortcuts[i] == index) + if (_customizedShortcuts[i] == index) { found = true; break; } } - if (!found) + if (!found) { _customizedShortcuts.push_back(index); } } -void NppParameters::addPluginModifiedIndex(int index) +void NppParameters::addPluginModifiedIndex(int index) { size_t len = _pluginCustomizedCmds.size(); bool found = false; - for(size_t i = 0; i < len; ++i) + for(size_t i = 0; i < len; ++i) { - if (_pluginCustomizedCmds[i] == index) + if (_pluginCustomizedCmds[i] == index) { found = true; break; } } - if (!found) + if (!found) { _pluginCustomizedCmds.push_back(index); } } -void NppParameters::addScintillaModifiedIndex(int index) +void NppParameters::addScintillaModifiedIndex(int index) { size_t len = _scintillaModifiedKeyIndices.size(); bool found = false; - for(size_t i = 0; i < len; ++i) + for(size_t i = 0; i < len; ++i) { - if (_scintillaModifiedKeyIndices[i] == index) + if (_scintillaModifiedKeyIndices[i] == index) { found = true; break; } } - if (!found) + if (!found) { _scintillaModifiedKeyIndices.push_back(index); } @@ -6220,7 +6391,7 @@ void NppParameters::safeWow64EnableWow64FsRedirection(BOOL Wow64FsEnableRedirect Date::Date(const TCHAR *dateStr) -{ +{ // timeStr should be Notepad++ date format : YYYYMMDD assert(dateStr); if (lstrlen(dateStr) == 8) @@ -6292,4 +6463,4 @@ FormatType convertIntToFormatType(int value, FormatType defvalue) default: return defvalue; } -} \ No newline at end of file +} diff --git a/PowerEditor/src/Parameters.h b/PowerEditor/src/Parameters.h index 03665f6a7..282cf51d7 100644 --- a/PowerEditor/src/Parameters.h +++ b/PowerEditor/src/Parameters.h @@ -7,13 +7,13 @@ // version 2 of the License, or (at your option) any later version. // // Note that the GPL places important restrictions on "derived works", yet -// it does not provide a detailed definition of that term. To avoid -// misunderstandings, we consider an application to constitute a +// it does not provide a detailed definition of that term. To avoid +// misunderstandings, we consider an application to constitute a // "derivative work" for the purpose of this license if it does any of the -// following: +// following: // 1. Integrates source code from Notepad++. // 2. Integrates/includes/aggregates Notepad++ into a proprietary executable -// installer, such as those produced by InstallShield. +// installer, such as those produced by InstallShield. // 3. Links to a library or executes a program that does any of the above. // // This program is distributed in the hope that it will be useful, @@ -24,10 +24,7 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - -#ifndef PARAMETERS_H -#define PARAMETERS_H +#pragma once #ifndef TINYXMLA_INCLUDED #include "tinyxmlA.h" @@ -77,7 +74,7 @@ class NativeLangSpeaker; const bool POS_VERTICAL = true; const bool POS_HORIZOTAL = false; -const int UDD_SHOW = 1; // 0000 0001 +const int UDD_SHOW = 1; // 0000 0001 const int UDD_DOCKED = 2; // 0000 0010 // 0 : 0000 0000 hide & undocked @@ -85,15 +82,15 @@ const int UDD_DOCKED = 2; // 0000 0010 // 2 : 0000 0010 hide & docked // 3 : 0000 0011 show & docked -const int TAB_DRAWTOPBAR = 1; // 0000 0001 +const int TAB_DRAWTOPBAR = 1; // 0000 0001 const int TAB_DRAWINACTIVETAB = 2; // 0000 0010 -const int TAB_DRAGNDROP = 4; // 0000 0100 -const int TAB_REDUCE = 8; // 0000 1000 -const int TAB_CLOSEBUTTON = 16; // 0001 0000 -const int TAB_DBCLK2CLOSE = 32; // 0010 0000 -const int TAB_VERTICAL = 64; // 0100 0000 -const int TAB_MULTILINE = 128; // 1000 0000 -const int TAB_HIDE = 256; //1 0000 0000 +const int TAB_DRAGNDROP = 4; // 0000 0100 +const int TAB_REDUCE = 8; // 0000 1000 +const int TAB_CLOSEBUTTON = 16; // 0001 0000 +const int TAB_DBCLK2CLOSE = 32; // 0010 0000 +const int TAB_VERTICAL = 64; // 0100 0000 +const int TAB_MULTILINE = 128; // 1000 0000 +const int TAB_HIDE = 256; //1 0000 0000 enum class FormatType: std::uint8_t @@ -136,13 +133,13 @@ const int COPYDATA_PARAMS = 0; const int COPYDATA_FILENAMESA = 1; const int COPYDATA_FILENAMESW = 2; -#define PURE_LC_NONE 0 -#define PURE_LC_BOL 1 -#define PURE_LC_WSP 2 +#define PURE_LC_NONE 0 +#define PURE_LC_BOL 1 +#define PURE_LC_WSP 2 -#define DECSEP_DOT 0 -#define DECSEP_COMMA 1 -#define DECSEP_BOTH 2 +#define DECSEP_DOT 0 +#define DECSEP_COMMA 1 +#define DECSEP_BOTH 2 #define DROPBOX_AVAILABLE 1 @@ -159,144 +156,162 @@ void cutString(const TCHAR *str2cut, std::vector & patternVect); struct Position -{ - int _firstVisibleLine; - int _startPos; - int _endPos; - int _xOffset; - int _selMode; - int _scrollWidth; - Position() : _firstVisibleLine(0), _startPos(0), _endPos(0), _xOffset(0), _scrollWidth(1), _selMode(0) {}; +{ + int _firstVisibleLine = 0; + int _startPos = 0; + int _endPos = 0; + int _xOffset = 0; + int _selMode = 0; + int _scrollWidth = 1; }; -struct sessionFileInfo : public Position { - sessionFileInfo(const TCHAR *fn, const TCHAR *ln, int encoding, Position pos, const TCHAR *backupFilePath, int originalFileLastModifTimestamp) : - _encoding(encoding), Position(pos), _originalFileLastModifTimestamp(originalFileLastModifTimestamp) { + +struct sessionFileInfo : public Position +{ + sessionFileInfo(const TCHAR *fn, const TCHAR *ln, int encoding, Position pos, const TCHAR *backupFilePath, int originalFileLastModifTimestamp) : + _encoding(encoding), Position(pos), _originalFileLastModifTimestamp(originalFileLastModifTimestamp) + { if (fn) _fileName = fn; if (ln) _langName = ln; if (backupFilePath) _backupFilePath = backupFilePath; - }; + } + + sessionFileInfo(generic_string fn) : _fileName(fn) {} - sessionFileInfo(generic_string fn) : _fileName(fn), _encoding(-1){}; - generic_string _fileName; generic_string _langName; std::vector _marks; std::vector _foldStates; - int _encoding; + int _encoding = -1; generic_string _backupFilePath; time_t _originalFileLastModifTimestamp; }; -struct Session { + +struct Session +{ size_t nbMainFiles() const {return _mainViewFiles.size();}; size_t nbSubFiles() const {return _subViewFiles.size();}; - size_t _activeView; - size_t _activeMainIndex; - size_t _activeSubIndex; + size_t _activeView = 0; + size_t _activeMainIndex = 0; + size_t _activeSubIndex = 0; std::vector _mainViewFiles; std::vector _subViewFiles; }; -struct CmdLineParams { - bool _isNoPlugin; - bool _isReadOnly; - bool _isNoSession; - bool _isNoTab; - bool _isPreLaunch; - bool _showLoadingTime; - bool _alwaysOnTop; - int _line2go; - int _column2go; - POINT _point; - bool _isPointXValid; - bool _isPointYValid; - bool isPointValid() { - return _isPointXValid && _isPointYValid; - }; - bool _isSessionFile; - bool _isRecursive; +struct CmdLineParams +{ + bool _isNoPlugin = false; + bool _isReadOnly = false; + bool _isNoSession = false; + bool _isNoTab = false; + bool _isPreLaunch = false; + bool _showLoadingTime = false; + bool _alwaysOnTop = false; + int _line2go = -1; + int _column2go = -1; - LangType _langType; + POINT _point; + bool _isPointXValid = false; + bool _isPointYValid = false; + + bool _isSessionFile = false; + bool _isRecursive = false; + + LangType _langType = L_EXTERNAL; generic_string _localizationPath; generic_string _easterEggName; - unsigned char _quoteType; + unsigned char _quoteType = '\0'; - CmdLineParams() : _isNoPlugin(false), _isReadOnly(false), _isNoSession(false), _isNoTab(false),_showLoadingTime(false),\ - _isPreLaunch(false), _line2go(-1), _column2go(-1), _langType(L_EXTERNAL), _isPointXValid(false), _isPointYValid(false),\ - _alwaysOnTop(false), _localizationPath(TEXT("")), _easterEggName(TEXT("")), _quoteType(0) - { - _point.x = 0; - _point.y = 0; - } + CmdLineParams() + { + _point.x = 0; + _point.y = 0; + } + + bool isPointValid() const + { + return _isPointXValid && _isPointYValid; + } }; -struct FloatingWindowInfo { +struct FloatingWindowInfo +{ int _cont; RECT _pos; - FloatingWindowInfo(int cont, int x, int y, int w, int h) : _cont(cont) { + + FloatingWindowInfo(int cont, int x, int y, int w, int h) + : _cont(cont) + { _pos.left = x; _pos.top = y; _pos.right = w; _pos.bottom = h; - }; + } }; -struct PluginDlgDockingInfo { + +struct PluginDlgDockingInfo final +{ generic_string _name; - int _internalID; + int _internalID = -1; - int _currContainer; - int _prevContainer; - bool _isVisible; + int _currContainer = -1; + int _prevContainer = -1; + bool _isVisible = false; - PluginDlgDockingInfo(const TCHAR *pluginName, int id, int curr, int prev, bool isVis) : _internalID(id), _currContainer(curr), _prevContainer(prev), _isVisible(isVis), _name(pluginName){}; + PluginDlgDockingInfo(const TCHAR* pluginName, int id, int curr, int prev, bool isVis) + : _internalID(id), _currContainer(curr), _prevContainer(prev), _isVisible(isVis), _name(pluginName) + {} - friend inline const bool operator==(const PluginDlgDockingInfo & a, const PluginDlgDockingInfo & b) { - if ((a._name == b._name) && (a._internalID == b._internalID)) - return true; - else - return false; - }; + bool operator == (const PluginDlgDockingInfo& rhs) const + { + return _internalID == rhs._internalID and _name == rhs._name; + } }; -struct ContainerTabInfo { - int _cont; - int _activeTab; + +struct ContainerTabInfo final +{ + int _cont = 0; + int _activeTab = 0; ContainerTabInfo(int cont, int activeTab) : _cont(cont), _activeTab(activeTab) {}; }; -struct DockingManagerData { - int _leftWidth; - int _rightWidth; - int _topHeight; - int _bottomHight; - DockingManagerData() : _leftWidth(200), _rightWidth(200), _topHeight(200), _bottomHight(200) {}; +struct DockingManagerData final +{ + int _leftWidth = 200; + int _rightWidth = 200; + int _topHeight = 200; + int _bottomHight = 200; - std::vector _flaotingWindowInfo; - std::vector _pluginDockInfo; - std::vector _containerTabInfo; + std::vector _flaotingWindowInfo; + std::vector _pluginDockInfo; + std::vector _containerTabInfo; - bool getFloatingRCFrom(int floatCont, RECT & rc) { + bool getFloatingRCFrom(int floatCont, RECT& rc) const + { for (size_t i = 0, fwiLen = _flaotingWindowInfo.size(); i < fwiLen; ++i) { if (_flaotingWindowInfo[i]._cont == floatCont) - { - rc.left = _flaotingWindowInfo[i]._pos.left; - rc.top = _flaotingWindowInfo[i]._pos.top; - rc.right = _flaotingWindowInfo[i]._pos.right; - rc.bottom = _flaotingWindowInfo[i]._pos.bottom; + { + rc.left = _flaotingWindowInfo[i]._pos.left; + rc.top = _flaotingWindowInfo[i]._pos.top; + rc.right = _flaotingWindowInfo[i]._pos.right; + rc.bottom = _flaotingWindowInfo[i]._pos.bottom; return true; - } + } } return false; } }; + + const int FONTSTYLE_NONE = 0; const int FONTSTYLE_BOLD = 1; const int FONTSTYLE_ITALIC = 2; @@ -308,186 +323,197 @@ const int COLORSTYLE_FOREGROUND = 0x01; const int COLORSTYLE_BACKGROUND = 0x02; const int COLORSTYLE_ALL = COLORSTYLE_FOREGROUND|COLORSTYLE_BACKGROUND; + + struct Style { - int _styleID; - const TCHAR *_styleDesc; + int _styleID = -1; + const TCHAR* _styleDesc = nullptr; - COLORREF _fgColor; - COLORREF _bgColor; - int _colorStyle; - const TCHAR *_fontName; - int _fontStyle; - int _fontSize; - int _nesting; + COLORREF _fgColor = COLORREF(STYLE_NOT_USED); + COLORREF _bgColor = COLORREF(STYLE_NOT_USED); + int _colorStyle = COLORSTYLE_ALL; + const TCHAR* _fontName = nullptr; + int _fontStyle = FONTSTYLE_NONE; + int _fontSize = STYLE_NOT_USED; + int _nesting = FONTSTYLE_NONE; - int _keywordClass; - generic_string *_keywords; + int _keywordClass = STYLE_NOT_USED; + generic_string* _keywords = nullptr; - Style():_styleID(-1), _styleDesc(NULL), _fgColor(COLORREF(STYLE_NOT_USED)), _bgColor(COLORREF(STYLE_NOT_USED)), _colorStyle(COLORSTYLE_ALL),\ - _fontName(NULL), _fontStyle(FONTSTYLE_NONE), _fontSize(STYLE_NOT_USED), _keywordClass(STYLE_NOT_USED), _keywords(NULL), _nesting(FONTSTYLE_NONE){}; - ~Style(){ - if (_keywords) - delete _keywords; - }; + Style() = default; - Style(const Style & style) + Style(const Style & style) { - _styleID = style._styleID; - _styleDesc = style._styleDesc; - _fgColor = style._fgColor; - _bgColor = style._bgColor; - _colorStyle = style._colorStyle; - _fontName = style._fontName; - _fontSize = style._fontSize; - _fontStyle = style._fontStyle; + _styleID = style._styleID; + _styleDesc = style._styleDesc; + _fgColor = style._fgColor; + _bgColor = style._bgColor; + _colorStyle = style._colorStyle; + _fontName = style._fontName; + _fontSize = style._fontSize; + _fontStyle = style._fontStyle; _keywordClass = style._keywordClass; - _nesting = style._nesting; - if (style._keywords) - _keywords = new generic_string(*(style._keywords)); - else - _keywords = NULL; - }; + _nesting = style._nesting; + _keywords = (style._keywords) ? new generic_string(*(style._keywords)) : nullptr; + } - Style & operator=(const Style & style) { + ~Style() + { + delete _keywords; + } + + + Style& operator = (const Style & style) + { if (this != &style) { - this->_styleID = style._styleID; - this->_styleDesc = style._styleDesc; - this->_fgColor = style._fgColor; - this->_bgColor = style._bgColor; - this->_colorStyle = style._colorStyle; - this->_fontName = style._fontName; - this->_fontSize = style._fontSize; - this->_fontStyle = style._fontStyle; - this->_keywordClass = style._keywordClass; - this->_nesting = style._nesting; + _styleID = style._styleID; + _styleDesc = style._styleDesc; + _fgColor = style._fgColor; + _bgColor = style._bgColor; + _colorStyle = style._colorStyle; + _fontName = style._fontName; + _fontSize = style._fontSize; + _fontStyle = style._fontStyle; + _keywordClass = style._keywordClass; + _nesting = style._nesting; - if (!(this->_keywords) && style._keywords) - this->_keywords = new generic_string(*(style._keywords)); - else if (this->_keywords && style._keywords) - this->_keywords->assign(*(style._keywords)); - else if (this->_keywords && !(style._keywords)) + if (!(_keywords) && style._keywords) + _keywords = new generic_string(*(style._keywords)); + else if (_keywords && style._keywords) + _keywords->assign(*(style._keywords)); + else if (_keywords && !(style._keywords)) { - delete (this->_keywords); - this->_keywords = NULL; + delete (_keywords); + _keywords = nullptr; } } return *this; - }; + } - void setKeywords(const TCHAR *str) { + void setKeywords(const TCHAR *str) + { if (!_keywords) _keywords = new generic_string(str); else *_keywords = str; - }; + } }; -struct GlobalOverride + +struct GlobalOverride final { - bool isEnable() const {return (enableFg || enableBg || enableFont || enableFontSize || enableBold || enableItalic || enableUnderLine);}; - bool enableFg; - bool enableBg; - bool enableFont; - bool enableFontSize; - bool enableBold; - bool enableItalic; - bool enableUnderLine; - GlobalOverride():enableFg(false), enableBg(false), enableFont(false), enableFontSize(false), enableBold(false), enableItalic(false), enableUnderLine(false) {}; + bool isEnable() const {return (enableFg || enableBg || enableFont || enableFontSize || enableBold || enableItalic || enableUnderLine);} + bool enableFg = false; + bool enableBg = false; + bool enableFont = false; + bool enableFontSize = false; + bool enableBold = false; + bool enableItalic = false; + bool enableUnderLine = false; }; + struct StyleArray { public: - StyleArray() : _nbStyler(0){}; + StyleArray & operator=(const StyleArray & sa) + { + if (this != &sa) + { + this->_nbStyler = sa._nbStyler; + for (int i = 0 ; i < _nbStyler ; ++i) + { + this->_styleArray[i] = sa._styleArray[i]; + } + } + return *this; + } - StyleArray & operator=(const StyleArray & sa) - { - if (this != &sa) - { - this->_nbStyler = sa._nbStyler; - for (int i = 0 ; i < _nbStyler ; ++i) - { - this->_styleArray[i] = sa._styleArray[i]; - } - } - return *this; - } - - int getNbStyler() const {return _nbStyler;}; + int getNbStyler() const {return _nbStyler;}; void setNbStyler(int nb) {_nbStyler = nb;}; - Style & getStyler(int index) { - assert(index >= 0 && index < SCE_STYLE_ARRAY_SIZE); + Style& getStyler(int index) + { + assert((size_t) index < SCE_STYLE_ARRAY_SIZE); return _styleArray[index]; - }; + } - bool hasEnoughSpace() {return (_nbStyler < SCE_STYLE_ARRAY_SIZE);}; - void addStyler(int styleID, TiXmlNode *styleNode); + bool hasEnoughSpace() {return (_nbStyler < SCE_STYLE_ARRAY_SIZE);}; + void addStyler(int styleID, TiXmlNode *styleNode); - void addStyler(int styleID, const TCHAR *styleName) { + void addStyler(int styleID, const TCHAR *styleName) + { _styleArray[styleID]._styleID = styleID; _styleArray[styleID]._styleDesc = styleName; _styleArray[styleID]._fgColor = black; _styleArray[styleID]._bgColor = white; ++_nbStyler; - }; + } - int getStylerIndexByID(int id) { - for (int i = 0 ; i < _nbStyler ; ++i) - if (_styleArray[i]._styleID == id) - return i; - return -1; - }; + int getStylerIndexByID(int id) + { + for (int i = 0 ; i < _nbStyler ; ++i) + { + if (_styleArray[i]._styleID == id) + return i; + } + return -1; + } - int getStylerIndexByName(const TCHAR *name) const { + int getStylerIndexByName(const TCHAR *name) const + { if (!name) return -1; - for (int i = 0 ; i < _nbStyler ; ++i) + for (int i = 0 ; i < _nbStyler ; ++i) + { if (!lstrcmp(_styleArray[i]._styleDesc, name)) - return i; - return -1; - }; + return i; + } + return -1; + } protected: Style _styleArray[SCE_STYLE_ARRAY_SIZE]; - int _nbStyler; + int _nbStyler = 0; }; + + struct LexerStyler : public StyleArray { -public : - LexerStyler():StyleArray(){}; - - LexerStyler & operator=(const LexerStyler & ls) - { - if (this != &ls) - { - *((StyleArray *)this) = ls; - this->_lexerName = ls._lexerName; +public: + LexerStyler & operator=(const LexerStyler & ls) + { + if (this != &ls) + { + *((StyleArray *)this) = ls; + this->_lexerName = ls._lexerName; this->_lexerDesc = ls._lexerDesc; this->_lexerUserExt = ls._lexerUserExt; - } - return *this; - } + } + return *this; + } - void setLexerName(const TCHAR *lexerName) { - _lexerName = lexerName; - }; - - void setLexerDesc(const TCHAR *lexerDesc) { - _lexerDesc = lexerDesc; - }; + void setLexerName(const TCHAR *lexerName) + { + _lexerName = lexerName; + } + + void setLexerDesc(const TCHAR *lexerDesc) + { + _lexerDesc = lexerDesc; + } void setLexerUserExt(const TCHAR *lexerUserExt) { - _lexerUserExt = lexerUserExt; - }; + _lexerUserExt = lexerUserExt; + }; - const TCHAR * getLexerName() const {return _lexerName.c_str();}; + const TCHAR * getLexerName() const {return _lexerName.c_str();}; const TCHAR * getLexerDesc() const {return _lexerDesc.c_str();}; - const TCHAR * getLexerUserExt() const {return _lexerUserExt.c_str();}; + const TCHAR * getLexerUserExt() const {return _lexerUserExt.c_str();}; private : generic_string _lexerName; @@ -495,6 +521,8 @@ private : generic_string _lexerUserExt; }; + + const int MAX_LEXER_STYLE = 80; struct LexerStylerArray @@ -502,38 +530,38 @@ struct LexerStylerArray public : LexerStylerArray() : _nbLexerStyler(0){}; - LexerStylerArray & operator=(const LexerStylerArray & lsa) - { - if (this != &lsa) - { - this->_nbLexerStyler = lsa._nbLexerStyler; - for (int i = 0 ; i < this->_nbLexerStyler ; ++i) - this->_lexerStylerArray[i] = lsa._lexerStylerArray[i]; - } - return *this; - } + LexerStylerArray & operator=(const LexerStylerArray & lsa) + { + if (this != &lsa) + { + this->_nbLexerStyler = lsa._nbLexerStyler; + for (int i = 0 ; i < this->_nbLexerStyler ; ++i) + this->_lexerStylerArray[i] = lsa._lexerStylerArray[i]; + } + return *this; + } - int getNbLexer() const {return _nbLexerStyler;}; + int getNbLexer() const {return _nbLexerStyler;}; - LexerStyler & getLexerFromIndex(int index) - { - return _lexerStylerArray[index]; - }; + LexerStyler & getLexerFromIndex(int index) + { + return _lexerStylerArray[index]; + }; - const TCHAR * getLexerNameFromIndex(int index) const {return _lexerStylerArray[index].getLexerName();} + const TCHAR * getLexerNameFromIndex(int index) const {return _lexerStylerArray[index].getLexerName();} const TCHAR * getLexerDescFromIndex(int index) const {return _lexerStylerArray[index].getLexerDesc();} - LexerStyler * getLexerStylerByName(const TCHAR *lexerName) { + LexerStyler * getLexerStylerByName(const TCHAR *lexerName) { if (!lexerName) return NULL; - for (int i = 0 ; i < _nbLexerStyler ; ++i) - { - if (!lstrcmp(_lexerStylerArray[i].getLexerName(), lexerName)) - return &(_lexerStylerArray[i]); - } - return NULL; - }; - bool hasEnoughSpace() {return (_nbLexerStyler < MAX_LEXER_STYLE);}; - void addLexerStyler(const TCHAR *lexerName, const TCHAR *lexerDesc, const TCHAR *lexerUserExt, TiXmlNode *lexerNode); + for (int i = 0 ; i < _nbLexerStyler ; ++i) + { + if (!lstrcmp(_lexerStylerArray[i].getLexerName(), lexerName)) + return &(_lexerStylerArray[i]); + } + return NULL; + }; + bool hasEnoughSpace() {return (_nbLexerStyler < MAX_LEXER_STYLE);}; + void addLexerStyler(const TCHAR *lexerName, const TCHAR *lexerDesc, const TCHAR *lexerUserExt, TiXmlNode *lexerNode); void eraseAll(); private : LexerStyler _lexerStylerArray[MAX_LEXER_STYLE]; @@ -564,14 +592,14 @@ struct LangMenuItem struct PrintSettings { bool _printLineNumber; int _printOption; - + generic_string _headerLeft; generic_string _headerMiddle; generic_string _headerRight; generic_string _headerFontName; int _headerFontStyle; int _headerFontSize; - + generic_string _footerLeft; generic_string _footerMiddle; generic_string _footerRight; @@ -600,104 +628,108 @@ struct PrintSettings { }; }; -class Date { + +class Date final +{ public: - Date() : _year(2008), _month(4), _day(26){}; - Date(unsigned long year, unsigned long month, unsigned long day) { - assert(year > 0 && year <= 9999); // I don't think Notepad++ will last till AD 10000 :) - assert(month > 0 && month <= 12); - assert(day > 0 && day <= 31); - assert(!(month == 2 && day > 29) && - !(month == 4 && day > 30) && - !(month == 6 && day > 30) && - !(month == 9 && day > 30) && - !(month == 11 && day > 30)); + Date() = default; + Date(unsigned long year, unsigned long month, unsigned long day) + : _year(year) + , _month(month) + , _day(day) + { + assert(year > 0 && year <= 9999); // I don't think Notepad++ will last till AD 10000 :) + assert(month > 0 && month <= 12); + assert(day > 0 && day <= 31); + assert(!(month == 2 && day > 29) && + !(month == 4 && day > 30) && + !(month == 6 && day > 30) && + !(month == 9 && day > 30) && + !(month == 11 && day > 30)); + } - _year = year; - _month = month; - _day = day; - }; - - Date(const TCHAR *dateStr); + Date(const TCHAR *dateStr); - // The constructor which makes the date of number of days from now - // nbDaysFromNow could be negative if user want to make a date in the past - // if the value of nbDaysFromNow is 0 then the date will be now + // The constructor which makes the date of number of days from now + // nbDaysFromNow could be negative if user want to make a date in the past + // if the value of nbDaysFromNow is 0 then the date will be now Date(int nbDaysFromNow); - void now(); + void now(); - generic_string toString() { // Return Notepad++ date format : YYYYMMDD - TCHAR dateStr[8+1]; - wsprintf(dateStr, TEXT("%04u%02u%02u"), _year, _month, _day); - return dateStr; - }; + generic_string toString() const // Return Notepad++ date format : YYYYMMDD + { + TCHAR dateStr[16]; + wsprintf(dateStr, TEXT("%04u%02u%02u"), _year, _month, _day); + return dateStr; + } - bool operator<(const Date & compare) const { - if (this->_year != compare._year) - return (this->_year < compare._year); - if (this->_month != compare._month) - return (this->_month < compare._month); - return (this->_day < compare._day); - }; - bool operator>(const Date & compare) const { - if (this->_year != compare._year) - return (this->_year > compare._year); - if (this->_month != compare._month) - return (this->_month > compare._month); - return (this->_day > compare._day); - }; - bool operator==(const Date & compare) const { - if (this->_year != compare._year) - return false; - if (this->_month != compare._month) - return false; - return (this->_day == compare._day); - }; - bool operator!=(const Date & compare) const { - if (this->_year != compare._year) - return true; - if (this->_month != compare._month) - return true; - return (this->_day != compare._day); - }; + bool operator < (const Date & compare) const + { + if (this->_year != compare._year) + return (this->_year < compare._year); + if (this->_month != compare._month) + return (this->_month < compare._month); + return (this->_day < compare._day); + } + + bool operator > (const Date & compare) const + { + if (this->_year != compare._year) + return (this->_year > compare._year); + if (this->_month != compare._month) + return (this->_month > compare._month); + return (this->_day > compare._day); + } + + bool operator == (const Date & compare) const + { + if (this->_year != compare._year) + return false; + if (this->_month != compare._month) + return false; + return (this->_day == compare._day); + } + + bool operator != (const Date & compare) const + { + if (this->_year != compare._year) + return true; + if (this->_month != compare._month) + return true; + return (this->_day != compare._day); + } private: - unsigned long _year; - unsigned long _month; - unsigned long _day; + unsigned long _year = 2008; + unsigned long _month = 4; + unsigned long _day = 26; }; -struct MatchedPairConf { - std::vector< std::pair > _matchedPairs; - std::vector< std::pair > _matchedPairsInit; // used only on init - bool _doHtmlXmlTag; - bool _doParentheses; - bool _doBrackets; - bool _doCurlyBrackets; - bool _doQuotes; - bool _doDoubleQuotes; - MatchedPairConf(): _doHtmlXmlTag(false), _doParentheses(false), _doBrackets(false), _doCurlyBrackets(false),\ - _doQuotes(false), _doDoubleQuotes(false) {}; - - bool hasUserDefinedPairs() const { return _matchedPairs.size() != 0; }; - bool hasDefaultPairs() const { return _doParentheses||_doBrackets||_doCurlyBrackets||_doQuotes||_doDoubleQuotes||_doHtmlXmlTag; }; - bool hasAnyPairsPair() const { return hasUserDefinedPairs() || hasDefaultPairs(); }; -}; - -struct NppGUI +class MatchedPairConf final { - NppGUI() : _toolBarStatus(TB_LARGE), _toolbarShow(true), _statusBarShow(true), _menuBarShow(true),\ - _tabStatus(TAB_DRAWTOPBAR | TAB_DRAWINACTIVETAB | TAB_DRAGNDROP), _splitterPos(POS_HORIZOTAL),\ - _userDefineDlgStatus(UDD_DOCKED), _tabSize(8), _tabReplacedBySpace(false), _fileAutoDetection(cdEnabled), _fileAutoDetectionOriginalValue(_fileAutoDetection),\ - _checkHistoryFiles(true) ,_enableSmartHilite(true), _disableSmartHiliteTmp(false), _enableTagsMatchHilite(true), _enableTagAttrsHilite(true), _enableHiliteNonHTMLZone(false),\ - _isMaximized(false), _isMinimizedToTray(false), _rememberLastSession(true), _isCmdlineNosessionActivated(false), _detectEncoding(true), _backup(bak_none), _useDir(false), _backupDir(TEXT("")),\ - _doTaskList(true), _maitainIndent(true), _openSaveDir(dir_followCurrent), _styleMRU(true), _styleURL(0),\ - _autocStatus(autoc_both), _autocFromLen(1), _funcParams(false), _definedSessionExt(TEXT("")), _cloudPath(TEXT("")), _availableClouds(0),\ - _doesExistUpdater(false), _caretBlinkRate(250), _caretWidth(1), _enableMultiSelection(false), _shortTitlebar(false), _themeName(TEXT("")), _isLangMenuCompact(false),\ - _smartHiliteCaseSensitive(false), _leftmostDelimiter('('), _rightmostDelimiter(')'), _delimiterSelectionOnEntireDocument(false), _multiInstSetting(monoInst),\ - _fileSwitcherWithoutExtColumn(false), _isSnapshotMode(true), _snapshotBackupTiming(7000), _backSlashIsEscapeCharacterForSql(true) { +public: + bool hasUserDefinedPairs() const { return _matchedPairs.size() != 0; } + bool hasDefaultPairs() const { return _doParentheses||_doBrackets||_doCurlyBrackets||_doQuotes||_doDoubleQuotes||_doHtmlXmlTag; } + bool hasAnyPairsPair() const { return hasUserDefinedPairs() || hasDefaultPairs(); } + +public: + std::vector> _matchedPairs; + std::vector> _matchedPairsInit; // used only on init + bool _doHtmlXmlTag = false; + bool _doParentheses = false; + bool _doBrackets = false; + bool _doCurlyBrackets = false; + bool _doQuotes = false; + bool _doDoubleQuotes = false; +}; + + +struct NppGUI final +{ + NppGUI() + { _appPos.left = 0; _appPos.top = 0; _appPos.right = 700; @@ -705,13 +737,14 @@ struct NppGUI _defaultDir[0] = 0; _defaultDirExp[0] = 0; - }; - toolBarStatusType _toolBarStatus; // small, large ou standard - bool _toolbarShow; - bool _statusBarShow; // show ou hide - bool _menuBarShow; + } - // 1st bit : draw top bar; + toolBarStatusType _toolBarStatus = TB_LARGE; + bool _toolbarShow = true; + bool _statusBarShow = true; + bool _menuBarShow = true; + + // 1st bit : draw top bar; // 2nd bit : draw inactive tabs // 3rd bit : enable drag & drop // 4th bit : reduce the height @@ -719,99 +752,104 @@ struct NppGUI // 6th bit : enable multiline // 0:don't draw; 1:draw top bar 2:draw inactive tabs 3:draw both 7:draw both+drag&drop - int _tabStatus; + int _tabStatus = (TAB_DRAWTOPBAR | TAB_DRAWINACTIVETAB | TAB_DRAGNDROP); - bool _splitterPos; // horizontal ou vertical - int _userDefineDlgStatus; // (hide||show) && (docked||undocked) + bool _splitterPos = POS_HORIZOTAL; + int _userDefineDlgStatus = UDD_DOCKED; - int _tabSize; - bool _tabReplacedBySpace; + int _tabSize = 8; + bool _tabReplacedBySpace = false; - ChangeDetect _fileAutoDetection; - ChangeDetect _fileAutoDetectionOriginalValue; - bool _checkHistoryFiles; + ChangeDetect _fileAutoDetection = cdEnabled; + ChangeDetect _fileAutoDetectionOriginalValue = cdEnabled; + bool _checkHistoryFiles = true; RECT _appPos; - bool _isMaximized; - bool _isMinimizedToTray; - bool _rememberLastSession; // remember next session boolean will be written in the settings - bool _isCmdlineNosessionActivated; // used for if -nosession is indicated on the launch time - bool _detectEncoding; - bool _doTaskList; - bool _maitainIndent; - bool _enableSmartHilite; - bool _smartHiliteCaseSensitive; - bool _disableSmartHiliteTmp; - bool _enableTagsMatchHilite; - bool _enableTagAttrsHilite; - bool _enableHiliteNonHTMLZone; - bool _styleMRU; - char _leftmostDelimiter, _rightmostDelimiter; - bool _delimiterSelectionOnEntireDocument; - bool _backSlashIsEscapeCharacterForSql; + bool _isMaximized = false; + bool _isMinimizedToTray = false; + bool _rememberLastSession = true; // remember next session boolean will be written in the settings + bool _isCmdlineNosessionActivated = false; // used for if -nosession is indicated on the launch time + bool _detectEncoding = true; + bool _doTaskList = true; + bool _maitainIndent = true; + bool _enableSmartHilite = true; + bool _smartHiliteCaseSensitive = false; + bool _disableSmartHiliteTmp = false; + bool _enableTagsMatchHilite = true; + bool _enableTagAttrsHilite = true; + bool _enableHiliteNonHTMLZone = false; + bool _styleMRU = true; + char _leftmostDelimiter = '('; + char _rightmostDelimiter = ')'; + bool _delimiterSelectionOnEntireDocument = false; + bool _backSlashIsEscapeCharacterForSql = true; // 0 : do nothing // 1 : don't draw underline // 2 : draw underline - int _styleURL; + int _styleURL = 0; NewDocDefaultSettings _newDocDefaultSettings; + + void setTabReplacedBySpace(bool b) {_tabReplacedBySpace = b;}; const NewDocDefaultSettings & getNewDocDefaultSettings() const {return _newDocDefaultSettings;}; std::vector _excludedLangList; - bool _isLangMenuCompact; + bool _isLangMenuCompact = false; PrintSettings _printSettings; - BackupFeature _backup; - bool _useDir; + BackupFeature _backup = bak_none; + bool _useDir = false; generic_string _backupDir; DockingManagerData _dockingData; GlobalOverride _globalOverride; enum AutocStatus{autoc_none, autoc_func, autoc_word, autoc_both}; - AutocStatus _autocStatus; - size_t _autocFromLen; - bool _funcParams; + AutocStatus _autocStatus = autoc_both; + size_t _autocFromLen = 1; + bool _funcParams = false; MatchedPairConf _matchedPairConf; generic_string _definedSessionExt; - - - struct AutoUpdateOptions { - bool _doAutoUpdate; - int _intervalDays; - Date _nextUpdateDate; - AutoUpdateOptions(): _doAutoUpdate(true), _intervalDays(15), _nextUpdateDate(Date()) {}; - } _autoUpdateOpt; - bool _doesExistUpdater; - int _caretBlinkRate; - int _caretWidth; - bool _enableMultiSelection; - bool _shortTitlebar; + struct AutoUpdateOptions + { + bool _doAutoUpdate; + int _intervalDays; + Date _nextUpdateDate; + AutoUpdateOptions(): _doAutoUpdate(true), _intervalDays(15), _nextUpdateDate(Date()) {}; + } + _autoUpdateOpt; + + bool _doesExistUpdater = false; + int _caretBlinkRate = 250; + int _caretWidth = 1; + bool _enableMultiSelection = false; + + bool _shortTitlebar = false; + + OpenSaveDirSetting _openSaveDir = dir_followCurrent; - OpenSaveDirSetting _openSaveDir; - TCHAR _defaultDir[MAX_PATH]; TCHAR _defaultDirExp[MAX_PATH]; //expanded environment variables generic_string _themeName; - MultiInstSetting _multiInstSetting; - bool _fileSwitcherWithoutExtColumn; + MultiInstSetting _multiInstSetting = monoInst; + bool _fileSwitcherWithoutExtColumn = false; bool isSnapshotMode() const {return _isSnapshotMode && _rememberLastSession && !_isCmdlineNosessionActivated;}; - bool _isSnapshotMode; - size_t _snapshotBackupTiming; + bool _isSnapshotMode = true; + size_t _snapshotBackupTiming = 7000; generic_string _cloudPath; // this option will never be read/written from/to config.xml - unsigned char _availableClouds; // this option will never be read/written from/to config.xml + unsigned char _availableClouds = '\0'; // this option will never be read/written from/to config.xml }; struct ScintillaViewParams { ScintillaViewParams() : _lineNumberMarginShow(true), _bookMarkMarginShow(true),_borderWidth(2),\ - _folderStyle(FOLDER_STYLE_BOX), _foldMarginShow(true), _indentGuideLineShow(true),\ - _currentLineHilitingShow(true), _wrapSymbolShow(false), _doWrap(false), _edgeNbColumn(80),\ + _folderStyle(FOLDER_STYLE_BOX), _foldMarginShow(true), _indentGuideLineShow(true),\ + _currentLineHilitingShow(true), _wrapSymbolShow(false), _doWrap(false), _edgeNbColumn(80),\ _zoom(0), _zoom2(0), _whiteSpaceShow(false), _eolShow(false), _lineWrapMethod(LINEWRAP_ALIGNED),\ _disableAdvancedScrolling(false), _doSmoothFont(false) {}; bool _lineNumberMarginShow; @@ -830,7 +868,7 @@ struct ScintillaViewParams int _zoom2; bool _whiteSpaceShow; bool _eolShow; - int _borderWidth; + int _borderWidth; bool _disableAdvancedScrolling; bool _doSmoothFont; }; @@ -841,130 +879,133 @@ const int NB_MAX_USER_LANG = 30; const int NB_MAX_EXTERNAL_LANG = 30; const int NB_MAX_IMPORTED_UDL = 50; -const int NB_MAX_FINDHISTORY_FIND = 30; +const int NB_MAX_FINDHISTORY_FIND = 30; const int NB_MAX_FINDHISTORY_REPLACE = 30; -const int NB_MAX_FINDHISTORY_PATH = 30; +const int NB_MAX_FINDHISTORY_PATH = 30; const int NB_MAX_FINDHISTORY_FILTER = 20; const int MASK_ReplaceBySpc = 0x80; const int MASK_TabSize = 0x7F; -struct Lang + + + +struct Lang final { - LangType _langID; + LangType _langID = L_TEXT; generic_string _langName; - const TCHAR *_defaultExtList; + const TCHAR *_defaultExtList = nullptr; const TCHAR *_langKeyWordList[NB_LIST]; - const TCHAR *_pCommentLineSymbol; - const TCHAR *_pCommentStart; - const TCHAR *_pCommentEnd; + const TCHAR *_pCommentLineSymbol = nullptr; + const TCHAR *_pCommentStart = nullptr; + const TCHAR *_pCommentEnd = nullptr; - bool _isTabReplacedBySpace; - int _tabSize; + bool _isTabReplacedBySpace = false; + int _tabSize = -1; - Lang(): _langID(L_TEXT), _langName(TEXT("")), _defaultExtList(NULL), _pCommentLineSymbol(NULL), _pCommentStart(NULL), - _pCommentEnd(NULL), _isTabReplacedBySpace(false), _tabSize(-1) { - for (int i = 0 ; i < NB_LIST ; _langKeyWordList[i] = NULL, ++i); - }; - Lang(LangType langID, const TCHAR *name) : _langID(langID), _langName(name?name:TEXT("")),\ - _defaultExtList(NULL), _pCommentLineSymbol(NULL), _pCommentStart(NULL),\ - _pCommentEnd(NULL), _isTabReplacedBySpace(false), _tabSize(-1) { + Lang() + { for (int i = 0 ; i < NB_LIST ; _langKeyWordList[i] = NULL, ++i); - }; - ~Lang() {}; + } + + Lang(LangType langID, const TCHAR *name) + : _langID(langID) + , _langName(name ? name : TEXT("")) + { + for (int i = 0 ; i < NB_LIST ; _langKeyWordList[i] = NULL, ++i); + } + + ~Lang() = default; + void setDefaultExtList(const TCHAR *extLst){ _defaultExtList = extLst; - }; - + } + void setCommentLineSymbol(const TCHAR *commentLine){ _pCommentLineSymbol = commentLine; - }; - + } + void setCommentStart(const TCHAR *commentStart){ _pCommentStart = commentStart; - }; + } void setCommentEnd(const TCHAR *commentEnd){ _pCommentEnd = commentEnd; - }; + } - void setTabInfo(int tabInfo) { - if (tabInfo != -1 && tabInfo & MASK_TabSize) - { - _isTabReplacedBySpace = (tabInfo & MASK_ReplaceBySpc) != 0; - _tabSize = tabInfo & MASK_TabSize; - } - }; + void setTabInfo(int tabInfo) + { + if (tabInfo != -1 && tabInfo & MASK_TabSize) + { + _isTabReplacedBySpace = (tabInfo & MASK_ReplaceBySpc) != 0; + _tabSize = tabInfo & MASK_TabSize; + } + } const TCHAR * getDefaultExtList() const { return _defaultExtList; - }; - + } + void setWords(const TCHAR *words, int index) { _langKeyWordList[index] = words; - }; + } const TCHAR * getWords(int index) const { return _langKeyWordList[index]; - }; + } LangType getLangID() const {return _langID;}; const TCHAR * getLangName() const {return _langName.c_str();}; - int getTabInfo() const { - if (_tabSize == -1) return -1; - return (_isTabReplacedBySpace?0x80:0x00) | _tabSize; - }; + int getTabInfo() const + { + if (_tabSize == -1) return -1; + return (_isTabReplacedBySpace?0x80:0x00) | _tabSize; + } }; -class UserLangContainer + + +class UserLangContainer final { -friend class Notepad_plus; -friend class ScintillaEditView; -friend class NppParameters; - -friend class SharedParametersDialog; -friend class FolderStyleDialog; -friend class KeyWordsStyleDialog; -friend class CommentStyleDialog; -friend class SymbolsStyleDialog; -friend class UserDefineDialog; -friend class StylerDlg; - -public : - UserLangContainer(){ +public: + UserLangContainer() + { _name = TEXT("new user define"); _ext = TEXT(""); _udlVersion = TEXT(""); - _allowFoldOfComments = false; + _allowFoldOfComments = false; _forcePureLC = PURE_LC_NONE; - _decimalSeparator = DECSEP_DOT; + _decimalSeparator = DECSEP_DOT; _foldCompact = false; - _isCaseIgnored = false; + _isCaseIgnored = false; for (int i = 0 ; i < SCE_USER_KWLIST_TOTAL ; ++i) *_keywordLists[i] = '\0'; for (int i = 0 ; i < SCE_USER_TOTAL_KEYWORD_GROUPS ; ++i) - _isPrefix[i] = false; - }; - UserLangContainer(const TCHAR *name, const TCHAR *ext, const TCHAR *udlVer) : _name(name), _ext(ext), _udlVersion(udlVer) { - _allowFoldOfComments = false; + _isPrefix[i] = false; + } + + UserLangContainer(const TCHAR *name, const TCHAR *ext, const TCHAR *udlVer) : _name(name), _ext(ext), _udlVersion(udlVer) + { + _allowFoldOfComments = false; _forcePureLC = PURE_LC_NONE; - _decimalSeparator = DECSEP_DOT; + _decimalSeparator = DECSEP_DOT; _foldCompact = false; for (int i = 0 ; i < SCE_USER_KWLIST_TOTAL ; ++i) *_keywordLists[i] = '\0'; for (int i = 0 ; i < SCE_USER_TOTAL_KEYWORD_GROUPS ; ++i) - _isPrefix[i] = false; - }; + _isPrefix[i] = false; + } - UserLangContainer & operator=(const UserLangContainer & ulc) { + UserLangContainer & operator = (const UserLangContainer & ulc) + { if (this != &ulc) - { + { this->_name = ulc._name; this->_ext = ulc._ext; this->_udlVersion = ulc._udlVersion; @@ -983,14 +1024,15 @@ public : if (st._fgColor == COLORREF(-1)) st._fgColor = black; } + for (int i = 0 ; i < SCE_USER_KWLIST_TOTAL ; ++i) lstrcpy(this->_keywordLists[i], ulc._keywordLists[i]); for (int i = 0 ; i < SCE_USER_TOTAL_KEYWORD_GROUPS ; ++i) - _isPrefix[i] = ulc._isPrefix[i]; + _isPrefix[i] = ulc._isPrefix[i]; } return *this; - }; + } // int getNbKeywordList() {return SCE_USER_KWLIST_TOTAL;}; const TCHAR * getName() {return _name.c_str();}; @@ -1010,71 +1052,83 @@ private: bool _isCaseIgnored; bool _allowFoldOfComments; int _forcePureLC; - int _decimalSeparator; + int _decimalSeparator; bool _foldCompact; + + // nakama zone + friend class Notepad_plus; + friend class ScintillaEditView; + friend class NppParameters; + + friend class SharedParametersDialog; + friend class FolderStyleDialog; + friend class KeyWordsStyleDialog; + friend class CommentStyleDialog; + friend class SymbolsStyleDialog; + friend class UserDefineDialog; + friend class StylerDlg; }; #define MAX_EXTERNAL_LEXER_NAME_LEN 16 #define MAX_EXTERNAL_LEXER_DESC_LEN 32 -class ExternalLangContainer + + +class ExternalLangContainer final { public: TCHAR _name[MAX_EXTERNAL_LEXER_NAME_LEN]; TCHAR _desc[MAX_EXTERNAL_LEXER_DESC_LEN]; - ExternalLangContainer(const TCHAR *name, const TCHAR *desc) { + ExternalLangContainer(const TCHAR* name, const TCHAR* desc) + { generic_strncpy(_name, name, MAX_EXTERNAL_LEXER_NAME_LEN); generic_strncpy(_desc, desc, MAX_EXTERNAL_LEXER_DESC_LEN); - }; + } }; -struct FindHistory { + +struct FindHistory final +{ enum searchMode{normal, extended, regExpr}; enum transparencyMode{none, onLossingFocus, persistant}; - FindHistory() : _nbMaxFindHistoryPath(10), _nbMaxFindHistoryFilter(10), _nbMaxFindHistoryFind(10), _nbMaxFindHistoryReplace(10),\ - _isMatchWord(false), _isMatchCase(false),_isWrap(true),_isDirectionDown(true),\ - _isFifRecuisive(true), _isFifInHiddenFolder(false), _isDlgAlwaysVisible(false),\ - _isFilterFollowDoc(false), _isFolderFollowDoc(false),\ - _searchMode(normal), _transparencyMode(onLossingFocus), _transparency(150), - _dotMatchesNewline(false) - - {}; - int _nbMaxFindHistoryPath; - int _nbMaxFindHistoryFilter; - int _nbMaxFindHistoryFind; - int _nbMaxFindHistoryReplace; + int _nbMaxFindHistoryPath = 10; + int _nbMaxFindHistoryFilter = 10; + int _nbMaxFindHistoryFind = 10; + int _nbMaxFindHistoryReplace = 10; - std::vector _findHistoryPaths; + std::vector _findHistoryPaths; std::vector _findHistoryFilters; std::vector _findHistoryFinds; std::vector _findHistoryReplaces; - bool _isMatchWord; - bool _isMatchCase; - bool _isWrap; - bool _isDirectionDown; - bool _dotMatchesNewline; + bool _isMatchWord = false; + bool _isMatchCase = false; + bool _isWrap = true; + bool _isDirectionDown = true; + bool _dotMatchesNewline = false; - bool _isFifRecuisive; - bool _isFifInHiddenFolder; - - searchMode _searchMode; - transparencyMode _transparencyMode; - int _transparency; + bool _isFifRecuisive = true; + bool _isFifInHiddenFolder = false; - bool _isDlgAlwaysVisible; - bool _isFilterFollowDoc; - bool _isFolderFollowDoc; + searchMode _searchMode = normal; + transparencyMode _transparencyMode = onLossingFocus; + int _transparency = 150; + + bool _isDlgAlwaysVisible = false; + bool _isFilterFollowDoc = false; + bool _isFolderFollowDoc = false; }; -class LocalizationSwitcher { -friend class NppParameters; -public : - LocalizationSwitcher() : _fileName("") {}; - struct LocalizationDefinition { + +class LocalizationSwitcher final +{ +friend class NppParameters; +public: + struct LocalizationDefinition + { wchar_t *_langName; wchar_t *_xmlFileName; }; @@ -1085,87 +1139,102 @@ public : std::wstring getXmlFilePathFromLangName(const wchar_t *langName) const; bool switchToLang(wchar_t *lang2switch) const; - size_t size() const { + size_t size() const + { return _localizationList.size(); - }; + } - std::pair getElementFromIndex(size_t index) { + std::pair getElementFromIndex(size_t index) const + { if (index >= _localizationList.size()) - return std::pair(TEXT(""), TEXT("")); + return std::pair(std::wstring(), std::wstring()); return _localizationList[index]; - }; + } - void setFileName(const char *fn) { - if (fn) - _fileName = fn; - }; + void setFileName(const char *fn) + { + if (fn) + _fileName = fn; + } - std::string getFileName() const { - return _fileName; - }; + std::string getFileName() const + { + return _fileName; + } -private : +private: std::vector< std::pair< std::wstring, std::wstring > > _localizationList; std::wstring _nativeLangPath; std::string _fileName; }; -class ThemeSwitcher { + +class ThemeSwitcher final +{ friend class NppParameters; -public : - ThemeSwitcher(){}; - - void addThemeFromXml(generic_string xmlFullPath) { +public: + void addThemeFromXml(generic_string xmlFullPath) + { _themeList.push_back(std::pair(getThemeFromXmlFileName(xmlFullPath.c_str()), xmlFullPath)); - }; + } - void addDefaultThemeFromXml(generic_string xmlFullPath) { + void addDefaultThemeFromXml(generic_string xmlFullPath) + { _themeList.push_back(std::pair(TEXT("Default (stylers.xml)"), xmlFullPath)); - }; + } generic_string getThemeFromXmlFileName(const TCHAR *fn) const; - generic_string getXmlFilePathFromThemeName(const TCHAR *themeName) const { + generic_string getXmlFilePathFromThemeName(const TCHAR *themeName) const + { if (!themeName || themeName[0]) - return TEXT(""); + return generic_string(); generic_string themePath = _stylesXmlPath; return themePath; - }; + } - bool themeNameExists(const TCHAR *themeName) { + bool themeNameExists(const TCHAR *themeName) + { for (size_t i = 0; i < _themeList.size(); ++i ) { - if (! (getElementFromIndex(i)).first.compare(themeName) ) return true; + if (! (getElementFromIndex(i)).first.compare(themeName)) + return true; } return false; } - size_t size() const { + size_t size() const + { return _themeList.size(); - }; + } - - std::pair & getElementFromIndex(size_t index) { - //if (index >= _themeList.size()) - //return pair(TEXT(""), TEXT("")); + + std::pair & getElementFromIndex(size_t index) + { + assert(index < _themeList.size()); return _themeList[index]; - }; + } -private : - std::vector< std::pair< generic_string, generic_string > > _themeList; +private: + std::vector> _themeList; generic_string _stylesXmlPath; }; -class PluginList { + +class PluginList final +{ public : - void add(generic_string fn, bool isInBL){ + void add(generic_string fn, bool isInBL) + { _list.push_back(std::pair(fn, isInBL)); - }; -private : + } + +private: std::vector>_list; }; + const int NB_LANG = 80; const bool DUP = true; const bool FREE = false; @@ -1173,67 +1242,76 @@ const bool FREE = false; const int RECENTFILES_SHOWFULLPATH = -1; const int RECENTFILES_SHOWONLYFILENAME = 0; -class NppParameters + + + +class NppParameters final { public: - static NppParameters * getInstance() {return _pSelf;}; + static NppParameters * getInstance() {return _pSelf;}; static LangType getLangIDFromStr(const TCHAR *langName); static generic_string getLocPathFromStr(const generic_string & localizationCode); + bool load(); bool reloadLang(); bool reloadStylers(TCHAR *stylePath = NULL); - void destroyInstance(); + void destroyInstance(); generic_string getSettingsFolder(); bool _isTaskListRBUTTONUP_Active; int L_END; const NppGUI & getNppGUI() const { - return _nppGUI; - }; + return _nppGUI; + } - const TCHAR * getWordList(LangType langID, int typeIndex) const { - Lang *pLang = getLangFromID(langID); - if (!pLang) return NULL; + const TCHAR * getWordList(LangType langID, int typeIndex) const + { + Lang *pLang = getLangFromID(langID); + if (!pLang) return nullptr; - return pLang->getWords(typeIndex); - }; + return pLang->getWords(typeIndex); + } - Lang * getLangFromID(LangType langID) const { + + Lang * getLangFromID(LangType langID) const + { for (int i = 0 ; i < _nbLang ; ++i) { if ((_langList[i]->_langID == langID) || (!_langList[i])) return _langList[i]; } - return NULL; - }; + return nullptr; + } - Lang * getLangFromIndex(int i) const { - if (i >= _nbLang) return NULL; - return _langList[i]; - }; + Lang * getLangFromIndex(int i) const + { + return (i >= 0 and i < _nbLang) ? _langList[i] : nullptr; + } int getNbLang() const {return _nbLang;}; - + LangType getLangFromExt(const TCHAR *ext); - const TCHAR * getLangExtFromName(const TCHAR *langName) const { + const TCHAR * getLangExtFromName(const TCHAR *langName) const + { for (int i = 0 ; i < _nbLang ; ++i) { if (_langList[i]->_langName == langName) return _langList[i]->_defaultExtList; } - return NULL; - }; + return nullptr; + } - const TCHAR * getLangExtFromLangType(LangType langType) const { + const TCHAR * getLangExtFromLangType(LangType langType) const + { for (int i = 0 ; i < _nbLang ; ++i) { if (_langList[i]->_langID == langType) return _langList[i]->_defaultExtList; } - return NULL; - }; + return nullptr; + } int getNbLRFile() const {return _nbRecentFile;}; @@ -1249,77 +1327,54 @@ public: void setPutRecentFileInSubMenu(bool doSubmenu) { _putRecentFileInSubMenu = doSubmenu; - }; + } bool putRecentFileInSubMenu() const {return _putRecentFileInSubMenu;}; void setRecentFileCustomLength(int len) { _recentFileCustomLength = len; - }; + } int getRecentFileCustomLength() const {return _recentFileCustomLength;}; - const ScintillaViewParams & getSVP() const { - return _svp; - }; + const ScintillaViewParams& getSVP() const { + return _svp; + } bool writeRecentFileHistorySettings(int nbMaxFile = -1) const; bool writeHistory(const TCHAR *fullpath); bool writeProjectPanelsSettings() const; - TiXmlNode * getChildElementByAttribut(TiXmlNode *pere, const TCHAR *childName,\ - const TCHAR *attributName, const TCHAR *attributVal) const; + TiXmlNode* getChildElementByAttribut(TiXmlNode *pere, const TCHAR *childName, const TCHAR *attributName, const TCHAR *attributVal) const; bool writeScintillaParams(const ScintillaViewParams & svp); bool writeGUIParams(); void writeStyles(LexerStylerArray & lexersStylers, StyleArray & globalStylers); - bool insertTabInfo(const TCHAR *langName, int tabInfo); + bool insertTabInfo(const TCHAR *langName, int tabInfo); - LexerStylerArray & getLStylerArray() {return _lexerStylerArray;}; - StyleArray & getGlobalStylers() {return _widgetStyleArray;}; + LexerStylerArray & getLStylerArray() {return _lexerStylerArray;}; + StyleArray & getGlobalStylers() {return _widgetStyleArray;}; - StyleArray & getMiscStylerArray() {return _widgetStyleArray;}; + StyleArray & getMiscStylerArray() {return _widgetStyleArray;}; GlobalOverride & getGlobalOverrideStyle() {return _nppGUI._globalOverride;}; - COLORREF getCurLineHilitingColour() { - int i = _widgetStyleArray.getStylerIndexByName(TEXT("Current line background colour")); - if (i == -1) return i; - Style & style = _widgetStyleArray.getStyler(i); - return style._bgColor; - }; - void setCurLineHilitingColour(COLORREF colour2Set) { - int i = _widgetStyleArray.getStylerIndexByName(TEXT("Current line background colour")); - if (i == -1) return; - Style & style = _widgetStyleArray.getStyler(i); - style._bgColor = colour2Set; - }; + COLORREF getCurLineHilitingColour(); + void setCurLineHilitingColour(COLORREF colour2Set); void setFontList(HWND hWnd); - const std::vector & getFontList() const { return _fontlist; }; - - int getNbUserLang() const {return _nbUserLang;}; + const std::vector& getFontList() const { return _fontlist; } + + int getNbUserLang() const {return _nbUserLang;} UserLangContainer & getULCFromIndex(int i) {return *_userLangArray[i];}; - UserLangContainer * getULCFromName(const TCHAR *userLangName) { - for (int i = 0 ; i < _nbUserLang ; ++i) - if (!lstrcmp(userLangName, _userLangArray[i]->_name.c_str())) - return _userLangArray[i]; - //qui doit etre jamais passer - return NULL; - }; - + UserLangContainer * getULCFromName(const TCHAR *userLangName); + int getNbExternalLang() const {return _nbExternalLang;}; - int getExternalLangIndexFromName(const TCHAR *externalLangName) const { - for (int i = 0 ; i < _nbExternalLang ; ++i) - { - if (!lstrcmp(externalLangName, _externalLangArray[i]->_name)) - return i; - } - return -1; - }; + int getExternalLangIndexFromName(const TCHAR *externalLangName) const; + ExternalLangContainer & getELCFromIndex(int i) {return *_externalLangArray[i];}; bool ExternalLangHasRoom() const {return _nbExternalLang < NB_MAX_EXTERNAL_LANG;}; @@ -1332,7 +1387,8 @@ public: void writeSession(const Session & session, const TCHAR *fileName = NULL); bool writeFindHistory(); - bool isExistingUserLangName(const TCHAR *newName) const { + bool isExistingUserLangName(const TCHAR *newName) const + { if ((!newName) || (!newName[0])) return true; @@ -1342,37 +1398,14 @@ public: return true; } return false; - }; + } - const TCHAR * getUserDefinedLangNameFromExt(TCHAR *ext, TCHAR *fullName) { - if ((!ext) || (!ext[0])) - return NULL; - - for (int i = 0 ; i < _nbUserLang ; ++i) - { - std::vector extVect; - cutString(_userLangArray[i]->_ext.c_str(), extVect); - for (size_t j = 0, len = extVect.size(); j < len; ++j) - if (!generic_stricmp(extVect[j].c_str(), ext) || (_tcschr(fullName, '.') && !generic_stricmp(extVect[j].c_str(), fullName))) - return _userLangArray[i]->_name.c_str(); - } - return NULL; - }; + const TCHAR * getUserDefinedLangNameFromExt(TCHAR *ext, TCHAR *fullName) const; int addUserLangToEnd(const UserLangContainer & userLang, const TCHAR *newName); void removeUserLang(int index); - - bool isExistingExternalLangName(const TCHAR *newName) const { - if ((!newName) || (!newName[0])) - return true; - for (int i = 0 ; i < _nbExternalLang ; ++i) - { - if (!lstrcmp(_externalLangArray[i]->_name, newName)) - return true; - } - return false; - }; + bool isExistingExternalLangName(const TCHAR *newName) const; int addExternalLangToEnd(ExternalLangContainer * externalLang); @@ -1382,28 +1415,18 @@ public: bool isTransparentAvailable() const { return (_transparentFuncAddr != NULL); - }; + } // 0 <= percent < 256 // if (percent == 255) then opacq - void SetTransparent(HWND hwnd, int percent) { - if (!_transparentFuncAddr) return; - ::SetWindowLongPtr(hwnd, GWL_EXSTYLE, ::GetWindowLongPtr(hwnd, GWL_EXSTYLE) | 0x00080000); - if (percent > 255) - percent = 255; - if (percent < 0) - percent = 0; - _transparentFuncAddr(hwnd, 0, percent, 0x00000002); - }; + void SetTransparent(HWND hwnd, int percent); - void removeTransparent(HWND hwnd) { - if (hwnd != NULL) - ::SetWindowLongPtr(hwnd, GWL_EXSTYLE, ::GetWindowLongPtr(hwnd, GWL_EXSTYLE) & ~0x00080000); - }; + void removeTransparent(HWND hwnd); - void setCmdlineParam(const CmdLineParams & cmdLineParams) { + void setCmdlineParam(const CmdLineParams & cmdLineParams) + { _cmdLineParams = cmdLineParams; - }; + } CmdLineParams & getCmdLineParams() {return _cmdLineParams;}; void setFileSaveDlgFilterIndex(int ln) {_fileSaveDlgFilterIndex = ln;}; @@ -1433,25 +1456,24 @@ public: void setAccelerator(Accelerator *pAccel) {_pAccelerator = pAccel;}; Accelerator * getAccelerator() {return _pAccelerator;}; void setScintillaAccelerator(ScintillaAccelerator *pScintAccel) {_pScintAccelerator = pScintAccel;}; - ScintillaAccelerator * getScintillaAccelerator() {return _pScintAccelerator;}; + ScintillaAccelerator * getScintillaAccelerator() {return _pScintAccelerator;}; generic_string getNppPath() const {return _nppPath;}; - generic_string getContextMenuPath() const {return _contextMenuPath;}; + generic_string getContextMenuPath() const {return _contextMenuPath;}; const TCHAR * getAppDataNppDir() const {return _appdataNppDir.c_str();}; const TCHAR * getWorkingDir() const {return _currentDirectory.c_str();}; - const TCHAR * getworkSpaceFilePath(int i) const { - if (i < 0 || i > 2) return NULL; + const TCHAR * getworkSpaceFilePath(int i) const + { + if (i < 0 || i > 2) return nullptr; return _workSpaceFilePathes[i].c_str(); - }; + } - void setWorkSpaceFilePath(int i, const TCHAR *wsFile) { - if (i < 0 || i > 2 || !wsFile) return; - _workSpaceFilePathes[i] = wsFile; - }; + void setWorkSpaceFilePath(int i, const TCHAR *wsFile); void setWorkingDir(const TCHAR * newPath); - void setStartWithLocFileName(generic_string locPath) { + void setStartWithLocFileName(generic_string locPath) + { _startWithLocFileName = locPath; } @@ -1459,19 +1481,20 @@ public: int langTypeToCommandID(LangType lt) const; WNDPROC getEnableThemeDlgTexture() const {return _enableThemeDialogTextureFuncAddr;}; - struct FindDlgTabTitiles { + struct FindDlgTabTitiles final + { generic_string _find; generic_string _replace; generic_string _findInFiles; generic_string _mark; - FindDlgTabTitiles() : _find(TEXT("")), _replace(TEXT("")), _findInFiles(TEXT("")), _mark(TEXT("")) {}; }; FindDlgTabTitiles & getFindDlgTabTitiles() { return _findDlgTabTitiles;}; bool asNotepadStyle() const {return _asNotepadStyle;}; - bool reloadPluginCmds() { + bool reloadPluginCmds() + { return getPluginCmdsFromXmlTree(); } @@ -1481,45 +1504,45 @@ public: FindHistory & getFindHistory() {return _findHistory;}; bool _isFindReplacing; // an on the fly variable for find/replace functions void safeWow64EnableWow64FsRedirection(BOOL Wow64FsEnableRedirection); - + LocalizationSwitcher & getLocalizationSwitcher() { return _localizationSwitcher; - }; + } ThemeSwitcher & getThemeSwitcher() { return _themeSwitcher; - }; + } std::vector & getBlackList() { return _blacklist; }; - bool isInBlackList(TCHAR *fn) { - for (size_t i = 0, len = _blacklist.size(); i < len ; ++i) - if (_blacklist[i] == fn) - return true; - return false; - }; + bool isInBlackList(TCHAR *fn) const + { + for (auto& element: _blacklist) + { + if (element == fn) + return true; + } + return false; + } - PluginList & getPluginList() {return _pluginList;}; - bool importUDLFromFile(generic_string sourceFile); - bool exportUDLToFile(int langIndex2export, generic_string fileName2save); - NativeLangSpeaker * getNativeLangSpeaker() { + PluginList & getPluginList() {return _pluginList;}; + bool importUDLFromFile(generic_string sourceFile); + bool exportUDLToFile(int langIndex2export, generic_string fileName2save); + NativeLangSpeaker* getNativeLangSpeaker() { return _pNativeLangSpeaker; - }; + } void setNativeLangSpeaker(NativeLangSpeaker *nls) { _pNativeLangSpeaker = nls; - }; + } bool isLocal() const { return _isLocal; }; - void saveConfig_xml() { - if (_pXmlUserDoc) - _pXmlUserDoc->SaveFile(); - }; + void saveConfig_xml(); generic_string getUserPath() const { return _userPath; - }; + } bool writeSettingsFilesOnCloudForThe1stTime(const generic_string & cloudSettingsPath); void setCloudChoice(const TCHAR *pathChoice); @@ -1528,35 +1551,36 @@ public: COLORREF getCurrentDefaultBgColor() const { return _currentDefaultBgColor; - }; + } COLORREF getCurrentDefaultFgColor() const { return _currentDefaultFgColor; - }; + } void setCurrentDefaultBgColor(COLORREF c) { _currentDefaultBgColor = c; - }; + } void setCurrentDefaultFgColor(COLORREF c) { _currentDefaultFgColor = c; - }; + } DPIManager _dpiManager; + private: - NppParameters(); + NppParameters(); ~NppParameters(); - static NppParameters *_pSelf; + static NppParameters *_pSelf; TiXmlDocument *_pXmlDoc, *_pXmlUserDoc, *_pXmlUserStylerDoc, *_pXmlUserLangDoc,\ *_pXmlToolIconsDoc, *_pXmlShortcutDoc, *_pXmlSessionDoc,\ - *_pXmlBlacklistDoc; + *_pXmlBlacklistDoc; TiXmlDocument *_importedULD[NB_MAX_IMPORTED_UDL]; int _nbImportedULD; - + TiXmlDocumentA *_pXmlNativeLangDocA, *_pXmlContextMenuDocA; std::vector _pXmlExternalLexerDoc; @@ -1587,13 +1611,13 @@ private: int _fileSaveDlgFilterIndex; - // All Styles (colours & fonts) + // All Styles (colours & fonts) LexerStylerArray _lexerStylerArray; - StyleArray _widgetStyleArray; + StyleArray _widgetStyleArray; std::vector _fontlist; std::vector _blacklist; - PluginList _pluginList; + PluginList _pluginList; HMODULE _hUXTheme; @@ -1624,7 +1648,7 @@ private: generic_string _shortcutsPath; generic_string _contextMenuPath; generic_string _sessionPath; - generic_string _blacklistPath; + generic_string _blacklistPath; generic_string _nppPath; generic_string _userPath; generic_string _stylerPath; @@ -1647,30 +1671,14 @@ private: generic_string _initialCloudChoice; - static int CALLBACK EnumFontFamExProc(const LOGFONT* lpelfe, const TEXTMETRIC *, DWORD, LPARAM lParam) { - std::vector& strVect = *(std::vector *)lParam; - const size_t vectSize = strVect.size(); - const TCHAR* lfFaceName = ((ENUMLOGFONTEX*)lpelfe)->elfLogFont.lfFaceName; - - //Search through all the fonts, EnumFontFamiliesEx never states anything about order - //Start at the end though, that's the most likely place to find a duplicate - for(int i = vectSize - 1 ; i >= 0 ; i--) { - if ( !lstrcmp(strVect[i].c_str(), lfFaceName) ) - return 1; //we already have seen this typeface, ignore it - } - //We can add the font - //Add the face name and not the full name, we do not care about any styles - strVect.push_back(lfFaceName); - return 1; // I want to get all fonts - }; - void getLangKeywordsFromXmlTree(); bool getUserParametersFromXmlTree(); bool getUserStylersFromXmlTree(); bool getUserDefineLangsFromXmlTree(TiXmlDocument *tixmldoc); - bool getUserDefineLangsFromXmlTree() { - return getUserDefineLangsFromXmlTree(_pXmlUserLangDoc); - }; + bool getUserDefineLangsFromXmlTree() + { + return getUserDefineLangsFromXmlTree(_pXmlUserLangDoc); + } bool getShortcutsFromXmlTree(); @@ -1679,18 +1687,18 @@ private: bool getPluginCmdsFromXmlTree(); bool getScintKeysFromXmlTree(); bool getSessionFromXmlTree(TiXmlDocument *pSessionDoc = NULL, Session *session = NULL); - bool getBlackListFromXmlTree(); + bool getBlackListFromXmlTree(); void feedGUIParameters(TiXmlNode *node); void feedKeyWordsParameters(TiXmlNode *node); void feedFileListParameters(TiXmlNode *node); - void feedScintillaParam(TiXmlNode *node); + void feedScintillaParam(TiXmlNode *node); void feedDockingManager(TiXmlNode *node); void feedFindHistoryParameters(TiXmlNode *node); void feedProjectPanelsParameters(TiXmlNode *node); - + bool feedStylerArray(TiXmlNode *node); - void getAllWordStyles(TCHAR *lexerName, TiXmlNode *lexerNode); + void getAllWordStyles(TCHAR *lexerName, TiXmlNode *lexerNode); bool feedUserLang(TiXmlNode *node); @@ -1704,12 +1712,12 @@ private: void feedUserCmds(TiXmlNode *node); void feedPluginCustomizedCmds(TiXmlNode *node); void feedScintKeys(TiXmlNode *node); - bool feedBlacklist(TiXmlNode *node); + bool feedBlacklist(TiXmlNode *node); void getActions(TiXmlNode *node, Macro & macro); bool getShortcuts(TiXmlNode *node, Shortcut & sc); - - void writeStyle2Element(Style & style2Write, Style & style2Sync, TiXmlElement *element); + + void writeStyle2Element(Style & style2Write, Style & style2Sync, TiXmlElement *element); void insertUserLang2Tree(TiXmlNode *node, UserLangContainer *userLang); void insertCmd(TiXmlNode *cmdRoot, const CommandShortcut & cmd); void insertMacro(TiXmlNode *macrosRoot, const MacroShortcut & macro); @@ -1726,5 +1734,3 @@ private: int getCmdIdFromMenuEntryItemName(HMENU mainMenuHadle, generic_string menuEntryName, generic_string menuItemName); // return -1 if not found int getPluginCmdIdFromMenuEntryItemName(HMENU pluginsMenu, generic_string pluginName, generic_string pluginCmdName); // return -1 if not found }; - -#endif //PARAMETERS_H diff --git a/PowerEditor/src/localizationString.h b/PowerEditor/src/localizationString.h index 3186458c0b141fb7291d4cf44bd71f1871ed62cc..6891bed41615bdee6f329d0a26aedcb6a66ea549 100644 GIT binary patch delta 48 zcmcZ;bRckp54W^3Ljgk(Ln1>uLoSe1V9004V@PI5W#DDtntYtQof$}P_UAb-0{}MT B3)lbv delta 209 zcmX>QcqeFs4|hE;0~Z4bD>Gy=q%q_%q%focX$1x!27d-;21g+6$q)skLx8kDgC9dM xkQD@E`!TpP#4~t6^+I%I0`;eorgw5ScQd2H=8xRxW$Yl%NCi6r Date: Fri, 14 Aug 2015 22:42:56 +0200 Subject: [PATCH 39/85] Parameters: fixed alignment (indent with tabs, align with spaces) --- PowerEditor/src/Parameters.cpp | 778 +++++++++++++++++---------------- 1 file changed, 392 insertions(+), 386 deletions(-) diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp index 849ec9f8f..a4961f741 100644 --- a/PowerEditor/src/Parameters.cpp +++ b/PowerEditor/src/Parameters.cpp @@ -38,7 +38,11 @@ using namespace std; -struct WinMenuKeyDefinition { //more or less matches accelerator table definition, easy copy/paste + + + +struct WinMenuKeyDefinition //more or less matches accelerator table definition, easy copy/paste +{ //const TCHAR * name; //name retrieved from menu? int vKey; int functionId; @@ -49,7 +53,8 @@ struct WinMenuKeyDefinition { //more or less matches accelerator table definitio }; -struct ScintillaKeyDefinition { +struct ScintillaKeyDefinition +{ const TCHAR * name; int functionId; bool isCtrl; @@ -59,409 +64,410 @@ struct ScintillaKeyDefinition { int redirFunctionId; //this gets set when a function is being redirected through Notepad++ if Scintilla doesnt do it properly :) }; -WinMenuKeyDefinition winKeyDefs[] = { + +WinMenuKeyDefinition winKeyDefs[] = +{ //array of accelerator keys for all std menu items, values can be 0 for vKey, which means its unused //================================================================================ -// {V_KEY, COMMAND_ID, Ctrl, Alt, Shift, cmdName}, +// {V_KEY, COMMAND_ID, Ctrl, Alt, Shift, cmdName}, //================================================================================ - {VK_N, IDM_FILE_NEW, true, false, false, NULL}, - {VK_O, IDM_FILE_OPEN, true, false, false, NULL}, - {VK_NULL, IDM_FILE_RELOAD, false, false, false, NULL}, - {VK_S, IDM_FILE_SAVE, true, false, false, NULL}, - {VK_S, IDM_FILE_SAVEAS, true, true, false, NULL}, - {VK_NULL, IDM_FILE_SAVECOPYAS, false, false, false, NULL}, - {VK_S, IDM_FILE_SAVEALL, true, false, true, NULL}, - {VK_W, IDM_FILE_CLOSE, true, false, false, NULL}, - {VK_NULL, IDM_FILE_CLOSEALL, false, false, false, NULL}, - {VK_NULL, IDM_FILE_CLOSEALL_BUT_CURRENT, false, false, false, NULL}, - {VK_NULL, IDM_FILE_CLOSEALL_TOLEFT, false, false, false, NULL}, - {VK_NULL, IDM_FILE_CLOSEALL_TORIGHT, false, false, false, NULL}, - {VK_NULL, IDM_FILE_DELETE, false, false, false, NULL}, - {VK_NULL, IDM_FILE_RENAME, false, false, false, NULL}, - {VK_NULL, IDM_FILE_LOADSESSION, false, false, false, NULL}, - {VK_NULL, IDM_FILE_SAVESESSION, false, false, false, NULL}, - {VK_P, IDM_FILE_PRINT, true, false, false, NULL}, - {VK_NULL, IDM_FILE_PRINTNOW, false, false, false, NULL}, - {VK_F4, IDM_FILE_EXIT, false, true, false, NULL}, + {VK_N, IDM_FILE_NEW, true, false, false, NULL}, + {VK_O, IDM_FILE_OPEN, true, false, false, NULL}, + {VK_NULL, IDM_FILE_RELOAD, false, false, false, NULL}, + {VK_S, IDM_FILE_SAVE, true, false, false, NULL}, + {VK_S, IDM_FILE_SAVEAS, true, true, false, NULL}, + {VK_NULL, IDM_FILE_SAVECOPYAS, false, false, false, NULL}, + {VK_S, IDM_FILE_SAVEALL, true, false, true, NULL}, + {VK_W, IDM_FILE_CLOSE, true, false, false, NULL}, + {VK_NULL, IDM_FILE_CLOSEALL, false, false, false, NULL}, + {VK_NULL, IDM_FILE_CLOSEALL_BUT_CURRENT, false, false, false, NULL}, + {VK_NULL, IDM_FILE_CLOSEALL_TOLEFT, false, false, false, NULL}, + {VK_NULL, IDM_FILE_CLOSEALL_TORIGHT, false, false, false, NULL}, + {VK_NULL, IDM_FILE_DELETE, false, false, false, NULL}, + {VK_NULL, IDM_FILE_RENAME, false, false, false, NULL}, + {VK_NULL, IDM_FILE_LOADSESSION, false, false, false, NULL}, + {VK_NULL, IDM_FILE_SAVESESSION, false, false, false, NULL}, + {VK_P, IDM_FILE_PRINT, true, false, false, NULL}, + {VK_NULL, IDM_FILE_PRINTNOW, false, false, false, NULL}, + {VK_F4, IDM_FILE_EXIT, false, true, false, NULL}, - { VK_T, IDM_FILE_RESTORELASTCLOSEDFILE, true, false, true, TEXT("Restore Recent Closed File")}, + { VK_T, IDM_FILE_RESTORELASTCLOSEDFILE, true, false, true, TEXT("Restore Recent Closed File")}, -// {VK_NULL, IDM_EDIT_UNDO, false, false, false, NULL}, -// {VK_NULL, IDM_EDIT_REDO, false, false, false, NULL}, -// {VK_NULL, IDM_EDIT_CUT, false, false, false, NULL}, -// {VK_NULL, IDM_EDIT_COPY, false, false, false, NULL}, -// {VK_NULL, IDM_EDIT_PASTE, false, false, false, NULL}, -// {VK_NULL, IDM_EDIT_DELETE, false, false, false, NULL}, -// {VK_NULL, IDM_EDIT_SELECTALL, false, false, false, NULL}, +// {VK_NULL, IDM_EDIT_UNDO, false, false, false, NULL}, +// {VK_NULL, IDM_EDIT_REDO, false, false, false, NULL}, +// {VK_NULL, IDM_EDIT_CUT, false, false, false, NULL}, +// {VK_NULL, IDM_EDIT_COPY, false, false, false, NULL}, +// {VK_NULL, IDM_EDIT_PASTE, false, false, false, NULL}, +// {VK_NULL, IDM_EDIT_DELETE, false, false, false, NULL}, +// {VK_NULL, IDM_EDIT_SELECTALL, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_SETREADONLY, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_CLEARREADONLY, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_FULLPATHTOCLIP, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_FILENAMETOCLIP, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_CURRENTDIRTOCLIP, false, false, false, NULL}, -// {VK_NULL, IDM_EDIT_INS_TAB, false, false, false, NULL}, -// {VK_NULL, IDM_EDIT_RMV_TAB, false, false, false, NULL}, -// {VK_NULL, IDM_EDIT_DUP_LINE, false, false, false, NULL}, - {VK_I, IDM_EDIT_SPLIT_LINES, true, false, false, NULL}, - {VK_J, IDM_EDIT_JOIN_LINES, true, false, false, NULL}, - {VK_UP, IDM_EDIT_LINE_UP, true, false, true, NULL}, - {VK_DOWN, IDM_EDIT_LINE_DOWN, true, false, true, NULL}, - {VK_NULL, IDM_EDIT_TRIMTRAILING, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_TRIMLINEHEAD, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_TRIM_BOTH, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_EOL2WS, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_TRIMALL, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_TAB2SW, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_SW2TAB_ALL, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_SW2TAB_LEADING, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_BEGINENDSELECT, false, false, false, NULL}, + {VK_NULL, IDM_EDIT_SETREADONLY, false, false, false, NULL}, + {VK_NULL, IDM_EDIT_CLEARREADONLY, false, false, false, NULL}, + {VK_NULL, IDM_EDIT_FULLPATHTOCLIP, false, false, false, NULL}, + {VK_NULL, IDM_EDIT_FILENAMETOCLIP, false, false, false, NULL}, + {VK_NULL, IDM_EDIT_CURRENTDIRTOCLIP, false, false, false, NULL}, +// {VK_NULL, IDM_EDIT_INS_TAB, false, false, false, NULL}, +// {VK_NULL, IDM_EDIT_RMV_TAB, false, false, false, NULL}, +// {VK_NULL, IDM_EDIT_DUP_LINE, false, false, false, NULL}, + {VK_I, IDM_EDIT_SPLIT_LINES, true, false, false, NULL}, + {VK_J, IDM_EDIT_JOIN_LINES, true, false, false, NULL}, + {VK_UP, IDM_EDIT_LINE_UP, true, false, true, NULL}, + {VK_DOWN, IDM_EDIT_LINE_DOWN, true, false, true, NULL}, + {VK_NULL, IDM_EDIT_TRIMTRAILING, false, false, false, NULL}, + {VK_NULL, IDM_EDIT_TRIMLINEHEAD, false, false, false, NULL}, + {VK_NULL, IDM_EDIT_TRIM_BOTH, false, false, false, NULL}, + {VK_NULL, IDM_EDIT_EOL2WS, false, false, false, NULL}, + {VK_NULL, IDM_EDIT_TRIMALL, false, false, false, NULL}, + {VK_NULL, IDM_EDIT_TAB2SW, false, false, false, NULL}, + {VK_NULL, IDM_EDIT_SW2TAB_ALL, false, false, false, NULL}, + {VK_NULL, IDM_EDIT_SW2TAB_LEADING, false, false, false, NULL}, + {VK_NULL, IDM_EDIT_BEGINENDSELECT, false, false, false, NULL}, - {VK_C, IDM_EDIT_COLUMNMODE, false, true, false, NULL}, - {VK_U, IDM_EDIT_UPPERCASE, true, false, true, NULL}, - {VK_U, IDM_EDIT_LOWERCASE, true, false, false, NULL}, - {VK_Q, IDM_EDIT_BLOCK_COMMENT, true, false, false, NULL}, - {VK_K, IDM_EDIT_BLOCK_COMMENT_SET, true, false, false, NULL}, - {VK_K, IDM_EDIT_BLOCK_UNCOMMENT, true, false, true, NULL}, - {VK_Q, IDM_EDIT_STREAM_COMMENT, true, false, true, NULL}, - {VK_NULL, IDM_EDIT_STREAM_UNCOMMENT, false, false, false, NULL}, - {VK_SPACE, IDM_EDIT_AUTOCOMPLETE, true, false, false, NULL}, - {VK_SPACE, IDM_EDIT_AUTOCOMPLETE_PATH, true, true, false, NULL}, - {VK_RETURN, IDM_EDIT_AUTOCOMPLETE_CURRENTFILE, true, false, false, NULL}, - {VK_SPACE, IDM_EDIT_FUNCCALLTIP, true, false, true, NULL}, - {VK_R, IDM_EDIT_RTL, true, true, false, NULL}, - {VK_L, IDM_EDIT_LTR, true, true, false, NULL}, - {VK_NULL, IDM_EDIT_SORTLINES_LEXICOGRAPHIC_ASCENDING, false, false, false, NULL }, - {VK_NULL, IDM_EDIT_SORTLINES_LEXICOGRAPHIC_DESCENDING, false, false, false, NULL }, - {VK_NULL, IDM_EDIT_SORTLINES_INTEGER_ASCENDING, false, false, false, NULL }, - {VK_NULL, IDM_EDIT_SORTLINES_INTEGER_DESCENDING, false, false, false, NULL }, - {VK_NULL, IDM_EDIT_SORTLINES_DECIMALCOMMA_ASCENDING, false, false, false, NULL }, - {VK_NULL, IDM_EDIT_SORTLINES_DECIMALCOMMA_DESCENDING, false, false, false, NULL }, - {VK_NULL, IDM_EDIT_SORTLINES_DECIMALDOT_ASCENDING, false, false, false, NULL }, - {VK_NULL, IDM_EDIT_SORTLINES_DECIMALDOT_DESCENDING, false, false, false, NULL }, - {VK_RETURN, IDM_EDIT_BLANKLINEABOVECURRENT, true, true, false, NULL}, - {VK_RETURN, IDM_EDIT_BLANKLINEBELOWCURRENT, true, true, true, NULL}, - {VK_F, IDM_SEARCH_FIND, true, false, false, NULL}, - {VK_F, IDM_SEARCH_FINDINFILES, true, false, true, NULL}, - {VK_F3, IDM_SEARCH_FINDNEXT, false, false, false, NULL}, - {VK_F3, IDM_SEARCH_FINDPREV, false, false, true, NULL}, - {VK_F3, IDM_SEARCH_VOLATILE_FINDNEXT, true, true, false, NULL}, - {VK_F3, IDM_SEARCH_VOLATILE_FINDPREV, true, true, true, NULL}, - {VK_F3, IDM_SEARCH_SETANDFINDNEXT, true, false, false, NULL}, - {VK_F3, IDM_SEARCH_SETANDFINDPREV, true, false, true, NULL}, - {VK_F4, IDM_SEARCH_GOTONEXTFOUND, false, false, false, NULL}, - {VK_F4, IDM_SEARCH_GOTOPREVFOUND, false, false, true, NULL}, - {VK_F7, IDM_FOCUS_ON_FOUND_RESULTS, false, false, false, NULL}, - {VK_H, IDM_SEARCH_REPLACE, true, false, false, NULL}, - {VK_I, IDM_SEARCH_FINDINCREMENT, true, true, false, NULL}, - {VK_G, IDM_SEARCH_GOTOLINE, true, false, false, NULL}, - {VK_B, IDM_SEARCH_GOTOMATCHINGBRACE, true, false, false, NULL}, - {VK_B, IDM_SEARCH_SELECTMATCHINGBRACES, true, true, false, NULL}, - {VK_F2, IDM_SEARCH_TOGGLE_BOOKMARK, true, false, false, NULL}, - {VK_F2, IDM_SEARCH_NEXT_BOOKMARK, false, false, false, NULL}, - {VK_F2, IDM_SEARCH_PREV_BOOKMARK, false, false, true, NULL}, - {VK_NULL, IDM_SEARCH_CLEAR_BOOKMARKS, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_CUTMARKEDLINES, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_COPYMARKEDLINES, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_PASTEMARKEDLINES, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_DELETEMARKEDLINES, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_MARK, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_MARKALLEXT1, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_MARKALLEXT2, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_MARKALLEXT3, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_MARKALLEXT4, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_MARKALLEXT5, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_UNMARKALLEXT1, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_UNMARKALLEXT2, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_UNMARKALLEXT3, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_UNMARKALLEXT4, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_UNMARKALLEXT5, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_CLEARALLMARKS, false, false, false, NULL}, - {VK_1, IDM_SEARCH_GOPREVMARKER1, true, false, true, NULL}, - {VK_2, IDM_SEARCH_GOPREVMARKER2, true, false, true, NULL}, - {VK_3, IDM_SEARCH_GOPREVMARKER3, true, false, true, NULL}, - {VK_4, IDM_SEARCH_GOPREVMARKER4, true, false, true, NULL}, - {VK_5, IDM_SEARCH_GOPREVMARKER5, true, false, true, NULL}, - {VK_0, IDM_SEARCH_GOPREVMARKER_DEF, true, false, true, NULL}, + {VK_C, IDM_EDIT_COLUMNMODE, false, true, false, NULL}, + {VK_U, IDM_EDIT_UPPERCASE, true, false, true, NULL}, + {VK_U, IDM_EDIT_LOWERCASE, true, false, false, NULL}, + {VK_Q, IDM_EDIT_BLOCK_COMMENT, true, false, false, NULL}, + {VK_K, IDM_EDIT_BLOCK_COMMENT_SET, true, false, false, NULL}, + {VK_K, IDM_EDIT_BLOCK_UNCOMMENT, true, false, true, NULL}, + {VK_Q, IDM_EDIT_STREAM_COMMENT, true, false, true, NULL}, + {VK_NULL, IDM_EDIT_STREAM_UNCOMMENT, false, false, false, NULL}, + {VK_SPACE, IDM_EDIT_AUTOCOMPLETE, true, false, false, NULL}, + {VK_SPACE, IDM_EDIT_AUTOCOMPLETE_PATH, true, true, false, NULL}, + {VK_RETURN, IDM_EDIT_AUTOCOMPLETE_CURRENTFILE, true, false, false, NULL}, + {VK_SPACE, IDM_EDIT_FUNCCALLTIP, true, false, true, NULL}, + {VK_R, IDM_EDIT_RTL, true, true, false, NULL}, + {VK_L, IDM_EDIT_LTR, true, true, false, NULL}, + {VK_NULL, IDM_EDIT_SORTLINES_LEXICOGRAPHIC_ASCENDING, false, false, false, NULL }, + {VK_NULL, IDM_EDIT_SORTLINES_LEXICOGRAPHIC_DESCENDING, false, false, false, NULL }, + {VK_NULL, IDM_EDIT_SORTLINES_INTEGER_ASCENDING, false, false, false, NULL }, + {VK_NULL, IDM_EDIT_SORTLINES_INTEGER_DESCENDING, false, false, false, NULL }, + {VK_NULL, IDM_EDIT_SORTLINES_DECIMALCOMMA_ASCENDING, false, false, false, NULL }, + {VK_NULL, IDM_EDIT_SORTLINES_DECIMALCOMMA_DESCENDING, false, false, false, NULL }, + {VK_NULL, IDM_EDIT_SORTLINES_DECIMALDOT_ASCENDING, false, false, false, NULL }, + {VK_NULL, IDM_EDIT_SORTLINES_DECIMALDOT_DESCENDING, false, false, false, NULL }, + {VK_RETURN, IDM_EDIT_BLANKLINEABOVECURRENT, true, true, false, NULL}, + {VK_RETURN, IDM_EDIT_BLANKLINEBELOWCURRENT, true, true, true, NULL}, + {VK_F, IDM_SEARCH_FIND, true, false, false, NULL}, + {VK_F, IDM_SEARCH_FINDINFILES, true, false, true, NULL}, + {VK_F3, IDM_SEARCH_FINDNEXT, false, false, false, NULL}, + {VK_F3, IDM_SEARCH_FINDPREV, false, false, true, NULL}, + {VK_F3, IDM_SEARCH_VOLATILE_FINDNEXT, true, true, false, NULL}, + {VK_F3, IDM_SEARCH_VOLATILE_FINDPREV, true, true, true, NULL}, + {VK_F3, IDM_SEARCH_SETANDFINDNEXT, true, false, false, NULL}, + {VK_F3, IDM_SEARCH_SETANDFINDPREV, true, false, true, NULL}, + {VK_F4, IDM_SEARCH_GOTONEXTFOUND, false, false, false, NULL}, + {VK_F4, IDM_SEARCH_GOTOPREVFOUND, false, false, true, NULL}, + {VK_F7, IDM_FOCUS_ON_FOUND_RESULTS, false, false, false, NULL}, + {VK_H, IDM_SEARCH_REPLACE, true, false, false, NULL}, + {VK_I, IDM_SEARCH_FINDINCREMENT, true, true, false, NULL}, + {VK_G, IDM_SEARCH_GOTOLINE, true, false, false, NULL}, + {VK_B, IDM_SEARCH_GOTOMATCHINGBRACE, true, false, false, NULL}, + {VK_B, IDM_SEARCH_SELECTMATCHINGBRACES, true, true, false, NULL}, + {VK_F2, IDM_SEARCH_TOGGLE_BOOKMARK, true, false, false, NULL}, + {VK_F2, IDM_SEARCH_NEXT_BOOKMARK, false, false, false, NULL}, + {VK_F2, IDM_SEARCH_PREV_BOOKMARK, false, false, true, NULL}, + {VK_NULL, IDM_SEARCH_CLEAR_BOOKMARKS, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_CUTMARKEDLINES, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_COPYMARKEDLINES, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_PASTEMARKEDLINES, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_DELETEMARKEDLINES, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_MARK, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_MARKALLEXT1, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_MARKALLEXT2, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_MARKALLEXT3, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_MARKALLEXT4, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_MARKALLEXT5, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_UNMARKALLEXT1, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_UNMARKALLEXT2, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_UNMARKALLEXT3, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_UNMARKALLEXT4, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_UNMARKALLEXT5, false, false, false, NULL}, + {VK_NULL, IDM_SEARCH_CLEARALLMARKS, false, false, false, NULL}, + {VK_1, IDM_SEARCH_GOPREVMARKER1, true, false, true, NULL}, + {VK_2, IDM_SEARCH_GOPREVMARKER2, true, false, true, NULL}, + {VK_3, IDM_SEARCH_GOPREVMARKER3, true, false, true, NULL}, + {VK_4, IDM_SEARCH_GOPREVMARKER4, true, false, true, NULL}, + {VK_5, IDM_SEARCH_GOPREVMARKER5, true, false, true, NULL}, + {VK_0, IDM_SEARCH_GOPREVMARKER_DEF, true, false, true, NULL}, - {VK_F11, IDM_VIEW_FULLSCREENTOGGLE, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_ALWAYSONTOP, false, false, false, NULL}, - {VK_F12, IDM_VIEW_POSTIT, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_TAB_SPACE, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_EOL, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_ALL_CHARACTERS, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_INDENT_GUIDE, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_WRAP, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_WRAP_SYMBOL, false, false, false, NULL}, - {VK_NULL, IDM_LANG_USER_DLG, false, false, false, NULL}, - // {VK_NULL, IDM_VIEW_ZOOMIN, false, false, false, NULL}, - // {VK_NULL, IDM_VIEW_ZOOMOUT, false, false, false, NULL}, - // {VK_NULL, IDM_VIEW_ZOOMRESTORE, false, false, false, NULL}, - {VK_0, IDM_VIEW_TOGGLE_FOLDALL, false, true, false, NULL}, - {VK_F, IDM_VIEW_FOLD_CURRENT, true, true, false, NULL}, - {VK_1, IDM_VIEW_FOLD_1, false, true, false, NULL}, - {VK_2, IDM_VIEW_FOLD_2, false, true, false, NULL}, - {VK_3, IDM_VIEW_FOLD_3, false, true, false, NULL}, - {VK_4, IDM_VIEW_FOLD_4, false, true, false, NULL}, - {VK_5, IDM_VIEW_FOLD_5, false, true, false, NULL}, - {VK_6, IDM_VIEW_FOLD_6, false, true, false, NULL}, - {VK_7, IDM_VIEW_FOLD_7, false, true, false, NULL}, - {VK_8, IDM_VIEW_FOLD_8, false, true, false, NULL}, - {VK_F, IDM_VIEW_UNFOLD_CURRENT, true, true, true, NULL}, - {VK_1, IDM_VIEW_UNFOLD_1, false, true, true, NULL}, - {VK_2, IDM_VIEW_UNFOLD_2, false, true, true, NULL}, - {VK_3, IDM_VIEW_UNFOLD_3, false, true, true, NULL}, - {VK_4, IDM_VIEW_UNFOLD_4, false, true, true, NULL}, - {VK_5, IDM_VIEW_UNFOLD_5, false, true, true, NULL}, - {VK_6, IDM_VIEW_UNFOLD_6, false, true, true, NULL}, - {VK_7, IDM_VIEW_UNFOLD_7, false, true, true, NULL}, - {VK_8, IDM_VIEW_UNFOLD_8, false, true, true, NULL}, - {VK_0, IDM_VIEW_TOGGLE_UNFOLDALL, false, true, true, NULL}, - {VK_H, IDM_VIEW_HIDELINES, false, true, false, NULL}, - {VK_NULL, IDM_VIEW_GOTO_ANOTHER_VIEW, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_CLONE_TO_ANOTHER_VIEW, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_SYNSCROLLV, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_SYNSCROLLH, false, false, false, NULL}, - {VK_F8, IDM_VIEW_SWITCHTO_OTHER_VIEW, false, false, false, NULL}, - {VK_NUMPAD1,IDM_VIEW_TAB1, true, false, false, NULL}, - {VK_NUMPAD2,IDM_VIEW_TAB2, true, false, false, NULL}, - {VK_NUMPAD3,IDM_VIEW_TAB3, true, false, false, NULL}, - {VK_NUMPAD4,IDM_VIEW_TAB4, true, false, false, NULL}, - {VK_NUMPAD5,IDM_VIEW_TAB5, true, false, false, NULL}, - {VK_NUMPAD6,IDM_VIEW_TAB6, true, false, false, NULL}, - {VK_NUMPAD7,IDM_VIEW_TAB7, true, false, false, NULL}, - {VK_NUMPAD8,IDM_VIEW_TAB8, true, false, false, NULL}, - {VK_NUMPAD9,IDM_VIEW_TAB9, true, false, false, NULL}, - {VK_NEXT, IDM_VIEW_TAB_NEXT, true, false, false, NULL}, - {VK_PRIOR, IDM_VIEW_TAB_PREV, true, false, false, NULL}, + {VK_F11, IDM_VIEW_FULLSCREENTOGGLE, false, false, false, NULL}, + {VK_NULL, IDM_VIEW_ALWAYSONTOP, false, false, false, NULL}, + {VK_F12, IDM_VIEW_POSTIT, false, false, false, NULL}, + {VK_NULL, IDM_VIEW_TAB_SPACE, false, false, false, NULL}, + {VK_NULL, IDM_VIEW_EOL, false, false, false, NULL}, + {VK_NULL, IDM_VIEW_ALL_CHARACTERS, false, false, false, NULL}, + {VK_NULL, IDM_VIEW_INDENT_GUIDE, false, false, false, NULL}, + {VK_NULL, IDM_VIEW_WRAP, false, false, false, NULL}, + {VK_NULL, IDM_VIEW_WRAP_SYMBOL, false, false, false, NULL}, + {VK_NULL, IDM_LANG_USER_DLG, false, false, false, NULL}, + // {VK_NULL, IDM_VIEW_ZOOMIN, false, false, false, NULL}, + // {VK_NULL, IDM_VIEW_ZOOMOUT, false, false, false, NULL}, + // {VK_NULL, IDM_VIEW_ZOOMRESTORE, false, false, false, NULL}, + {VK_0, IDM_VIEW_TOGGLE_FOLDALL, false, true, false, NULL}, + {VK_F, IDM_VIEW_FOLD_CURRENT, true, true, false, NULL}, + {VK_1, IDM_VIEW_FOLD_1, false, true, false, NULL}, + {VK_2, IDM_VIEW_FOLD_2, false, true, false, NULL}, + {VK_3, IDM_VIEW_FOLD_3, false, true, false, NULL}, + {VK_4, IDM_VIEW_FOLD_4, false, true, false, NULL}, + {VK_5, IDM_VIEW_FOLD_5, false, true, false, NULL}, + {VK_6, IDM_VIEW_FOLD_6, false, true, false, NULL}, + {VK_7, IDM_VIEW_FOLD_7, false, true, false, NULL}, + {VK_8, IDM_VIEW_FOLD_8, false, true, false, NULL}, + {VK_F, IDM_VIEW_UNFOLD_CURRENT, true, true, true, NULL}, + {VK_1, IDM_VIEW_UNFOLD_1, false, true, true, NULL}, + {VK_2, IDM_VIEW_UNFOLD_2, false, true, true, NULL}, + {VK_3, IDM_VIEW_UNFOLD_3, false, true, true, NULL}, + {VK_4, IDM_VIEW_UNFOLD_4, false, true, true, NULL}, + {VK_5, IDM_VIEW_UNFOLD_5, false, true, true, NULL}, + {VK_6, IDM_VIEW_UNFOLD_6, false, true, true, NULL}, + {VK_7, IDM_VIEW_UNFOLD_7, false, true, true, NULL}, + {VK_8, IDM_VIEW_UNFOLD_8, false, true, true, NULL}, + {VK_0, IDM_VIEW_TOGGLE_UNFOLDALL, false, true, true, NULL}, + {VK_H, IDM_VIEW_HIDELINES, false, true, false, NULL}, + {VK_NULL, IDM_VIEW_GOTO_ANOTHER_VIEW, false, false, false, NULL}, + {VK_NULL, IDM_VIEW_CLONE_TO_ANOTHER_VIEW, false, false, false, NULL}, + {VK_NULL, IDM_VIEW_SYNSCROLLV, false, false, false, NULL}, + {VK_NULL, IDM_VIEW_SYNSCROLLH, false, false, false, NULL}, + {VK_F8, IDM_VIEW_SWITCHTO_OTHER_VIEW, false, false, false, NULL}, + {VK_NUMPAD1, IDM_VIEW_TAB1, true, false, false, NULL}, + {VK_NUMPAD2, IDM_VIEW_TAB2, true, false, false, NULL}, + {VK_NUMPAD3, IDM_VIEW_TAB3, true, false, false, NULL}, + {VK_NUMPAD4, IDM_VIEW_TAB4, true, false, false, NULL}, + {VK_NUMPAD5, IDM_VIEW_TAB5, true, false, false, NULL}, + {VK_NUMPAD6, IDM_VIEW_TAB6, true, false, false, NULL}, + {VK_NUMPAD7, IDM_VIEW_TAB7, true, false, false, NULL}, + {VK_NUMPAD8, IDM_VIEW_TAB8, true, false, false, NULL}, + {VK_NUMPAD9, IDM_VIEW_TAB9, true, false, false, NULL}, + {VK_NEXT, IDM_VIEW_TAB_NEXT, true, false, false, NULL}, + {VK_PRIOR, IDM_VIEW_TAB_PREV, true, false, false, NULL}, - {VK_NULL, IDM_FORMAT_TODOS, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_TOUNIX, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_TOMAC, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ANSI, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_UTF_8, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_AS_UTF_8, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_UCS_2BE, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_UCS_2LE, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_CONV2_ANSI, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_CONV2_AS_UTF_8, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_CONV2_UTF_8, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_CONV2_UCS_2BE, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_CONV2_UCS_2LE, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_6, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1256, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_13, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1257, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_14, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_5, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_MAC_CYRILLIC, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_KOI8R_CYRILLIC, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_KOI8U_CYRILLIC, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1251, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1250, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_437, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_720, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_737, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_775, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_850, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_852, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_855, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_857, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_858, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_860, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_861, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_862, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_863, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_865, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_866, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_869, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_BIG5, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_GB2312, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_2, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_7, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1253, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_8, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1255, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_SHIFT_JIS, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_EUC_KR, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_10, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_15, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_4, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_16, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_3, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_11, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_TIS_620, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_9, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1254, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1252, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_1, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1258, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_TODOS, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_TOUNIX, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_TOMAC, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ANSI, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_UTF_8, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_AS_UTF_8, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_UCS_2BE, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_UCS_2LE, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_CONV2_ANSI, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_CONV2_AS_UTF_8, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_CONV2_UTF_8, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_CONV2_UCS_2BE, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_CONV2_UCS_2LE, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_6, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_WIN_1256, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_13, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_WIN_1257, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_14, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_5, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_MAC_CYRILLIC, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_KOI8R_CYRILLIC, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_KOI8U_CYRILLIC, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_WIN_1251, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_WIN_1250, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_437, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_720, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_737, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_775, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_850, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_852, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_855, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_857, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_858, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_860, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_861, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_862, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_863, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_865, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_866, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_DOS_869, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_BIG5, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_GB2312, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_2, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_7, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_WIN_1253, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_8, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_WIN_1255, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_SHIFT_JIS, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_EUC_KR, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_10, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_15, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_4, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_16, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_3, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_11, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_TIS_620, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_9, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_WIN_1254, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_WIN_1252, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_ISO_8859_1, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_WIN_1258, false, false, false, NULL}, - {VK_NULL, IDM_SETTING_PREFERECE, false, false, false, NULL}, - {VK_NULL, IDM_LANGSTYLE_CONFIG_DLG, false, false, false, NULL}, - {VK_NULL, IDM_SETTING_SHORTCUT_MAPPER, false, false, false, NULL}, + {VK_NULL, IDM_SETTING_PREFERECE, false, false, false, NULL}, + {VK_NULL, IDM_LANGSTYLE_CONFIG_DLG, false, false, false, NULL}, + {VK_NULL, IDM_SETTING_SHORTCUT_MAPPER, false, false, false, NULL}, - {VK_R, IDC_EDIT_TOGGLEMACRORECORDING, true, false, true, TEXT("Toggle macro record")}, - {VK_P, IDM_MACRO_PLAYBACKRECORDEDMACRO, true, false, true, NULL}, - {VK_NULL, IDM_MACRO_SAVECURRENTMACRO, false, false, false, NULL}, - {VK_NULL, IDM_MACRO_RUNMULTIMACRODLG, false, false, false, NULL}, + {VK_R, IDC_EDIT_TOGGLEMACRORECORDING, true, false, true, TEXT("Toggle macro record")}, + {VK_P, IDM_MACRO_PLAYBACKRECORDEDMACRO, true, false, true, NULL}, + {VK_NULL, IDM_MACRO_SAVECURRENTMACRO, false, false, false, NULL}, + {VK_NULL, IDM_MACRO_RUNMULTIMACRODLG, false, false, false, NULL}, - {VK_F5, IDM_EXECUTE, false, false, false, NULL}, + {VK_F5, IDM_EXECUTE, false, false, false, NULL}, - {VK_NULL, IDM_HOMESWEETHOME, false, false, false, NULL}, - {VK_NULL, IDM_PROJECTPAGE, false, false, false, NULL}, - {VK_NULL, IDM_ONLINEHELP, false, false, false, NULL}, - {VK_NULL, IDM_FORUM, false, false, false, NULL}, - {VK_NULL, IDM_PLUGINSHOME, false, false, false, NULL}, - {VK_F1, IDM_ABOUT, false, false, false, NULL}, - {VK_F1, IDM_HELP, false, false, true, NULL}, + {VK_NULL, IDM_HOMESWEETHOME, false, false, false, NULL}, + {VK_NULL, IDM_PROJECTPAGE, false, false, false, NULL}, + {VK_NULL, IDM_ONLINEHELP, false, false, false, NULL}, + {VK_NULL, IDM_FORUM, false, false, false, NULL}, + {VK_NULL, IDM_PLUGINSHOME, false, false, false, NULL}, + {VK_F1, IDM_ABOUT, false, false, false, NULL}, + {VK_F1, IDM_HELP, false, false, true, NULL}, - {VK_TAB, IDC_PREV_DOC, true, false, true, TEXT("Switch to previous document")}, - {VK_TAB, IDC_NEXT_DOC, true, false, false, TEXT("Switch to next document")}, - - {VK_1, IDM_SEARCH_GONEXTMARKER1, true, false, false, NULL}, - {VK_2, IDM_SEARCH_GONEXTMARKER2, true, false, false, NULL}, - {VK_3, IDM_SEARCH_GONEXTMARKER3, true, false, false, NULL}, - {VK_4, IDM_SEARCH_GONEXTMARKER4, true, false, false, NULL}, - {VK_5, IDM_SEARCH_GONEXTMARKER5, true, false, false, NULL}, - {VK_0, IDM_SEARCH_GONEXTMARKER_DEF, true, false, false, NULL} + {VK_TAB, IDC_PREV_DOC, true, false, true, TEXT("Switch to previous document")}, + {VK_TAB, IDC_NEXT_DOC, true, false, false, TEXT("Switch to next document")}, + {VK_1, IDM_SEARCH_GONEXTMARKER1, true, false, false, NULL}, + {VK_2, IDM_SEARCH_GONEXTMARKER2, true, false, false, NULL}, + {VK_3, IDM_SEARCH_GONEXTMARKER3, true, false, false, NULL}, + {VK_4, IDM_SEARCH_GONEXTMARKER4, true, false, false, NULL}, + {VK_5, IDM_SEARCH_GONEXTMARKER5, true, false, false, NULL}, + {VK_0, IDM_SEARCH_GONEXTMARKER_DEF, true, false, false, NULL} }; -ScintillaKeyDefinition scintKeyDefs[] = { //array of accelerator keys for all possible scintilla functions, values can be 0 for vKey, which means its unused - {TEXT("SCI_CUT"), SCI_CUT, true, false, false, VK_X, IDM_EDIT_CUT}, - {TEXT(""), SCI_CUT, false, false, true, VK_DELETE, 0}, - {TEXT("SCI_COPY"), SCI_COPY, true, false, false, VK_C, IDM_EDIT_COPY}, - {TEXT(""), SCI_COPY, true, false, false, VK_INSERT, 0}, - {TEXT("SCI_PASTE"), SCI_PASTE, true, false, false, VK_V, IDM_EDIT_PASTE}, - {TEXT(""), SCI_PASTE, false, false, true, VK_INSERT, 0}, - {TEXT("SCI_SELECTALL"), SCI_SELECTALL, true, false, false, VK_A, IDM_EDIT_SELECTALL}, - {TEXT("SCI_CLEAR"), SCI_CLEAR, false, false, false, VK_DELETE, IDM_EDIT_DELETE}, - {TEXT("SCI_CLEARALL"), SCI_CLEARALL, false, false, false, 0, 0}, - {TEXT("SCI_UNDO"), SCI_UNDO, true, false, false, VK_Z, IDM_EDIT_UNDO}, - {TEXT(""), SCI_UNDO, false, true, false, VK_BACK, 0}, - {TEXT("SCI_REDO"), SCI_REDO, true, false, false, VK_Y, IDM_EDIT_REDO}, - {TEXT("SCI_NEWLINE"), SCI_NEWLINE, false, false, false, VK_RETURN, 0}, - {TEXT(""), SCI_NEWLINE, false, false, true, VK_RETURN, 0}, - {TEXT("SCI_TAB"), SCI_TAB, false, false, false, VK_TAB, IDM_EDIT_INS_TAB}, - {TEXT("SCI_BACKTAB"), SCI_BACKTAB, false, false, true, VK_TAB, IDM_EDIT_RMV_TAB}, - {TEXT("SCI_FORMFEED"), SCI_FORMFEED, false, false, false, 0, 0}, - {TEXT("SCI_ZOOMIN"), SCI_ZOOMIN, true, false, false, VK_ADD, IDM_VIEW_ZOOMIN}, - {TEXT("SCI_ZOOMOUT"), SCI_ZOOMOUT, true, false, false, VK_SUBTRACT,IDM_VIEW_ZOOMOUT}, - {TEXT("SCI_SETZOOM"), SCI_SETZOOM, true, false, false, VK_DIVIDE, IDM_VIEW_ZOOMRESTORE}, - {TEXT("SCI_SELECTIONDUPLICATE"), SCI_SELECTIONDUPLICATE, true, false, false, VK_D, IDM_EDIT_DUP_LINE}, - {TEXT("SCI_LINESJOIN"), SCI_LINESJOIN, false, false, false, 0, 0}, - {TEXT("SCI_SCROLLCARET"), SCI_SCROLLCARET, false, false, false, 0, 0}, - {TEXT("SCI_EDITTOGGLEOVERTYPE"), SCI_EDITTOGGLEOVERTYPE, false, false, false, VK_INSERT, 0}, - {TEXT("SCI_MOVECARETINSIDEVIEW"), SCI_MOVECARETINSIDEVIEW, false, false, false, 0, 0}, - {TEXT("SCI_LINEDOWN"), SCI_LINEDOWN, false, false, false, VK_DOWN, 0}, - {TEXT("SCI_LINEDOWNEXTEND"), SCI_LINEDOWNEXTEND, false, false, true, VK_DOWN, 0}, - {TEXT("SCI_LINEDOWNRECTEXTEND"), SCI_LINEDOWNRECTEXTEND, false, true, true, VK_DOWN, 0}, - {TEXT("SCI_LINESCROLLDOWN"), SCI_LINESCROLLDOWN, true, false, false, VK_DOWN, 0}, - {TEXT("SCI_LINEUP"), SCI_LINEUP, false, false, false, VK_UP, 0}, - {TEXT("SCI_LINEUPEXTEND"), SCI_LINEUPEXTEND, false, false, true, VK_UP, 0}, - {TEXT("SCI_LINEUPRECTEXTEND"), SCI_LINEUPRECTEXTEND, false, true, true, VK_UP, 0}, - {TEXT("SCI_LINESCROLLUP"), SCI_LINESCROLLUP, true, false, false, VK_UP, 0}, - {TEXT("SCI_PARADOWN"), SCI_PARADOWN, true, false, false, VK_OEM_6, 0}, - {TEXT("SCI_PARADOWNEXTEND"), SCI_PARADOWNEXTEND, true, false, true, VK_OEM_6, 0}, - {TEXT("SCI_PARAUP"), SCI_PARAUP, true, false, false, VK_OEM_4, 0}, - {TEXT("SCI_PARAUPEXTEND"), SCI_PARAUPEXTEND, true, false, true, VK_OEM_4, 0}, - {TEXT("SCI_CHARLEFT"), SCI_CHARLEFT, false, false, false, VK_LEFT, 0}, - {TEXT("SCI_CHARLEFTEXTEND"), SCI_CHARLEFTEXTEND, false, false, true, VK_LEFT, 0}, - {TEXT("SCI_CHARLEFTRECTEXTEND"), SCI_CHARLEFTRECTEXTEND, false, true, true, VK_LEFT, 0}, - {TEXT("SCI_CHARRIGHT"), SCI_CHARRIGHT, false, false, false, VK_RIGHT, 0}, - {TEXT("SCI_CHARRIGHTEXTEND"), SCI_CHARRIGHTEXTEND, false, false, true, VK_RIGHT, 0}, - {TEXT("SCI_CHARRIGHTRECTEXTEND"), SCI_CHARRIGHTRECTEXTEND, false, true, true, VK_RIGHT, 0}, - {TEXT("SCI_WORDLEFT"), SCI_WORDLEFT, true, false, false, VK_LEFT, 0}, - {TEXT("SCI_WORDLEFTEXTEND"), SCI_WORDLEFTEXTEND, true, false, true, VK_LEFT, 0}, - {TEXT("SCI_WORDRIGHT"), SCI_WORDRIGHT, true, false, false, VK_RIGHT, 0}, - {TEXT("SCI_WORDRIGHTEXTEND"), SCI_WORDRIGHTEXTEND, false, false, false, 0, 0}, - {TEXT("SCI_WORDLEFTEND"), SCI_WORDLEFTEND, false, false, false, 0, 0}, - {TEXT("SCI_WORDLEFTENDEXTEND"), SCI_WORDLEFTENDEXTEND, false, false, false, 0, 0}, - {TEXT("SCI_WORDRIGHTEND"), SCI_WORDRIGHTEND, false, false, false, 0, 0}, - {TEXT("SCI_WORDRIGHTENDEXTEND"), SCI_WORDRIGHTENDEXTEND, true, false, true, VK_RIGHT, 0}, - {TEXT("SCI_WORDPARTLEFT"), SCI_WORDPARTLEFT, true, false, false, VK_OEM_2, 0}, - {TEXT("SCI_WORDPARTLEFTEXTEND"), SCI_WORDPARTLEFTEXTEND, true, false, true, VK_OEM_2, 0}, - {TEXT("SCI_WORDPARTRIGHT"), SCI_WORDPARTRIGHT, true, false, false, VK_OEM_5, 0}, - {TEXT("SCI_WORDPARTRIGHTEXTEND"), SCI_WORDPARTRIGHTEXTEND, true, false, true, VK_OEM_5, 0}, - {TEXT("SCI_HOME"), SCI_HOME, false, false, false, 0, 0}, - {TEXT("SCI_HOMEEXTEND"), SCI_HOMEEXTEND, false, false, false, 0, 0}, - {TEXT("SCI_HOMERECTEXTEND"), SCI_HOMERECTEXTEND, false, false, false, 0, 0}, - {TEXT("SCI_HOMEDISPLAY"), SCI_HOMEDISPLAY, false, true, false, VK_HOME, 0}, - {TEXT("SCI_HOMEDISPLAYEXTEND"), SCI_HOMEDISPLAYEXTEND, false, false, false, 0, 0}, - {TEXT("SCI_HOMEWRAP"), SCI_HOMEWRAP, false, false, false, 0, 0}, - {TEXT("SCI_HOMEWRAPEXTEND"), SCI_HOMEWRAPEXTEND, false, false, false, 0, 0}, - {TEXT("SCI_VCHOME"), SCI_VCHOME, false, false, false, 0, 0}, - {TEXT("SCI_VCHOMEEXTEND"), SCI_VCHOMEEXTEND, false, false, true, VK_HOME, 0}, - {TEXT("SCI_VCHOMERECTEXTEND"), SCI_VCHOMERECTEXTEND, false, true, true, VK_HOME, 0}, - {TEXT("SCI_VCHOMEWRAP"), SCI_VCHOMEWRAP, false, false, false, VK_HOME, 0}, - {TEXT("SCI_VCHOMEWRAPEXTEND"), SCI_VCHOMEWRAPEXTEND, false, false, false, 0, 0}, - {TEXT("SCI_LINEEND"), SCI_LINEEND, false, false, false, 0, 0}, - {TEXT("SCI_LINEENDEXTEND"), SCI_LINEENDEXTEND, false, false, true, VK_END, 0}, - {TEXT("SCI_LINEENDRECTEXTEND"), SCI_LINEENDRECTEXTEND, false, true, true, VK_END, 0}, - {TEXT("SCI_LINEENDDISPLAY"), SCI_LINEENDDISPLAY, false, true, false, VK_END, 0}, - {TEXT("SCI_LINEENDDISPLAYEXTEND"), SCI_LINEENDDISPLAYEXTEND, false, false, false, 0, 0}, - {TEXT("SCI_LINEENDWRAP"), SCI_LINEENDWRAP, false, false, false, VK_END, 0}, - {TEXT("SCI_LINEENDWRAPEXTEND"), SCI_LINEENDWRAPEXTEND, false, false, false, 0, 0}, - {TEXT("SCI_DOCUMENTSTART"), SCI_DOCUMENTSTART, true, false, false, VK_HOME, 0}, - {TEXT("SCI_DOCUMENTSTARTEXTEND"), SCI_DOCUMENTSTARTEXTEND, true, false, true, VK_HOME, 0}, - {TEXT("SCI_DOCUMENTEND"), SCI_DOCUMENTEND, true, false, false, VK_END, 0}, - {TEXT("SCI_DOCUMENTENDEXTEND"), SCI_DOCUMENTENDEXTEND, true, false, true, VK_END, 0}, - {TEXT("SCI_PAGEUP"), SCI_PAGEUP, false, false, false, VK_PRIOR, 0}, - {TEXT("SCI_PAGEUPEXTEND"), SCI_PAGEUPEXTEND, false, false, true, VK_PRIOR, 0}, - {TEXT("SCI_PAGEUPRECTEXTEND"), SCI_PAGEUPRECTEXTEND, false, true, true, VK_PRIOR, 0}, - {TEXT("SCI_PAGEDOWN"), SCI_PAGEDOWN, false, false, false, VK_NEXT, 0}, - {TEXT("SCI_PAGEDOWNEXTEND"), SCI_PAGEDOWNEXTEND, false, false, true, VK_NEXT, 0}, - {TEXT("SCI_PAGEDOWNRECTEXTEND"), SCI_PAGEDOWNRECTEXTEND, false, true, true, VK_NEXT, 0}, - {TEXT("SCI_STUTTEREDPAGEUP"), SCI_STUTTEREDPAGEUP, false, false, false, 0, 0}, - {TEXT("SCI_STUTTEREDPAGEUPEXTEND"), SCI_STUTTEREDPAGEUPEXTEND, false, false, false, 0, 0}, - {TEXT("SCI_STUTTEREDPAGEDOWN"), SCI_STUTTEREDPAGEDOWN, false, false, false, 0, 0}, - {TEXT("SCI_STUTTEREDPAGEDOWNEXTEND"), SCI_STUTTEREDPAGEDOWNEXTEND,false, false, false, 0, 0}, - {TEXT("SCI_DELETEBACK"), SCI_DELETEBACK, false, false, false, VK_BACK, 0}, - {TEXT(""), SCI_DELETEBACK, false, false, true, VK_BACK, 0}, - {TEXT("SCI_DELETEBACKNOTLINE"), SCI_DELETEBACKNOTLINE, false, false, false, 0, 0}, - {TEXT("SCI_DELWORDLEFT"), SCI_DELWORDLEFT, true, false, false, VK_BACK, 0}, - {TEXT("SCI_DELWORDRIGHT"), SCI_DELWORDRIGHT, true, false, false, VK_DELETE, 0}, - {TEXT("SCI_DELLINELEFT"), SCI_DELLINELEFT, true, false, true, VK_BACK, 0}, - {TEXT("SCI_DELLINERIGHT"), SCI_DELLINERIGHT, true, false, true, VK_DELETE, 0}, - {TEXT("SCI_LINEDELETE"), SCI_LINEDELETE, true, false, true, VK_L, 0}, - {TEXT("SCI_LINECUT"), SCI_LINECUT, true, false, false, VK_L, 0}, - {TEXT("SCI_LINECOPY"), SCI_LINECOPY, true, false, true, VK_T, 0}, - {TEXT("SCI_LINETRANSPOSE"), SCI_LINETRANSPOSE, true, false, false, VK_T, 0}, - {TEXT("SCI_LINEDUPLICATE"), SCI_LINEDUPLICATE, false, false, false, 0, 0}, - {TEXT("SCI_CANCEL"), SCI_CANCEL, false, false, false, VK_ESCAPE, 0}, - {TEXT("SCI_SWAPMAINANCHORCARET"), SCI_SWAPMAINANCHORCARET, false, false, false, 0, 0}, - {TEXT("SCI_ROTATESELECTION"), SCI_ROTATESELECTION, false, false, false, 0, 0} +ScintillaKeyDefinition scintKeyDefs[] = { //array of accelerator keys for all possible scintilla functions, values can be 0 for vKey, which means its unused + {TEXT("SCI_CUT"), SCI_CUT, true, false, false, VK_X, IDM_EDIT_CUT}, + {TEXT(""), SCI_CUT, false, false, true, VK_DELETE, 0}, + {TEXT("SCI_COPY"), SCI_COPY, true, false, false, VK_C, IDM_EDIT_COPY}, + {TEXT(""), SCI_COPY, true, false, false, VK_INSERT, 0}, + {TEXT("SCI_PASTE"), SCI_PASTE, true, false, false, VK_V, IDM_EDIT_PASTE}, + {TEXT(""), SCI_PASTE, false, false, true, VK_INSERT, 0}, + {TEXT("SCI_SELECTALL"), SCI_SELECTALL, true, false, false, VK_A, IDM_EDIT_SELECTALL}, + {TEXT("SCI_CLEAR"), SCI_CLEAR, false, false, false, VK_DELETE, IDM_EDIT_DELETE}, + {TEXT("SCI_CLEARALL"), SCI_CLEARALL, false, false, false, 0, 0}, + {TEXT("SCI_UNDO"), SCI_UNDO, true, false, false, VK_Z, IDM_EDIT_UNDO}, + {TEXT(""), SCI_UNDO, false, true, false, VK_BACK, 0}, + {TEXT("SCI_REDO"), SCI_REDO, true, false, false, VK_Y, IDM_EDIT_REDO}, + {TEXT("SCI_NEWLINE"), SCI_NEWLINE, false, false, false, VK_RETURN, 0}, + {TEXT(""), SCI_NEWLINE, false, false, true, VK_RETURN, 0}, + {TEXT("SCI_TAB"), SCI_TAB, false, false, false, VK_TAB, IDM_EDIT_INS_TAB}, + {TEXT("SCI_BACKTAB"), SCI_BACKTAB, false, false, true, VK_TAB, IDM_EDIT_RMV_TAB}, + {TEXT("SCI_FORMFEED"), SCI_FORMFEED, false, false, false, 0, 0}, + {TEXT("SCI_ZOOMIN"), SCI_ZOOMIN, true, false, false, VK_ADD, IDM_VIEW_ZOOMIN}, + {TEXT("SCI_ZOOMOUT"), SCI_ZOOMOUT, true, false, false, VK_SUBTRACT, IDM_VIEW_ZOOMOUT}, + {TEXT("SCI_SETZOOM"), SCI_SETZOOM, true, false, false, VK_DIVIDE, IDM_VIEW_ZOOMRESTORE}, + {TEXT("SCI_SELECTIONDUPLICATE"), SCI_SELECTIONDUPLICATE, true, false, false, VK_D, IDM_EDIT_DUP_LINE}, + {TEXT("SCI_LINESJOIN"), SCI_LINESJOIN, false, false, false, 0, 0}, + {TEXT("SCI_SCROLLCARET"), SCI_SCROLLCARET, false, false, false, 0, 0}, + {TEXT("SCI_EDITTOGGLEOVERTYPE"), SCI_EDITTOGGLEOVERTYPE, false, false, false, VK_INSERT, 0}, + {TEXT("SCI_MOVECARETINSIDEVIEW"), SCI_MOVECARETINSIDEVIEW, false, false, false, 0, 0}, + {TEXT("SCI_LINEDOWN"), SCI_LINEDOWN, false, false, false, VK_DOWN, 0}, + {TEXT("SCI_LINEDOWNEXTEND"), SCI_LINEDOWNEXTEND, false, false, true, VK_DOWN, 0}, + {TEXT("SCI_LINEDOWNRECTEXTEND"), SCI_LINEDOWNRECTEXTEND, false, true, true, VK_DOWN, 0}, + {TEXT("SCI_LINESCROLLDOWN"), SCI_LINESCROLLDOWN, true, false, false, VK_DOWN, 0}, + {TEXT("SCI_LINEUP"), SCI_LINEUP, false, false, false, VK_UP, 0}, + {TEXT("SCI_LINEUPEXTEND"), SCI_LINEUPEXTEND, false, false, true, VK_UP, 0}, + {TEXT("SCI_LINEUPRECTEXTEND"), SCI_LINEUPRECTEXTEND, false, true, true, VK_UP, 0}, + {TEXT("SCI_LINESCROLLUP"), SCI_LINESCROLLUP, true, false, false, VK_UP, 0}, + {TEXT("SCI_PARADOWN"), SCI_PARADOWN, true, false, false, VK_OEM_6, 0}, + {TEXT("SCI_PARADOWNEXTEND"), SCI_PARADOWNEXTEND, true, false, true, VK_OEM_6, 0}, + {TEXT("SCI_PARAUP"), SCI_PARAUP, true, false, false, VK_OEM_4, 0}, + {TEXT("SCI_PARAUPEXTEND"), SCI_PARAUPEXTEND, true, false, true, VK_OEM_4, 0}, + {TEXT("SCI_CHARLEFT"), SCI_CHARLEFT, false, false, false, VK_LEFT, 0}, + {TEXT("SCI_CHARLEFTEXTEND"), SCI_CHARLEFTEXTEND, false, false, true, VK_LEFT, 0}, + {TEXT("SCI_CHARLEFTRECTEXTEND"), SCI_CHARLEFTRECTEXTEND, false, true, true, VK_LEFT, 0}, + {TEXT("SCI_CHARRIGHT"), SCI_CHARRIGHT, false, false, false, VK_RIGHT, 0}, + {TEXT("SCI_CHARRIGHTEXTEND"), SCI_CHARRIGHTEXTEND, false, false, true, VK_RIGHT, 0}, + {TEXT("SCI_CHARRIGHTRECTEXTEND"), SCI_CHARRIGHTRECTEXTEND, false, true, true, VK_RIGHT, 0}, + {TEXT("SCI_WORDLEFT"), SCI_WORDLEFT, true, false, false, VK_LEFT, 0}, + {TEXT("SCI_WORDLEFTEXTEND"), SCI_WORDLEFTEXTEND, true, false, true, VK_LEFT, 0}, + {TEXT("SCI_WORDRIGHT"), SCI_WORDRIGHT, true, false, false, VK_RIGHT, 0}, + {TEXT("SCI_WORDRIGHTEXTEND"), SCI_WORDRIGHTEXTEND, false, false, false, 0, 0}, + {TEXT("SCI_WORDLEFTEND"), SCI_WORDLEFTEND, false, false, false, 0, 0}, + {TEXT("SCI_WORDLEFTENDEXTEND"), SCI_WORDLEFTENDEXTEND, false, false, false, 0, 0}, + {TEXT("SCI_WORDRIGHTEND"), SCI_WORDRIGHTEND, false, false, false, 0, 0}, + {TEXT("SCI_WORDRIGHTENDEXTEND"), SCI_WORDRIGHTENDEXTEND, true, false, true, VK_RIGHT, 0}, + {TEXT("SCI_WORDPARTLEFT"), SCI_WORDPARTLEFT, true, false, false, VK_OEM_2, 0}, + {TEXT("SCI_WORDPARTLEFTEXTEND"), SCI_WORDPARTLEFTEXTEND, true, false, true, VK_OEM_2, 0}, + {TEXT("SCI_WORDPARTRIGHT"), SCI_WORDPARTRIGHT, true, false, false, VK_OEM_5, 0}, + {TEXT("SCI_WORDPARTRIGHTEXTEND"), SCI_WORDPARTRIGHTEXTEND, true, false, true, VK_OEM_5, 0}, + {TEXT("SCI_HOME"), SCI_HOME, false, false, false, 0, 0}, + {TEXT("SCI_HOMEEXTEND"), SCI_HOMEEXTEND, false, false, false, 0, 0}, + {TEXT("SCI_HOMERECTEXTEND"), SCI_HOMERECTEXTEND, false, false, false, 0, 0}, + {TEXT("SCI_HOMEDISPLAY"), SCI_HOMEDISPLAY, false, true, false, VK_HOME, 0}, + {TEXT("SCI_HOMEDISPLAYEXTEND"), SCI_HOMEDISPLAYEXTEND, false, false, false, 0, 0}, + {TEXT("SCI_HOMEWRAP"), SCI_HOMEWRAP, false, false, false, 0, 0}, + {TEXT("SCI_HOMEWRAPEXTEND"), SCI_HOMEWRAPEXTEND, false, false, false, 0, 0}, + {TEXT("SCI_VCHOME"), SCI_VCHOME, false, false, false, 0, 0}, + {TEXT("SCI_VCHOMEEXTEND"), SCI_VCHOMEEXTEND, false, false, true, VK_HOME, 0}, + {TEXT("SCI_VCHOMERECTEXTEND"), SCI_VCHOMERECTEXTEND, false, true, true, VK_HOME, 0}, + {TEXT("SCI_VCHOMEWRAP"), SCI_VCHOMEWRAP, false, false, false, VK_HOME, 0}, + {TEXT("SCI_VCHOMEWRAPEXTEND"), SCI_VCHOMEWRAPEXTEND, false, false, false, 0, 0}, + {TEXT("SCI_LINEEND"), SCI_LINEEND, false, false, false, 0, 0}, + {TEXT("SCI_LINEENDEXTEND"), SCI_LINEENDEXTEND, false, false, true, VK_END, 0}, + {TEXT("SCI_LINEENDRECTEXTEND"), SCI_LINEENDRECTEXTEND, false, true, true, VK_END, 0}, + {TEXT("SCI_LINEENDDISPLAY"), SCI_LINEENDDISPLAY, false, true, false, VK_END, 0}, + {TEXT("SCI_LINEENDDISPLAYEXTEND"), SCI_LINEENDDISPLAYEXTEND, false, false, false, 0, 0}, + {TEXT("SCI_LINEENDWRAP"), SCI_LINEENDWRAP, false, false, false, VK_END, 0}, + {TEXT("SCI_LINEENDWRAPEXTEND"), SCI_LINEENDWRAPEXTEND, false, false, false, 0, 0}, + {TEXT("SCI_DOCUMENTSTART"), SCI_DOCUMENTSTART, true, false, false, VK_HOME, 0}, + {TEXT("SCI_DOCUMENTSTARTEXTEND"), SCI_DOCUMENTSTARTEXTEND, true, false, true, VK_HOME, 0}, + {TEXT("SCI_DOCUMENTEND"), SCI_DOCUMENTEND, true, false, false, VK_END, 0}, + {TEXT("SCI_DOCUMENTENDEXTEND"), SCI_DOCUMENTENDEXTEND, true, false, true, VK_END, 0}, + {TEXT("SCI_PAGEUP"), SCI_PAGEUP, false, false, false, VK_PRIOR, 0}, + {TEXT("SCI_PAGEUPEXTEND"), SCI_PAGEUPEXTEND, false, false, true, VK_PRIOR, 0}, + {TEXT("SCI_PAGEUPRECTEXTEND"), SCI_PAGEUPRECTEXTEND, false, true, true, VK_PRIOR, 0}, + {TEXT("SCI_PAGEDOWN"), SCI_PAGEDOWN, false, false, false, VK_NEXT, 0}, + {TEXT("SCI_PAGEDOWNEXTEND"), SCI_PAGEDOWNEXTEND, false, false, true, VK_NEXT, 0}, + {TEXT("SCI_PAGEDOWNRECTEXTEND"), SCI_PAGEDOWNRECTEXTEND, false, true, true, VK_NEXT, 0}, + {TEXT("SCI_STUTTEREDPAGEUP"), SCI_STUTTEREDPAGEUP, false, false, false, 0, 0}, + {TEXT("SCI_STUTTEREDPAGEUPEXTEND"), SCI_STUTTEREDPAGEUPEXTEND, false, false, false, 0, 0}, + {TEXT("SCI_STUTTEREDPAGEDOWN"), SCI_STUTTEREDPAGEDOWN, false, false, false, 0, 0}, + {TEXT("SCI_STUTTEREDPAGEDOWNEXTEND"), SCI_STUTTEREDPAGEDOWNEXTEND, false, false, false, 0, 0}, + {TEXT("SCI_DELETEBACK"), SCI_DELETEBACK, false, false, false, VK_BACK, 0}, + {TEXT(""), SCI_DELETEBACK, false, false, true, VK_BACK, 0}, + {TEXT("SCI_DELETEBACKNOTLINE"), SCI_DELETEBACKNOTLINE, false, false, false, 0, 0}, + {TEXT("SCI_DELWORDLEFT"), SCI_DELWORDLEFT, true, false, false, VK_BACK, 0}, + {TEXT("SCI_DELWORDRIGHT"), SCI_DELWORDRIGHT, true, false, false, VK_DELETE, 0}, + {TEXT("SCI_DELLINELEFT"), SCI_DELLINELEFT, true, false, true, VK_BACK, 0}, + {TEXT("SCI_DELLINERIGHT"), SCI_DELLINERIGHT, true, false, true, VK_DELETE, 0}, + {TEXT("SCI_LINEDELETE"), SCI_LINEDELETE, true, false, true, VK_L, 0}, + {TEXT("SCI_LINECUT"), SCI_LINECUT, true, false, false, VK_L, 0}, + {TEXT("SCI_LINECOPY"), SCI_LINECOPY, true, false, true, VK_T, 0}, + {TEXT("SCI_LINETRANSPOSE"), SCI_LINETRANSPOSE, true, false, false, VK_T, 0}, + {TEXT("SCI_LINEDUPLICATE"), SCI_LINEDUPLICATE, false, false, false, 0, 0}, + {TEXT("SCI_CANCEL"), SCI_CANCEL, false, false, false, VK_ESCAPE, 0}, + {TEXT("SCI_SWAPMAINANCHORCARET"), SCI_SWAPMAINANCHORCARET, false, false, false, 0, 0}, + {TEXT("SCI_ROTATESELECTION"), SCI_ROTATESELECTION, false, false, false, 0, 0} - // {TEXT("SCI_EMPTYUNDOBUFFER"), SCI_EMPTYUNDOBUFFER, false, false, false, 0, 0}, - // {TEXT("SCI_TOGGLECARETSTICKY"), SCI_TOGGLECARETSTICKY, false, false, false, 0, 0}, - // {TEXT("SCI_CALLTIPCANCEL"), SCI_CALLTIPCANCEL, false, false, false, 0, 0}, - // {TEXT("SCI_SETSAVEPOINT"), SCI_SETSAVEPOINT, false, false, false, 0, 0}, - // {TEXT("SCI_CLEARDOCUMENTSTYLE"), SCI_CLEARDOCUMENTSTYLE, false, false, false, 0, 0}, - // - // - //{TEXT("SCI_CHOOSECARETX"), SCI_CHOOSECARETX, false, false, false, 0, 0}, - // {TEXT("SCI_AUTOCCOMPLETE"), SCI_AUTOCCOMPLETE, false, false, false, 0, 0}, - // {TEXT("SCI_AUTOCCANCEL"), SCI_AUTOCCANCEL, false, false, false, 0, 0}, - // {TEXT("SCI_CLEARREGISTEREDIMAGES"), SCI_CLEARREGISTEREDIMAGES, false, false, false, 0, 0}, - // {TEXT("SCI_HOMEDISPLAYEXTEND"), SCI_HOMEDISPLAYEXTEND, false, true, true, VK_HOME, 0}, - // {TEXT("SCI_LINEENDDISPLAYEXTEND"), SCI_LINEENDDISPLAYEXTEND, false, true, true, VK_END, 0}, - // - // {TEXT("SCI_DELWORDRIGHTEND"), SCI_DELWORDRIGHTEND, false, false, false, 0, 0}, - // {TEXT("SCI_LOWERCASE"), SCI_LOWERCASE, false, false, false, 0, 0}, - // {TEXT("SCI_UPPERCASE"), SCI_UPPERCASE, false, false, false, 0, 0}, - // {TEXT("SCI_LOWERCASE"), SCI_LOWERCASE, true, false, false, VK_U, 0}, - // {TEXT("SCI_UPPERCASE"), SCI_UPPERCASE, true, false, true, VK_U, 0}, - // - // {TEXT("SCI_FORMFEED"), SCI_FORMFEED, true, false, false, VK_L, 0}, - // {TEXT("SCI_CLEARALLCMDKEYS"), SCI_CLEARALLCMDKEYS, false, false, false, 0, 0}, - // {TEXT("SCI_STARTRECORD"), SCI_STARTRECORD, false, false, false, 0, 0}, - // {TEXT("SCI_STOPRECORD"), SCI_STOPRECORD, false, false, false, 0, 0}, - // {TEXT("SCI_SEARCHANCHOR"), SCI_SEARCHANCHOR, false, false, false, 0, 0}, - // {TEXT("SCI_TARGETFROMSELECTION"), SCI_TARGETFROMSELECTION, false, false, false, 0, 0}, - // {TEXT("SCI_STYLERESETDEFAULT"), SCI_STYLERESETDEFAULT, false, false, false, 0, 0}, - // {TEXT("SCI_STYLECLEARALL"), SCI_STYLECLEARALL, false, false, false, 0, 0}, - // + // {TEXT("SCI_EMPTYUNDOBUFFER"), SCI_EMPTYUNDOBUFFER, false, false, false, 0, 0}, + // {TEXT("SCI_TOGGLECARETSTICKY"), SCI_TOGGLECARETSTICKY, false, false, false, 0, 0}, + // {TEXT("SCI_CALLTIPCANCEL"), SCI_CALLTIPCANCEL, false, false, false, 0, 0}, + // {TEXT("SCI_SETSAVEPOINT"), SCI_SETSAVEPOINT, false, false, false, 0, 0}, + // {TEXT("SCI_CLEARDOCUMENTSTYLE"), SCI_CLEARDOCUMENTSTYLE, false, false, false, 0, 0}, + // + // + //{TEXT("SCI_CHOOSECARETX"), SCI_CHOOSECARETX, false, false, false, 0, 0}, + // {TEXT("SCI_AUTOCCOMPLETE"), SCI_AUTOCCOMPLETE, false, false, false, 0, 0}, + // {TEXT("SCI_AUTOCCANCEL"), SCI_AUTOCCANCEL, false, false, false, 0, 0}, + // {TEXT("SCI_CLEARREGISTEREDIMAGES"), SCI_CLEARREGISTEREDIMAGES, false, false, false, 0, 0}, + // {TEXT("SCI_HOMEDISPLAYEXTEND"), SCI_HOMEDISPLAYEXTEND, false, true, true, VK_HOME, 0}, + // {TEXT("SCI_LINEENDDISPLAYEXTEND"), SCI_LINEENDDISPLAYEXTEND, false, true, true, VK_END, 0}, + // + // {TEXT("SCI_DELWORDRIGHTEND"), SCI_DELWORDRIGHTEND, false, false, false, 0, 0}, + // {TEXT("SCI_LOWERCASE"), SCI_LOWERCASE, false, false, false, 0, 0}, + // {TEXT("SCI_UPPERCASE"), SCI_UPPERCASE, false, false, false, 0, 0}, + // {TEXT("SCI_LOWERCASE"), SCI_LOWERCASE, true, false, false, VK_U, 0}, + // {TEXT("SCI_UPPERCASE"), SCI_UPPERCASE, true, false, true, VK_U, 0}, + // + // {TEXT("SCI_FORMFEED"), SCI_FORMFEED, true, false, false, VK_L, 0}, + // {TEXT("SCI_CLEARALLCMDKEYS"), SCI_CLEARALLCMDKEYS, false, false, false, 0, 0}, + // {TEXT("SCI_STARTRECORD"), SCI_STARTRECORD, false, false, false, 0, 0}, + // {TEXT("SCI_STOPRECORD"), SCI_STOPRECORD, false, false, false, 0, 0}, + // {TEXT("SCI_SEARCHANCHOR"), SCI_SEARCHANCHOR, false, false, false, 0, 0}, + // {TEXT("SCI_TARGETFROMSELECTION"), SCI_TARGETFROMSELECTION, false, false, false, 0, 0}, + // {TEXT("SCI_STYLERESETDEFAULT"), SCI_STYLERESETDEFAULT, false, false, false, 0, 0}, + // {TEXT("SCI_STYLECLEARALL"), SCI_STYLECLEARALL, false, false, false, 0, 0}, + // }; From 9c857ed8115e346b3fd48d10cfef9e18578026d7 Mon Sep 17 00:00:00 2001 From: Damien GERARD Date: Fri, 14 Aug 2015 22:51:44 +0200 Subject: [PATCH 40/85] Parameters: using nullptr instead of NULL, added static --- PowerEditor/src/Parameters.cpp | 514 +++++++++++++++++---------------- 1 file changed, 263 insertions(+), 251 deletions(-) diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp index a4961f741..54cb40535 100644 --- a/PowerEditor/src/Parameters.cpp +++ b/PowerEditor/src/Parameters.cpp @@ -65,276 +65,288 @@ struct ScintillaKeyDefinition }; -WinMenuKeyDefinition winKeyDefs[] = +/*! +** \brief array of accelerator keys for all std menu items +** +** values can be 0 for vKey, which means its unused +*/ +static const WinMenuKeyDefinition winKeyDefs[] = { -//array of accelerator keys for all std menu items, values can be 0 for vKey, which means its unused -//================================================================================ -// {V_KEY, COMMAND_ID, Ctrl, Alt, Shift, cmdName}, -//================================================================================ - {VK_N, IDM_FILE_NEW, true, false, false, NULL}, - {VK_O, IDM_FILE_OPEN, true, false, false, NULL}, - {VK_NULL, IDM_FILE_RELOAD, false, false, false, NULL}, - {VK_S, IDM_FILE_SAVE, true, false, false, NULL}, - {VK_S, IDM_FILE_SAVEAS, true, true, false, NULL}, - {VK_NULL, IDM_FILE_SAVECOPYAS, false, false, false, NULL}, - {VK_S, IDM_FILE_SAVEALL, true, false, true, NULL}, - {VK_W, IDM_FILE_CLOSE, true, false, false, NULL}, - {VK_NULL, IDM_FILE_CLOSEALL, false, false, false, NULL}, - {VK_NULL, IDM_FILE_CLOSEALL_BUT_CURRENT, false, false, false, NULL}, - {VK_NULL, IDM_FILE_CLOSEALL_TOLEFT, false, false, false, NULL}, - {VK_NULL, IDM_FILE_CLOSEALL_TORIGHT, false, false, false, NULL}, - {VK_NULL, IDM_FILE_DELETE, false, false, false, NULL}, - {VK_NULL, IDM_FILE_RENAME, false, false, false, NULL}, - {VK_NULL, IDM_FILE_LOADSESSION, false, false, false, NULL}, - {VK_NULL, IDM_FILE_SAVESESSION, false, false, false, NULL}, - {VK_P, IDM_FILE_PRINT, true, false, false, NULL}, - {VK_NULL, IDM_FILE_PRINTNOW, false, false, false, NULL}, - {VK_F4, IDM_FILE_EXIT, false, true, false, NULL}, + // V_KEY, COMMAND_ID, Ctrl, Alt, Shift, cmdName + // ------------------------------------------------------------------------------------ + // + {VK_N, IDM_FILE_NEW, true, false, false, nullptr}, + {VK_O, IDM_FILE_OPEN, true, false, false, nullptr}, + {VK_NULL, IDM_FILE_RELOAD, false, false, false, nullptr}, + {VK_S, IDM_FILE_SAVE, true, false, false, nullptr}, + {VK_S, IDM_FILE_SAVEAS, true, true, false, nullptr}, + {VK_NULL, IDM_FILE_SAVECOPYAS, false, false, false, nullptr}, + {VK_S, IDM_FILE_SAVEALL, true, false, true, nullptr}, + {VK_W, IDM_FILE_CLOSE, true, false, false, nullptr}, + {VK_NULL, IDM_FILE_CLOSEALL, false, false, false, nullptr}, + {VK_NULL, IDM_FILE_CLOSEALL_BUT_CURRENT, false, false, false, nullptr}, + {VK_NULL, IDM_FILE_CLOSEALL_TOLEFT, false, false, false, nullptr}, + {VK_NULL, IDM_FILE_CLOSEALL_TORIGHT, false, false, false, nullptr}, + {VK_NULL, IDM_FILE_DELETE, false, false, false, nullptr}, + {VK_NULL, IDM_FILE_RENAME, false, false, false, nullptr}, + {VK_NULL, IDM_FILE_LOADSESSION, false, false, false, nullptr}, + {VK_NULL, IDM_FILE_SAVESESSION, false, false, false, nullptr}, + {VK_P, IDM_FILE_PRINT, true, false, false, nullptr}, + {VK_NULL, IDM_FILE_PRINTNOW, false, false, false, nullptr}, + {VK_F4, IDM_FILE_EXIT, false, true, false, nullptr}, { VK_T, IDM_FILE_RESTORELASTCLOSEDFILE, true, false, true, TEXT("Restore Recent Closed File")}, -// {VK_NULL, IDM_EDIT_UNDO, false, false, false, NULL}, -// {VK_NULL, IDM_EDIT_REDO, false, false, false, NULL}, -// {VK_NULL, IDM_EDIT_CUT, false, false, false, NULL}, -// {VK_NULL, IDM_EDIT_COPY, false, false, false, NULL}, -// {VK_NULL, IDM_EDIT_PASTE, false, false, false, NULL}, -// {VK_NULL, IDM_EDIT_DELETE, false, false, false, NULL}, -// {VK_NULL, IDM_EDIT_SELECTALL, false, false, false, NULL}, +// {VK_NULL, IDM_EDIT_UNDO, false, false, false, nullptr}, +// {VK_NULL, IDM_EDIT_REDO, false, false, false, nullptr}, +// {VK_NULL, IDM_EDIT_CUT, false, false, false, nullptr}, +// {VK_NULL, IDM_EDIT_COPY, false, false, false, nullptr}, +// {VK_NULL, IDM_EDIT_PASTE, false, false, false, nullptr}, +// {VK_NULL, IDM_EDIT_DELETE, false, false, false, nullptr}, +// {VK_NULL, IDM_EDIT_SELECTALL, false, false, false, nullptr}, - {VK_NULL, IDM_EDIT_SETREADONLY, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_CLEARREADONLY, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_FULLPATHTOCLIP, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_FILENAMETOCLIP, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_CURRENTDIRTOCLIP, false, false, false, NULL}, -// {VK_NULL, IDM_EDIT_INS_TAB, false, false, false, NULL}, -// {VK_NULL, IDM_EDIT_RMV_TAB, false, false, false, NULL}, -// {VK_NULL, IDM_EDIT_DUP_LINE, false, false, false, NULL}, - {VK_I, IDM_EDIT_SPLIT_LINES, true, false, false, NULL}, - {VK_J, IDM_EDIT_JOIN_LINES, true, false, false, NULL}, - {VK_UP, IDM_EDIT_LINE_UP, true, false, true, NULL}, - {VK_DOWN, IDM_EDIT_LINE_DOWN, true, false, true, NULL}, - {VK_NULL, IDM_EDIT_TRIMTRAILING, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_TRIMLINEHEAD, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_TRIM_BOTH, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_EOL2WS, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_TRIMALL, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_TAB2SW, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_SW2TAB_ALL, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_SW2TAB_LEADING, false, false, false, NULL}, - {VK_NULL, IDM_EDIT_BEGINENDSELECT, false, false, false, NULL}, + {VK_NULL, IDM_EDIT_SETREADONLY, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_CLEARREADONLY, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_FULLPATHTOCLIP, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_FILENAMETOCLIP, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_CURRENTDIRTOCLIP, false, false, false, nullptr}, +// {VK_NULL, IDM_EDIT_INS_TAB, false, false, false, nullptr}, +// {VK_NULL, IDM_EDIT_RMV_TAB, false, false, false, nullptr}, +// {VK_NULL, IDM_EDIT_DUP_LINE, false, false, false, nullptr}, + {VK_I, IDM_EDIT_SPLIT_LINES, true, false, false, nullptr}, + {VK_J, IDM_EDIT_JOIN_LINES, true, false, false, nullptr}, + {VK_UP, IDM_EDIT_LINE_UP, true, false, true, nullptr}, + {VK_DOWN, IDM_EDIT_LINE_DOWN, true, false, true, nullptr}, + {VK_NULL, IDM_EDIT_TRIMTRAILING, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_TRIMLINEHEAD, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_TRIM_BOTH, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_EOL2WS, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_TRIMALL, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_TAB2SW, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_SW2TAB_ALL, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_SW2TAB_LEADING, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_BEGINENDSELECT, false, false, false, nullptr}, - {VK_C, IDM_EDIT_COLUMNMODE, false, true, false, NULL}, - {VK_U, IDM_EDIT_UPPERCASE, true, false, true, NULL}, - {VK_U, IDM_EDIT_LOWERCASE, true, false, false, NULL}, - {VK_Q, IDM_EDIT_BLOCK_COMMENT, true, false, false, NULL}, - {VK_K, IDM_EDIT_BLOCK_COMMENT_SET, true, false, false, NULL}, - {VK_K, IDM_EDIT_BLOCK_UNCOMMENT, true, false, true, NULL}, - {VK_Q, IDM_EDIT_STREAM_COMMENT, true, false, true, NULL}, - {VK_NULL, IDM_EDIT_STREAM_UNCOMMENT, false, false, false, NULL}, - {VK_SPACE, IDM_EDIT_AUTOCOMPLETE, true, false, false, NULL}, - {VK_SPACE, IDM_EDIT_AUTOCOMPLETE_PATH, true, true, false, NULL}, - {VK_RETURN, IDM_EDIT_AUTOCOMPLETE_CURRENTFILE, true, false, false, NULL}, - {VK_SPACE, IDM_EDIT_FUNCCALLTIP, true, false, true, NULL}, - {VK_R, IDM_EDIT_RTL, true, true, false, NULL}, - {VK_L, IDM_EDIT_LTR, true, true, false, NULL}, - {VK_NULL, IDM_EDIT_SORTLINES_LEXICOGRAPHIC_ASCENDING, false, false, false, NULL }, - {VK_NULL, IDM_EDIT_SORTLINES_LEXICOGRAPHIC_DESCENDING, false, false, false, NULL }, - {VK_NULL, IDM_EDIT_SORTLINES_INTEGER_ASCENDING, false, false, false, NULL }, - {VK_NULL, IDM_EDIT_SORTLINES_INTEGER_DESCENDING, false, false, false, NULL }, - {VK_NULL, IDM_EDIT_SORTLINES_DECIMALCOMMA_ASCENDING, false, false, false, NULL }, - {VK_NULL, IDM_EDIT_SORTLINES_DECIMALCOMMA_DESCENDING, false, false, false, NULL }, - {VK_NULL, IDM_EDIT_SORTLINES_DECIMALDOT_ASCENDING, false, false, false, NULL }, - {VK_NULL, IDM_EDIT_SORTLINES_DECIMALDOT_DESCENDING, false, false, false, NULL }, - {VK_RETURN, IDM_EDIT_BLANKLINEABOVECURRENT, true, true, false, NULL}, - {VK_RETURN, IDM_EDIT_BLANKLINEBELOWCURRENT, true, true, true, NULL}, - {VK_F, IDM_SEARCH_FIND, true, false, false, NULL}, - {VK_F, IDM_SEARCH_FINDINFILES, true, false, true, NULL}, - {VK_F3, IDM_SEARCH_FINDNEXT, false, false, false, NULL}, - {VK_F3, IDM_SEARCH_FINDPREV, false, false, true, NULL}, - {VK_F3, IDM_SEARCH_VOLATILE_FINDNEXT, true, true, false, NULL}, - {VK_F3, IDM_SEARCH_VOLATILE_FINDPREV, true, true, true, NULL}, - {VK_F3, IDM_SEARCH_SETANDFINDNEXT, true, false, false, NULL}, - {VK_F3, IDM_SEARCH_SETANDFINDPREV, true, false, true, NULL}, - {VK_F4, IDM_SEARCH_GOTONEXTFOUND, false, false, false, NULL}, - {VK_F4, IDM_SEARCH_GOTOPREVFOUND, false, false, true, NULL}, - {VK_F7, IDM_FOCUS_ON_FOUND_RESULTS, false, false, false, NULL}, - {VK_H, IDM_SEARCH_REPLACE, true, false, false, NULL}, - {VK_I, IDM_SEARCH_FINDINCREMENT, true, true, false, NULL}, - {VK_G, IDM_SEARCH_GOTOLINE, true, false, false, NULL}, - {VK_B, IDM_SEARCH_GOTOMATCHINGBRACE, true, false, false, NULL}, - {VK_B, IDM_SEARCH_SELECTMATCHINGBRACES, true, true, false, NULL}, - {VK_F2, IDM_SEARCH_TOGGLE_BOOKMARK, true, false, false, NULL}, - {VK_F2, IDM_SEARCH_NEXT_BOOKMARK, false, false, false, NULL}, - {VK_F2, IDM_SEARCH_PREV_BOOKMARK, false, false, true, NULL}, - {VK_NULL, IDM_SEARCH_CLEAR_BOOKMARKS, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_CUTMARKEDLINES, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_COPYMARKEDLINES, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_PASTEMARKEDLINES, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_DELETEMARKEDLINES, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_MARK, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_MARKALLEXT1, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_MARKALLEXT2, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_MARKALLEXT3, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_MARKALLEXT4, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_MARKALLEXT5, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_UNMARKALLEXT1, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_UNMARKALLEXT2, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_UNMARKALLEXT3, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_UNMARKALLEXT4, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_UNMARKALLEXT5, false, false, false, NULL}, - {VK_NULL, IDM_SEARCH_CLEARALLMARKS, false, false, false, NULL}, - {VK_1, IDM_SEARCH_GOPREVMARKER1, true, false, true, NULL}, - {VK_2, IDM_SEARCH_GOPREVMARKER2, true, false, true, NULL}, - {VK_3, IDM_SEARCH_GOPREVMARKER3, true, false, true, NULL}, - {VK_4, IDM_SEARCH_GOPREVMARKER4, true, false, true, NULL}, - {VK_5, IDM_SEARCH_GOPREVMARKER5, true, false, true, NULL}, - {VK_0, IDM_SEARCH_GOPREVMARKER_DEF, true, false, true, NULL}, + {VK_C, IDM_EDIT_COLUMNMODE, false, true, false, nullptr}, + {VK_U, IDM_EDIT_UPPERCASE, true, false, true, nullptr}, + {VK_U, IDM_EDIT_LOWERCASE, true, false, false, nullptr}, + {VK_Q, IDM_EDIT_BLOCK_COMMENT, true, false, false, nullptr}, + {VK_K, IDM_EDIT_BLOCK_COMMENT_SET, true, false, false, nullptr}, + {VK_K, IDM_EDIT_BLOCK_UNCOMMENT, true, false, true, nullptr}, + {VK_Q, IDM_EDIT_STREAM_COMMENT, true, false, true, nullptr}, + {VK_NULL, IDM_EDIT_STREAM_UNCOMMENT, false, false, false, nullptr}, + {VK_SPACE, IDM_EDIT_AUTOCOMPLETE, true, false, false, nullptr}, + {VK_SPACE, IDM_EDIT_AUTOCOMPLETE_PATH, true, true, false, nullptr}, + {VK_RETURN, IDM_EDIT_AUTOCOMPLETE_CURRENTFILE, true, false, false, nullptr}, + {VK_SPACE, IDM_EDIT_FUNCCALLTIP, true, false, true, nullptr}, + {VK_R, IDM_EDIT_RTL, true, true, false, nullptr}, + {VK_L, IDM_EDIT_LTR, true, true, false, nullptr}, + {VK_NULL, IDM_EDIT_SORTLINES_LEXICOGRAPHIC_ASCENDING, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_SORTLINES_LEXICOGRAPHIC_DESCENDING, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_SORTLINES_INTEGER_ASCENDING, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_SORTLINES_INTEGER_DESCENDING, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_SORTLINES_DECIMALCOMMA_ASCENDING, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_SORTLINES_DECIMALCOMMA_DESCENDING, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_SORTLINES_DECIMALDOT_ASCENDING, false, false, false, nullptr}, + {VK_NULL, IDM_EDIT_SORTLINES_DECIMALDOT_DESCENDING, false, false, false, nullptr}, + {VK_RETURN, IDM_EDIT_BLANKLINEABOVECURRENT, true, true, false, nullptr}, + {VK_RETURN, IDM_EDIT_BLANKLINEBELOWCURRENT, true, true, true, nullptr}, + {VK_F, IDM_SEARCH_FIND, true, false, false, nullptr}, + {VK_F, IDM_SEARCH_FINDINFILES, true, false, true, nullptr}, + {VK_F3, IDM_SEARCH_FINDNEXT, false, false, false, nullptr}, + {VK_F3, IDM_SEARCH_FINDPREV, false, false, true, nullptr}, + {VK_F3, IDM_SEARCH_VOLATILE_FINDNEXT, true, true, false, nullptr}, + {VK_F3, IDM_SEARCH_VOLATILE_FINDPREV, true, true, true, nullptr}, + {VK_F3, IDM_SEARCH_SETANDFINDNEXT, true, false, false, nullptr}, + {VK_F3, IDM_SEARCH_SETANDFINDPREV, true, false, true, nullptr}, + {VK_F4, IDM_SEARCH_GOTONEXTFOUND, false, false, false, nullptr}, + {VK_F4, IDM_SEARCH_GOTOPREVFOUND, false, false, true, nullptr}, + {VK_F7, IDM_FOCUS_ON_FOUND_RESULTS, false, false, false, nullptr}, + {VK_H, IDM_SEARCH_REPLACE, true, false, false, nullptr}, + {VK_I, IDM_SEARCH_FINDINCREMENT, true, true, false, nullptr}, + {VK_G, IDM_SEARCH_GOTOLINE, true, false, false, nullptr}, + {VK_B, IDM_SEARCH_GOTOMATCHINGBRACE, true, false, false, nullptr}, + {VK_B, IDM_SEARCH_SELECTMATCHINGBRACES, true, true, false, nullptr}, + {VK_F2, IDM_SEARCH_TOGGLE_BOOKMARK, true, false, false, nullptr}, + {VK_F2, IDM_SEARCH_NEXT_BOOKMARK, false, false, false, nullptr}, + {VK_F2, IDM_SEARCH_PREV_BOOKMARK, false, false, true, nullptr}, + {VK_NULL, IDM_SEARCH_CLEAR_BOOKMARKS, false, false, false, nullptr}, + {VK_NULL, IDM_SEARCH_CUTMARKEDLINES, false, false, false, nullptr}, + {VK_NULL, IDM_SEARCH_COPYMARKEDLINES, false, false, false, nullptr}, + {VK_NULL, IDM_SEARCH_PASTEMARKEDLINES, false, false, false, nullptr}, + {VK_NULL, IDM_SEARCH_DELETEMARKEDLINES, false, false, false, nullptr}, + {VK_NULL, IDM_SEARCH_MARK, false, false, false, nullptr}, + {VK_NULL, IDM_SEARCH_MARKALLEXT1, false, false, false, nullptr}, + {VK_NULL, IDM_SEARCH_MARKALLEXT2, false, false, false, nullptr}, + {VK_NULL, IDM_SEARCH_MARKALLEXT3, false, false, false, nullptr}, + {VK_NULL, IDM_SEARCH_MARKALLEXT4, false, false, false, nullptr}, + {VK_NULL, IDM_SEARCH_MARKALLEXT5, false, false, false, nullptr}, + {VK_NULL, IDM_SEARCH_UNMARKALLEXT1, false, false, false, nullptr}, + {VK_NULL, IDM_SEARCH_UNMARKALLEXT2, false, false, false, nullptr}, + {VK_NULL, IDM_SEARCH_UNMARKALLEXT3, false, false, false, nullptr}, + {VK_NULL, IDM_SEARCH_UNMARKALLEXT4, false, false, false, nullptr}, + {VK_NULL, IDM_SEARCH_UNMARKALLEXT5, false, false, false, nullptr}, + {VK_NULL, IDM_SEARCH_CLEARALLMARKS, false, false, false, nullptr}, + {VK_1, IDM_SEARCH_GOPREVMARKER1, true, false, true, nullptr}, + {VK_2, IDM_SEARCH_GOPREVMARKER2, true, false, true, nullptr}, + {VK_3, IDM_SEARCH_GOPREVMARKER3, true, false, true, nullptr}, + {VK_4, IDM_SEARCH_GOPREVMARKER4, true, false, true, nullptr}, + {VK_5, IDM_SEARCH_GOPREVMARKER5, true, false, true, nullptr}, + {VK_0, IDM_SEARCH_GOPREVMARKER_DEF, true, false, true, nullptr}, - {VK_F11, IDM_VIEW_FULLSCREENTOGGLE, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_ALWAYSONTOP, false, false, false, NULL}, - {VK_F12, IDM_VIEW_POSTIT, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_TAB_SPACE, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_EOL, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_ALL_CHARACTERS, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_INDENT_GUIDE, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_WRAP, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_WRAP_SYMBOL, false, false, false, NULL}, - {VK_NULL, IDM_LANG_USER_DLG, false, false, false, NULL}, - // {VK_NULL, IDM_VIEW_ZOOMIN, false, false, false, NULL}, - // {VK_NULL, IDM_VIEW_ZOOMOUT, false, false, false, NULL}, - // {VK_NULL, IDM_VIEW_ZOOMRESTORE, false, false, false, NULL}, - {VK_0, IDM_VIEW_TOGGLE_FOLDALL, false, true, false, NULL}, - {VK_F, IDM_VIEW_FOLD_CURRENT, true, true, false, NULL}, - {VK_1, IDM_VIEW_FOLD_1, false, true, false, NULL}, - {VK_2, IDM_VIEW_FOLD_2, false, true, false, NULL}, - {VK_3, IDM_VIEW_FOLD_3, false, true, false, NULL}, - {VK_4, IDM_VIEW_FOLD_4, false, true, false, NULL}, - {VK_5, IDM_VIEW_FOLD_5, false, true, false, NULL}, - {VK_6, IDM_VIEW_FOLD_6, false, true, false, NULL}, - {VK_7, IDM_VIEW_FOLD_7, false, true, false, NULL}, - {VK_8, IDM_VIEW_FOLD_8, false, true, false, NULL}, - {VK_F, IDM_VIEW_UNFOLD_CURRENT, true, true, true, NULL}, - {VK_1, IDM_VIEW_UNFOLD_1, false, true, true, NULL}, - {VK_2, IDM_VIEW_UNFOLD_2, false, true, true, NULL}, - {VK_3, IDM_VIEW_UNFOLD_3, false, true, true, NULL}, - {VK_4, IDM_VIEW_UNFOLD_4, false, true, true, NULL}, - {VK_5, IDM_VIEW_UNFOLD_5, false, true, true, NULL}, - {VK_6, IDM_VIEW_UNFOLD_6, false, true, true, NULL}, - {VK_7, IDM_VIEW_UNFOLD_7, false, true, true, NULL}, - {VK_8, IDM_VIEW_UNFOLD_8, false, true, true, NULL}, - {VK_0, IDM_VIEW_TOGGLE_UNFOLDALL, false, true, true, NULL}, - {VK_H, IDM_VIEW_HIDELINES, false, true, false, NULL}, - {VK_NULL, IDM_VIEW_GOTO_ANOTHER_VIEW, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_CLONE_TO_ANOTHER_VIEW, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_SYNSCROLLV, false, false, false, NULL}, - {VK_NULL, IDM_VIEW_SYNSCROLLH, false, false, false, NULL}, - {VK_F8, IDM_VIEW_SWITCHTO_OTHER_VIEW, false, false, false, NULL}, - {VK_NUMPAD1, IDM_VIEW_TAB1, true, false, false, NULL}, - {VK_NUMPAD2, IDM_VIEW_TAB2, true, false, false, NULL}, - {VK_NUMPAD3, IDM_VIEW_TAB3, true, false, false, NULL}, - {VK_NUMPAD4, IDM_VIEW_TAB4, true, false, false, NULL}, - {VK_NUMPAD5, IDM_VIEW_TAB5, true, false, false, NULL}, - {VK_NUMPAD6, IDM_VIEW_TAB6, true, false, false, NULL}, - {VK_NUMPAD7, IDM_VIEW_TAB7, true, false, false, NULL}, - {VK_NUMPAD8, IDM_VIEW_TAB8, true, false, false, NULL}, - {VK_NUMPAD9, IDM_VIEW_TAB9, true, false, false, NULL}, - {VK_NEXT, IDM_VIEW_TAB_NEXT, true, false, false, NULL}, - {VK_PRIOR, IDM_VIEW_TAB_PREV, true, false, false, NULL}, + {VK_F11, IDM_VIEW_FULLSCREENTOGGLE, false, false, false, nullptr}, + {VK_NULL, IDM_VIEW_ALWAYSONTOP, false, false, false, nullptr}, + {VK_F12, IDM_VIEW_POSTIT, false, false, false, nullptr}, + {VK_NULL, IDM_VIEW_TAB_SPACE, false, false, false, nullptr}, + {VK_NULL, IDM_VIEW_EOL, false, false, false, nullptr}, + {VK_NULL, IDM_VIEW_ALL_CHARACTERS, false, false, false, nullptr}, + {VK_NULL, IDM_VIEW_INDENT_GUIDE, false, false, false, nullptr}, + {VK_NULL, IDM_VIEW_WRAP, false, false, false, nullptr}, + {VK_NULL, IDM_VIEW_WRAP_SYMBOL, false, false, false, nullptr}, + {VK_NULL, IDM_LANG_USER_DLG, false, false, false, nullptr}, + // {VK_NULL, IDM_VIEW_ZOOMIN, false, false, false, nullptr}, + // {VK_NULL, IDM_VIEW_ZOOMOUT, false, false, false, nullptr}, + // {VK_NULL, IDM_VIEW_ZOOMRESTORE, false, false, false, nullptr}, + {VK_0, IDM_VIEW_TOGGLE_FOLDALL, false, true, false, nullptr}, + {VK_F, IDM_VIEW_FOLD_CURRENT, true, true, false, nullptr}, + {VK_1, IDM_VIEW_FOLD_1, false, true, false, nullptr}, + {VK_2, IDM_VIEW_FOLD_2, false, true, false, nullptr}, + {VK_3, IDM_VIEW_FOLD_3, false, true, false, nullptr}, + {VK_4, IDM_VIEW_FOLD_4, false, true, false, nullptr}, + {VK_5, IDM_VIEW_FOLD_5, false, true, false, nullptr}, + {VK_6, IDM_VIEW_FOLD_6, false, true, false, nullptr}, + {VK_7, IDM_VIEW_FOLD_7, false, true, false, nullptr}, + {VK_8, IDM_VIEW_FOLD_8, false, true, false, nullptr}, + {VK_F, IDM_VIEW_UNFOLD_CURRENT, true, true, true, nullptr}, + {VK_1, IDM_VIEW_UNFOLD_1, false, true, true, nullptr}, + {VK_2, IDM_VIEW_UNFOLD_2, false, true, true, nullptr}, + {VK_3, IDM_VIEW_UNFOLD_3, false, true, true, nullptr}, + {VK_4, IDM_VIEW_UNFOLD_4, false, true, true, nullptr}, + {VK_5, IDM_VIEW_UNFOLD_5, false, true, true, nullptr}, + {VK_6, IDM_VIEW_UNFOLD_6, false, true, true, nullptr}, + {VK_7, IDM_VIEW_UNFOLD_7, false, true, true, nullptr}, + {VK_8, IDM_VIEW_UNFOLD_8, false, true, true, nullptr}, + {VK_0, IDM_VIEW_TOGGLE_UNFOLDALL, false, true, true, nullptr}, + {VK_H, IDM_VIEW_HIDELINES, false, true, false, nullptr}, + {VK_NULL, IDM_VIEW_GOTO_ANOTHER_VIEW, false, false, false, nullptr}, + {VK_NULL, IDM_VIEW_CLONE_TO_ANOTHER_VIEW, false, false, false, nullptr}, + {VK_NULL, IDM_VIEW_SYNSCROLLV, false, false, false, nullptr}, + {VK_NULL, IDM_VIEW_SYNSCROLLH, false, false, false, nullptr}, + {VK_F8, IDM_VIEW_SWITCHTO_OTHER_VIEW, false, false, false, nullptr}, + {VK_NUMPAD1, IDM_VIEW_TAB1, true, false, false, nullptr}, + {VK_NUMPAD2, IDM_VIEW_TAB2, true, false, false, nullptr}, + {VK_NUMPAD3, IDM_VIEW_TAB3, true, false, false, nullptr}, + {VK_NUMPAD4, IDM_VIEW_TAB4, true, false, false, nullptr}, + {VK_NUMPAD5, IDM_VIEW_TAB5, true, false, false, nullptr}, + {VK_NUMPAD6, IDM_VIEW_TAB6, true, false, false, nullptr}, + {VK_NUMPAD7, IDM_VIEW_TAB7, true, false, false, nullptr}, + {VK_NUMPAD8, IDM_VIEW_TAB8, true, false, false, nullptr}, + {VK_NUMPAD9, IDM_VIEW_TAB9, true, false, false, nullptr}, + {VK_NEXT, IDM_VIEW_TAB_NEXT, true, false, false, nullptr}, + {VK_PRIOR, IDM_VIEW_TAB_PREV, true, false, false, nullptr}, - {VK_NULL, IDM_FORMAT_TODOS, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_TOUNIX, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_TOMAC, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ANSI, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_UTF_8, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_AS_UTF_8, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_UCS_2BE, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_UCS_2LE, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_CONV2_ANSI, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_CONV2_AS_UTF_8, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_CONV2_UTF_8, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_CONV2_UCS_2BE, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_CONV2_UCS_2LE, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_6, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1256, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_13, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1257, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_14, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_5, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_MAC_CYRILLIC, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_KOI8R_CYRILLIC, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_KOI8U_CYRILLIC, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1251, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1250, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_437, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_720, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_737, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_775, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_850, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_852, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_855, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_857, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_858, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_860, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_861, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_862, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_863, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_865, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_866, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_DOS_869, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_BIG5, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_GB2312, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_2, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_7, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1253, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_8, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1255, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_SHIFT_JIS, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_EUC_KR, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_10, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_15, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_4, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_16, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_3, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_11, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_TIS_620, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_9, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1254, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1252, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_ISO_8859_1, false, false, false, NULL}, - {VK_NULL, IDM_FORMAT_WIN_1258, false, false, false, NULL}, + {VK_NULL, IDM_FORMAT_TODOS, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_TOUNIX, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_TOMAC, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_ANSI, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_UTF_8, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_AS_UTF_8, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_UCS_2BE, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_UCS_2LE, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_CONV2_ANSI, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_CONV2_AS_UTF_8, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_CONV2_UTF_8, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_CONV2_UCS_2BE, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_CONV2_UCS_2LE, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_ISO_8859_6, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_WIN_1256, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_ISO_8859_13, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_WIN_1257, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_ISO_8859_14, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_ISO_8859_5, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_MAC_CYRILLIC, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_KOI8R_CYRILLIC, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_KOI8U_CYRILLIC, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_WIN_1251, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_WIN_1250, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_DOS_437, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_DOS_720, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_DOS_737, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_DOS_775, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_DOS_850, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_DOS_852, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_DOS_855, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_DOS_857, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_DOS_858, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_DOS_860, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_DOS_861, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_DOS_862, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_DOS_863, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_DOS_865, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_DOS_866, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_DOS_869, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_BIG5, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_GB2312, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_ISO_8859_2, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_ISO_8859_7, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_WIN_1253, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_ISO_8859_8, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_WIN_1255, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_SHIFT_JIS, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_EUC_KR, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_ISO_8859_10, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_ISO_8859_15, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_ISO_8859_4, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_ISO_8859_16, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_ISO_8859_3, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_ISO_8859_11, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_TIS_620, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_ISO_8859_9, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_WIN_1254, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_WIN_1252, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_ISO_8859_1, false, false, false, nullptr}, + {VK_NULL, IDM_FORMAT_WIN_1258, false, false, false, nullptr}, - {VK_NULL, IDM_SETTING_PREFERECE, false, false, false, NULL}, - {VK_NULL, IDM_LANGSTYLE_CONFIG_DLG, false, false, false, NULL}, - {VK_NULL, IDM_SETTING_SHORTCUT_MAPPER, false, false, false, NULL}, + {VK_NULL, IDM_SETTING_PREFERECE, false, false, false, nullptr}, + {VK_NULL, IDM_LANGSTYLE_CONFIG_DLG, false, false, false, nullptr}, + {VK_NULL, IDM_SETTING_SHORTCUT_MAPPER, false, false, false, nullptr}, {VK_R, IDC_EDIT_TOGGLEMACRORECORDING, true, false, true, TEXT("Toggle macro record")}, - {VK_P, IDM_MACRO_PLAYBACKRECORDEDMACRO, true, false, true, NULL}, - {VK_NULL, IDM_MACRO_SAVECURRENTMACRO, false, false, false, NULL}, - {VK_NULL, IDM_MACRO_RUNMULTIMACRODLG, false, false, false, NULL}, + {VK_P, IDM_MACRO_PLAYBACKRECORDEDMACRO, true, false, true, nullptr}, + {VK_NULL, IDM_MACRO_SAVECURRENTMACRO, false, false, false, nullptr}, + {VK_NULL, IDM_MACRO_RUNMULTIMACRODLG, false, false, false, nullptr}, - {VK_F5, IDM_EXECUTE, false, false, false, NULL}, + {VK_F5, IDM_EXECUTE, false, false, false, nullptr}, - {VK_NULL, IDM_HOMESWEETHOME, false, false, false, NULL}, - {VK_NULL, IDM_PROJECTPAGE, false, false, false, NULL}, - {VK_NULL, IDM_ONLINEHELP, false, false, false, NULL}, - {VK_NULL, IDM_FORUM, false, false, false, NULL}, - {VK_NULL, IDM_PLUGINSHOME, false, false, false, NULL}, - {VK_F1, IDM_ABOUT, false, false, false, NULL}, - {VK_F1, IDM_HELP, false, false, true, NULL}, + {VK_NULL, IDM_HOMESWEETHOME, false, false, false, nullptr}, + {VK_NULL, IDM_PROJECTPAGE, false, false, false, nullptr}, + {VK_NULL, IDM_ONLINEHELP, false, false, false, nullptr}, + {VK_NULL, IDM_FORUM, false, false, false, nullptr}, + {VK_NULL, IDM_PLUGINSHOME, false, false, false, nullptr}, + {VK_F1, IDM_ABOUT, false, false, false, nullptr}, + {VK_F1, IDM_HELP, false, false, true, nullptr}, - {VK_TAB, IDC_PREV_DOC, true, false, true, TEXT("Switch to previous document")}, + {VK_TAB, IDC_PREV_DOC, true, false, true, TEXT("Switch to previous document")}, {VK_TAB, IDC_NEXT_DOC, true, false, false, TEXT("Switch to next document")}, - {VK_1, IDM_SEARCH_GONEXTMARKER1, true, false, false, NULL}, - {VK_2, IDM_SEARCH_GONEXTMARKER2, true, false, false, NULL}, - {VK_3, IDM_SEARCH_GONEXTMARKER3, true, false, false, NULL}, - {VK_4, IDM_SEARCH_GONEXTMARKER4, true, false, false, NULL}, - {VK_5, IDM_SEARCH_GONEXTMARKER5, true, false, false, NULL}, - {VK_0, IDM_SEARCH_GONEXTMARKER_DEF, true, false, false, NULL} + {VK_1, IDM_SEARCH_GONEXTMARKER1, true, false, false, nullptr}, + {VK_2, IDM_SEARCH_GONEXTMARKER2, true, false, false, nullptr}, + {VK_3, IDM_SEARCH_GONEXTMARKER3, true, false, false, nullptr}, + {VK_4, IDM_SEARCH_GONEXTMARKER4, true, false, false, nullptr}, + {VK_5, IDM_SEARCH_GONEXTMARKER5, true, false, false, nullptr}, + {VK_0, IDM_SEARCH_GONEXTMARKER_DEF, true, false, false, nullptr} }; -ScintillaKeyDefinition scintKeyDefs[] = { //array of accelerator keys for all possible scintilla functions, values can be 0 for vKey, which means its unused + + +/*! +** \brief array of accelerator keys for all possible scintilla functions +** +** values can be 0 for vKey, which means its unused +*/ +static const ScintillaKeyDefinition scintKeyDefs[] = +{ {TEXT("SCI_CUT"), SCI_CUT, true, false, false, VK_X, IDM_EDIT_CUT}, {TEXT(""), SCI_CUT, false, false, true, VK_DELETE, 0}, {TEXT("SCI_COPY"), SCI_COPY, true, false, false, VK_C, IDM_EDIT_COPY}, From f2bb34ccb271ef780fc3c6d1574b05ff6d9c19b4 Mon Sep 17 00:00:00 2001 From: Damien GERARD Date: Fri, 14 Aug 2015 23:32:23 +0200 Subject: [PATCH 41/85] Code simplification --- PowerEditor/src/MISC/Common/Common.cpp | 5 +- PowerEditor/src/Parameters.cpp | 526 +++++++++--------- PowerEditor/src/ScitillaComponent/Buffer.cpp | 13 +- .../src/ScitillaComponent/FindReplaceDlg.cpp | 14 +- .../WinControls/ContextMenu/ContextMenu.cpp | 12 +- .../src/WinControls/ContextMenu/ContextMenu.h | 54 +- .../WinControls/DockingWnd/DockingCont.cpp | 2 +- .../DockingWnd/DockingDlgInterface.h | 51 +- .../FunctionList/functionParser.cpp | 49 +- .../WinControls/FunctionList/functionParser.h | 68 ++- 10 files changed, 393 insertions(+), 401 deletions(-) diff --git a/PowerEditor/src/MISC/Common/Common.cpp b/PowerEditor/src/MISC/Common/Common.cpp index 57de62a3a..93a0d1521 100644 --- a/PowerEditor/src/MISC/Common/Common.cpp +++ b/PowerEditor/src/MISC/Common/Common.cpp @@ -96,7 +96,7 @@ char getDriveLetter() generic_string relativeFilePathToFullFilePath(const TCHAR *relativeFilePath) { - generic_string fullFilePathName = TEXT(""); + generic_string fullFilePathName; TCHAR fullFileName[MAX_PATH]; BOOL isRelative = ::PathIsRelative(relativeFilePath); @@ -203,8 +203,9 @@ void folderBrowser(HWND parent, int outputCtrlID, const TCHAR *defaultStr) generic_string getFolderName(HWND parent, const TCHAR *defaultDir) { - generic_string folderName(TEXT("")); + generic_string folderName; LPMALLOC pShellMalloc = 0; + if (::SHGetMalloc(&pShellMalloc) == NO_ERROR) { BROWSEINFO info; diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp index 54cb40535..09716f9a5 100644 --- a/PowerEditor/src/Parameters.cpp +++ b/PowerEditor/src/Parameters.cpp @@ -483,7 +483,7 @@ static const ScintillaKeyDefinition scintKeyDefs[] = }; - +typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); @@ -533,6 +533,92 @@ namespace // anonymous namespace return -1; } + + static inline size_t getAsciiLenFromBase64Len(size_t base64StrLen) + { + return (base64StrLen % 4) ? 0 : (base64StrLen - base64StrLen / 4); + } + + + static int base64ToAscii(char *dest, const char *base64Str) + { + static const int base64IndexArray[123] = + { + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 62, -1, -1, -1, 63, + 52, 53, 54, 55 ,56, 57, 58, 59, + 60, 61, -1, -1, -1, -1, -1, -1, + -1, 0, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, -1, -1, -1, -1 ,-1, + -1, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51 + }; + + size_t b64StrLen = strlen(base64Str); + size_t nbLoop = b64StrLen / 4; + + size_t i = 0; + int k = 0; + + enum {b64_just, b64_1padded, b64_2padded} padd = b64_just; + for ( ; i < nbLoop ; i++) + { + size_t j = i * 4; + UCHAR uc0, uc1, uc2, uc3, p0, p1; + + uc0 = (UCHAR)base64IndexArray[base64Str[j]]; + uc1 = (UCHAR)base64IndexArray[base64Str[j+1]]; + uc2 = (UCHAR)base64IndexArray[base64Str[j+2]]; + uc3 = (UCHAR)base64IndexArray[base64Str[j+3]]; + + if ((uc0 == -1) || (uc1 == -1) || (uc2 == -1) || (uc3 == -1)) + return -1; + + if (base64Str[j+2] == '=') // && (uc3 == '=') + { + uc2 = uc3 = 0; + padd = b64_2padded; + } + else if (base64Str[j+3] == '=') + { + uc3 = 0; + padd = b64_1padded; + } + + p0 = uc0 << 2; + p1 = uc1 << 2; + p1 >>= 6; + dest[k++] = p0 | p1; + + p0 = uc1 << 4; + p1 = uc2 << 2; + p1 >>= 4; + dest[k++] = p0 | p1; + + p0 = uc2 << 6; + p1 = uc3; + dest[k++] = p0 | p1; + } + + //dest[k] = '\0'; + if (padd == b64_1padded) + // dest[k-1] = '\0'; + return k-1; + else if (padd == b64_2padded) + // dest[k-2] = '\0'; + return k-2; + + return k; + } + } // anonymous namespace @@ -540,32 +626,72 @@ namespace // anonymous namespace -wstring LocalizationSwitcher::getLangFromXmlFileName(const wchar_t *fn) const + +void cutString(const TCHAR* str2cut, vector& patternVect) +{ + TCHAR str2scan[MAX_PATH]; + lstrcpy(str2scan, str2cut); + size_t len = lstrlen(str2scan); + bool isProcessing = false; + TCHAR *pBegin = nullptr; + + for (size_t i = 0 ; i <= len ; ++i) + { + switch(str2scan[i]) + { + case ' ': + case '\0': + { + if (isProcessing) + { + str2scan[i] = '\0'; + patternVect.push_back(pBegin); + isProcessing = false; + } + break; + } + + default: + { + if (!isProcessing) + { + isProcessing = true; + pBegin = str2scan+i; + } + } + } + } +} + + +std::wstring LocalizationSwitcher::getLangFromXmlFileName(const wchar_t *fn) const { size_t nbItem = sizeof(localizationDefs)/sizeof(LocalizationSwitcher::LocalizationDefinition); for (size_t i = 0 ; i < nbItem ; ++i) { - if (wcsicmp(fn, localizationDefs[i]._xmlFileName) == 0) + if (0 == wcsicmp(fn, localizationDefs[i]._xmlFileName)) return localizationDefs[i]._langName; } - return TEXT(""); + return std::wstring(); } -wstring LocalizationSwitcher::getXmlFilePathFromLangName(const wchar_t *langName) const + +std::wstring LocalizationSwitcher::getXmlFilePathFromLangName(const wchar_t *langName) const { for (size_t i = 0, len = _localizationList.size(); i < len ; ++i) { - if (wcsicmp(langName, _localizationList[i].first.c_str()) == 0) + if (0 == wcsicmp(langName, _localizationList[i].first.c_str())) return _localizationList[i].second; } - return TEXT(""); + return std::wstring(); } + bool LocalizationSwitcher::addLanguageFromXml(wstring xmlFullPath) { wchar_t * fn = ::PathFindFileNameW(xmlFullPath.c_str()); wstring foundLang = getLangFromXmlFileName(fn); - if (foundLang != TEXT("")) + if (not foundLang.empty()) { _localizationList.push_back(pair(foundLang, xmlFullPath)); return true; @@ -573,10 +699,11 @@ bool LocalizationSwitcher::addLanguageFromXml(wstring xmlFullPath) return false; } + bool LocalizationSwitcher::switchToLang(wchar_t *lang2switch) const { wstring langPath = getXmlFilePathFromLangName(lang2switch); - if (langPath == TEXT("")) + if (langPath.empty()) return false; return ::CopyFileW(langPath.c_str(), _nativeLangPath.c_str(), FALSE) != FALSE; @@ -586,13 +713,12 @@ bool LocalizationSwitcher::switchToLang(wchar_t *lang2switch) const generic_string ThemeSwitcher::getThemeFromXmlFileName(const TCHAR *xmlFullPath) const { if (!xmlFullPath || !xmlFullPath[0]) - return TEXT(""); + return generic_string(); generic_string fn(::PathFindFileName(xmlFullPath)); PathRemoveExtension((TCHAR *)fn.c_str()); - return fn.c_str(); + return fn; } -typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); #pragma warning(disable : 4996) @@ -619,86 +745,75 @@ winVer getWindowsVersion() pGNSI(&si); else GetSystemInfo(&si); - //printInt(osvi.dwMajorVersion); - //printInt(osvi.dwMinorVersion); + switch (osvi.dwPlatformId) { case VER_PLATFORM_WIN32_NT: { - if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 3 ) - { + if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 3) return WV_WIN81; - } - if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 2 ) - { + if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 2) return WV_WIN8; - } - if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1 ) - { + if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 1) return WV_WIN7; - } - if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 ) - { + if (osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0) return WV_VISTA; - } - if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 ) + if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2) { - if (osvi.wProductType == VER_NT_WORKSTATION && - si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64) - { + if (osvi.wProductType == VER_NT_WORKSTATION && si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64) return WV_XPX64; - } return WV_S2003; } - if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) + if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1) return WV_XP; - if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) + if (osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0) return WV_W2K; - if ( osvi.dwMajorVersion <= 4 ) + if (osvi.dwMajorVersion <= 4) return WV_NT; + break; } - break; // Test for the Windows Me/98/95. case VER_PLATFORM_WIN32_WINDOWS: { if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 0) - { return WV_95; - } if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 10) - { return WV_98; - } if (osvi.dwMajorVersion == 4 && osvi.dwMinorVersion == 90) - { return WV_ME; - } + break; } - break; - case VER_PLATFORM_WIN32s: - return WV_WIN32S; + case VER_PLATFORM_WIN32s: + return WV_WIN32S; - default : - return WV_UNKNOWN; + default: + return WV_UNKNOWN; } + return WV_UNKNOWN; } + NppParameters * NppParameters::_pSelf = new NppParameters; + int FileDialog::_dialogFileBoxId = (NppParameters::getInstance())->getWinVersion() < WV_W2K?edt1:cmb13; + + + + NppParameters::NppParameters() : _pXmlDoc(NULL),_pXmlUserDoc(NULL), _pXmlUserStylerDoc(NULL),_pXmlUserLangDoc(NULL),\ _pXmlNativeLangDocA(NULL), _nbLang(0), _pXmlToolIconsDoc(NULL), _nbRecentFile(0),\ _nbMaxRecentFile(10), _recentFileCustomLength(RECENTFILES_SHOWFULLPATH),\ @@ -706,14 +821,12 @@ NppParameters::NppParameters() : _pXmlDoc(NULL),_pXmlUserDoc(NULL), _pXmlUserSty _pXmlSessionDoc(NULL), _pXmlBlacklistDoc(NULL), _nbUserLang(0), _nbExternalLang(0),\ _hUXTheme(NULL), _transparentFuncAddr(NULL), _enableThemeDialogTextureFuncAddr(NULL),\ _pNativeLangSpeaker(NULL), _isTaskListRBUTTONUP_Active(false), _fileSaveDlgFilterIndex(-1),\ - _asNotepadStyle(false), _isFindReplacing(false), _initialCloudChoice(TEXT("")) + _asNotepadStyle(false), _isFindReplacing(false) { // init import UDL array _nbImportedULD = 0; for (int i = 0 ; i < NB_MAX_IMPORTED_UDL ; ++i) - { - _importedULD[i] = NULL; - } + _importedULD[i] = nullptr; //Get windows version _winVersion = getWindowsVersion(); @@ -730,7 +843,7 @@ NppParameters::NppParameters() : _pXmlDoc(NULL),_pXmlUserDoc(NULL), _pXmlUserSty ::GetCurrentDirectory(MAX_PATH, curDir); _currentDirectory = curDir; - _appdataNppDir = TEXT(""); + _appdataNppDir.clear(); generic_string notepadStylePath(_nppPath); PathAppend(notepadStylePath, notepadStyleFile); @@ -741,6 +854,7 @@ NppParameters::NppParameters() : _pXmlDoc(NULL),_pXmlUserDoc(NULL), _pXmlUserSty initScintillaKeys(); } + NppParameters::~NppParameters() { for (int i = 0 ; i < _nbLang ; ++i) @@ -753,44 +867,11 @@ NppParameters::~NppParameters() FreeLibrary(_hUXTheme); for (std::vector::iterator it = _pXmlExternalLexerDoc.begin(), end = _pXmlExternalLexerDoc.end(); it != end; ++it ) - { delete (*it); - } + _pXmlExternalLexerDoc.clear(); } -void cutString(const TCHAR *str2cut, vector & patternVect) -{ - TCHAR str2scan[MAX_PATH]; - lstrcpy(str2scan, str2cut); - size_t len = lstrlen(str2scan); - bool isProcessing = false; - TCHAR *pBegin = NULL; - for (size_t i = 0 ; i <= len ; ++i) - { - switch(str2scan[i]) - { - case ' ': - case '\0': - { - if (isProcessing) - { - str2scan[i] = '\0'; - patternVect.push_back(pBegin); - isProcessing = false; - } - break; - } - - default : - if (!isProcessing) - { - isProcessing = true; - pBegin = str2scan+i; - } - } - } -} bool NppParameters::reloadStylers(TCHAR *stylePath) { @@ -842,124 +923,37 @@ bool NppParameters::reloadLang() if (!loadOkay) { delete _pXmlNativeLangDocA; - _pXmlNativeLangDocA = NULL; + _pXmlNativeLangDocA = nullptr; return false; } return loadOkay; } -size_t getAsciiLenFromBase64Len(size_t base64StrLen) -{ - if (base64StrLen % 4) return 0; - return base64StrLen - base64StrLen / 4; -} - -int base64ToAscii(char *dest, const char *base64Str) -{ - int base64IndexArray[123] =\ - {\ - -1, -1, -1, -1, -1, -1, -1, -1,\ - -1, -1, -1, -1, -1, -1, -1, -1,\ - -1, -1, -1, -1, -1, -1, -1, -1,\ - -1, -1, -1, -1, -1, -1, -1, -1,\ - -1, -1, -1, -1, -1, -1, -1, -1,\ - -1, -1, -1, 62, -1, -1, -1, 63,\ - 52, 53, 54, 55 ,56, 57, 58, 59,\ - 60, 61, -1, -1, -1, -1, -1, -1,\ - -1, 0, 1, 2, 3, 4, 5, 6,\ - 7, 8, 9, 10, 11, 12, 13, 14,\ - 15, 16, 17, 18, 19, 20, 21, 22,\ - 23, 24, 25, -1, -1, -1, -1 ,-1,\ - -1, 26, 27, 28, 29, 30, 31, 32,\ - 33, 34, 35, 36, 37, 38, 39, 40,\ - 41, 42, 43, 44, 45, 46, 47, 48,\ - 49, 50, 51\ - }; - - size_t b64StrLen = strlen(base64Str); - size_t nbLoop = b64StrLen / 4; - - size_t i = 0; - int k = 0; - - enum {b64_just, b64_1padded, b64_2padded} padd = b64_just; - for ( ; i < nbLoop ; i++) - { - size_t j = i * 4; - UCHAR uc0, uc1, uc2, uc3, p0, p1; - - uc0 = (UCHAR)base64IndexArray[base64Str[j]]; - uc1 = (UCHAR)base64IndexArray[base64Str[j+1]]; - uc2 = (UCHAR)base64IndexArray[base64Str[j+2]]; - uc3 = (UCHAR)base64IndexArray[base64Str[j+3]]; - - if ((uc0 == -1) || (uc1 == -1) || (uc2 == -1) || (uc3 == -1)) - return -1; - - if (base64Str[j+2] == '=') // && (uc3 == '=') - { - uc2 = uc3 = 0; - padd = b64_2padded; - } - else if (base64Str[j+3] == '=') - { - uc3 = 0; - padd = b64_1padded; - } - p0 = uc0 << 2; - p1 = uc1 << 2; - p1 >>= 6; - dest[k++] = p0 | p1; - - p0 = uc1 << 4; - p1 = uc2 << 2; - p1 >>= 4; - dest[k++] = p0 | p1; - - p0 = uc2 << 6; - p1 = uc3; - dest[k++] = p0 | p1; - } - - //dest[k] = '\0'; - if (padd == b64_1padded) - // dest[k-1] = '\0'; - return k-1; - else if (padd == b64_2padded) - // dest[k-2] = '\0'; - return k-2; - - return k; -} generic_string NppParameters::getSettingsFolder() { - generic_string settingsFolderPath; if (_isLocal) - { return _nppPath; - } - else - { - ITEMIDLIST *pidl; - const HRESULT specialLocationResult = SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl); - if ( !SUCCEEDED( specialLocationResult ) ) - { - return TEXT( "" ); - } - TCHAR tmp[MAX_PATH]; - SHGetPathFromIDList(pidl, tmp); - generic_string settingsFolderPath = tmp; - PathAppend(settingsFolderPath, TEXT("Notepad++")); - return settingsFolderPath; - } + + ITEMIDLIST *pidl; + const HRESULT specialLocationResult = SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl); + if (!SUCCEEDED( specialLocationResult)) + return generic_string(); + + TCHAR tmp[MAX_PATH]; + SHGetPathFromIDList(pidl, tmp); + generic_string settingsFolderPath{tmp}; + PathAppend(settingsFolderPath, TEXT("Notepad++")); + return settingsFolderPath; } + bool NppParameters::load() { L_END = L_EXTERNAL; bool isAllLaoded = true; - for (int i = 0 ; i < NB_LANG ; _langList[i] = NULL, ++i); + for (int i = 0 ; i < NB_LANG ; _langList[i] = NULL, ++i) + {} // Make localConf.xml path generic_string localConfPath(_nppPath); @@ -977,10 +971,9 @@ bool NppParameters::load() { ITEMIDLIST *pidl; const HRESULT specialLocationResult = SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAM_FILES, &pidl); - if ( !SUCCEEDED( specialLocationResult ) ) - { + if (!SUCCEEDED( specialLocationResult)) return false; - } + TCHAR progPath[MAX_PATH]; SHGetPathFromIDList(pidl, progPath); TCHAR nppDirLocation[MAX_PATH]; @@ -1000,10 +993,9 @@ bool NppParameters::load() { ITEMIDLIST *pidl; const HRESULT specialLocationResult = SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl); - if ( !SUCCEEDED( specialLocationResult ) ) - { + if (!SUCCEEDED( specialLocationResult)) return false; - } + TCHAR tmp[MAX_PATH]; SHGetPathFromIDList(pidl, tmp); _userPath = tmp; @@ -1012,15 +1004,13 @@ bool NppParameters::load() _appdataNppDir = _userPath; if (!PathFileExists(_userPath.c_str())) - { ::CreateDirectory(_userPath.c_str(), NULL); - } } _sessionPath = _userPath; // Session stock the absolute file path, it should never be on cloud // Detection cloud settings - generic_string cloudChoicePath = _userPath; + generic_string cloudChoicePath{_userPath}; cloudChoicePath += TEXT("\\cloud\\choice"); // cloudChoicePath doesn't exist, just quit @@ -1031,7 +1021,7 @@ bool NppParameters::load() WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); std::wstring cloudChoiceStrW = wmc->char2wchar(cloudChoiceStr.c_str(), SC_CP_UTF8); - if (cloudChoiceStrW != TEXT("") && ::PathFileExists(cloudChoiceStrW.c_str())) + if (not cloudChoiceStrW.empty() and ::PathFileExists(cloudChoiceStrW.c_str())) { _userPath = cloudChoiceStrW; _nppGUI._cloudPath = cloudChoiceStrW; @@ -1087,7 +1077,7 @@ bool NppParameters::load() { ::MessageBox(NULL, TEXT("Load langs.xml failed!"), TEXT("Configurator"),MB_OK); delete _pXmlDoc; - _pXmlDoc = NULL; + _pXmlDoc = nullptr; isAllLaoded = false; } else @@ -1150,10 +1140,8 @@ bool NppParameters::load() ::CopyFile(srcStylersPath.c_str(), _stylerPath.c_str(), TRUE); } - if ( _nppGUI._themeName.empty() || (!PathFileExists(_nppGUI._themeName.c_str())) ) - { + if (_nppGUI._themeName.empty() || (!PathFileExists(_nppGUI._themeName.c_str()))) _nppGUI._themeName.assign(_stylerPath); - } _pXmlUserStylerDoc = new TiXmlDocument(_nppGUI._themeName.c_str()); @@ -1183,7 +1171,7 @@ bool NppParameters::load() if (!loadOkay) { delete _pXmlUserLangDoc; - _pXmlUserLangDoc = NULL; + _pXmlUserLangDoc = nullptr; isAllLaoded = false; } else @@ -1202,7 +1190,7 @@ bool NppParameters::load() // LocalizationSwitcher should use always user path _localizationSwitcher._nativeLangPath = nativeLangPath; - if (_startWithLocFileName != TEXT("")) // localization argument detected, use user wished localization + if (not _startWithLocFileName.empty()) // localization argument detected, use user wished localization { // overwrite nativeLangPath variable nativeLangPath = _nppPath; @@ -1225,7 +1213,7 @@ bool NppParameters::load() if (!loadOkay) { delete _pXmlNativeLangDocA; - _pXmlNativeLangDocA = NULL; + _pXmlNativeLangDocA = nullptr; isAllLaoded = false; } @@ -1240,7 +1228,7 @@ bool NppParameters::load() if (!loadOkay) { delete _pXmlToolIconsDoc; - _pXmlToolIconsDoc = NULL; + _pXmlToolIconsDoc = nullptr; isAllLaoded = false; } @@ -1263,7 +1251,7 @@ bool NppParameters::load() if (!loadOkay) { delete _pXmlShortcutDoc; - _pXmlShortcutDoc = NULL; + _pXmlShortcutDoc = nullptr; isAllLaoded = false; } else @@ -1296,7 +1284,7 @@ bool NppParameters::load() if (!loadOkay) { delete _pXmlContextMenuDocA; - _pXmlContextMenuDocA = NULL; + _pXmlContextMenuDocA = nullptr; isAllLaoded = false; } @@ -1311,6 +1299,7 @@ bool NppParameters::load() if (nppGUI._rememberLastSession) { _pXmlSessionDoc = new TiXmlDocument(_sessionPath); + loadOkay = _pXmlSessionDoc->LoadFile(); if (!loadOkay) isAllLaoded = false; @@ -1322,7 +1311,7 @@ bool NppParameters::load() if (_pXmlExternalLexerDoc[i]) delete _pXmlExternalLexerDoc[i]; - _pXmlSessionDoc = NULL; + _pXmlSessionDoc = nullptr; } //------------------------------// @@ -1336,59 +1325,34 @@ bool NppParameters::load() _pXmlBlacklistDoc = new TiXmlDocument(_blacklistPath); loadOkay = _pXmlBlacklistDoc->LoadFile(); if (loadOkay) - { getBlackListFromXmlTree(); - } } return isAllLaoded; } + void NppParameters::destroyInstance() { - if (_pXmlDoc != NULL) - { - delete _pXmlDoc; - } - - if (_pXmlUserDoc != NULL) - { - delete _pXmlUserDoc; - } - if (_pXmlUserStylerDoc) - delete _pXmlUserStylerDoc; - - if (_pXmlUserLangDoc) - { - delete _pXmlUserLangDoc; - } + delete _pXmlDoc; + delete _pXmlUserDoc; + delete _pXmlUserStylerDoc; + delete _pXmlUserLangDoc; for (int i = 0 ; i < _nbImportedULD ; ++i) { delete _importedULD[i]; - _importedULD[i] = NULL; + _importedULD[i] = nullptr; } _nbImportedULD = 0; - if (_pXmlNativeLangDocA) - delete _pXmlNativeLangDocA; - - if (_pXmlToolIconsDoc) - delete _pXmlToolIconsDoc; - - if (_pXmlShortcutDoc) - delete _pXmlShortcutDoc; - - if (_pXmlContextMenuDocA) - delete _pXmlContextMenuDocA; - - if (_pXmlSessionDoc) - delete _pXmlSessionDoc; - - if (_pXmlBlacklistDoc) - delete _pXmlBlacklistDoc; - + delete _pXmlNativeLangDocA; + delete _pXmlToolIconsDoc; + delete _pXmlShortcutDoc; + delete _pXmlContextMenuDocA; + delete _pXmlSessionDoc; + delete _pXmlBlacklistDoc; delete _pSelf; - _pSelf = NULL; + _pSelf = nullptr; } @@ -1416,15 +1380,15 @@ void NppParameters::removeTransparent(HWND hwnd) void NppParameters::SetTransparent(HWND hwnd, int percent) { - if (!_transparentFuncAddr) - return; - - ::SetWindowLongPtr(hwnd, GWL_EXSTYLE, ::GetWindowLongPtr(hwnd, GWL_EXSTYLE) | 0x00080000); - if (percent > 255) - percent = 255; - if (percent < 0) - percent = 0; - _transparentFuncAddr(hwnd, 0, percent, 0x00000002); + if (nullptr != _transparentFuncAddr) + { + ::SetWindowLongPtr(hwnd, GWL_EXSTYLE, ::GetWindowLongPtr(hwnd, GWL_EXSTYLE) | 0x00080000); + if (percent > 255) + percent = 255; + if (percent < 0) + percent = 0; + _transparentFuncAddr(hwnd, 0, percent, 0x00000002); + } } @@ -1529,6 +1493,7 @@ static int CALLBACK EnumFontFamExProc(const LOGFONT* lpelfe, const TEXTMETRIC*, return 1; // I want to get all fonts } + void NppParameters::setFontList(HWND hWnd) { //---------------// @@ -1536,7 +1501,8 @@ void NppParameters::setFontList(HWND hWnd) //---------------// LOGFONT lf; _fontlist.clear(); - _fontlist.push_back(TEXT("")); + _fontlist.reserve(64); // arbitrary + _fontlist.push_back(generic_string()); lf.lfCharSet = DEFAULT_CHARSET; lf.lfFaceName[0]='\0'; @@ -1545,6 +1511,7 @@ void NppParameters::setFontList(HWND hWnd) ::EnumFontFamiliesEx(hDC, &lf, EnumFontFamExProc, (LPARAM)&_fontlist, 0); } + void NppParameters::getLangKeywordsFromXmlTree() { TiXmlNode *root = @@ -1553,6 +1520,7 @@ void NppParameters::getLangKeywordsFromXmlTree() feedKeyWordsParameters(root); } + void NppParameters::getExternalLexerFromXmlTree(TiXmlDocument *doc) { TiXmlNode *root = doc->FirstChild(TEXT("NotepadPlus")); @@ -1561,6 +1529,7 @@ void NppParameters::getExternalLexerFromXmlTree(TiXmlDocument *doc) feedStylerArray(root); } + int NppParameters::addExternalLangToEnd(ExternalLangContainer * externalLang) { _externalLangArray[_nbExternalLang] = externalLang; @@ -1569,6 +1538,7 @@ int NppParameters::addExternalLangToEnd(ExternalLangContainer * externalLang) return _nbExternalLang-1; } + bool NppParameters::getUserStylersFromXmlTree() { TiXmlNode *root = _pXmlUserStylerDoc->FirstChild(TEXT("NotepadPlus")); @@ -1576,13 +1546,15 @@ bool NppParameters::getUserStylersFromXmlTree() return feedStylerArray(root); } + bool NppParameters::getUserParametersFromXmlTree() { if (!_pXmlUserDoc) return false; TiXmlNode *root = _pXmlUserDoc->FirstChild(TEXT("NotepadPlus")); - if (!root) return false; + if (nullptr == root) + return false; // Get GUI parameters feedGUIParameters(root); @@ -1607,6 +1579,7 @@ bool NppParameters::getUserParametersFromXmlTree() return true; } + bool NppParameters::getUserDefineLangsFromXmlTree(TiXmlDocument *tixmldoc) { if (!tixmldoc) @@ -1634,6 +1607,7 @@ bool NppParameters::getShortcutsFromXmlTree() return true; } + bool NppParameters::getMacrosFromXmlTree() { if (!_pXmlShortcutDoc) @@ -1647,6 +1621,7 @@ bool NppParameters::getMacrosFromXmlTree() return true; } + bool NppParameters::getUserCmdsFromXmlTree() { if (!_pXmlShortcutDoc) @@ -1872,7 +1847,7 @@ bool NppParameters::getContextMenuFromXmlTree(HMENU mainMenuHadle, HMENU plugins menuEntryName = menuEntryNameA?wmc->char2wchar(menuEntryNameA, SC_CP_UTF8):TEXT(""); menuItemName = menuItemNameA?wmc->char2wchar(menuItemNameA, SC_CP_UTF8):TEXT(""); - if (menuEntryName != TEXT("") && menuItemName != TEXT("")) + if (not menuEntryName.empty() and not menuItemName.empty()) { int cmd = getCmdIdFromMenuEntryItemName(mainMenuHadle, menuEntryName, menuItemName); if (cmd != -1) @@ -1889,7 +1864,7 @@ bool NppParameters::getContextMenuFromXmlTree(HMENU mainMenuHadle, HMENU plugins pluginCmdName = pluginCmdNameA?wmc->char2wchar(pluginCmdNameA, SC_CP_UTF8):TEXT(""); // if plugin menu existing plls the value of PluginEntryName and PluginCommandItemName are valid - if (pluginsMenu && pluginName != TEXT("") && pluginCmdName != TEXT("")) + if (pluginsMenu && not pluginName.empty() && not pluginCmdName.empty()) { int pluginCmdId = getPluginCmdIdFromMenuEntryItemName(pluginsMenu, pluginName, pluginCmdName); if (pluginCmdId != -1) @@ -1902,6 +1877,7 @@ bool NppParameters::getContextMenuFromXmlTree(HMENU mainMenuHadle, HMENU plugins return true; } + void NppParameters::setWorkingDir(const TCHAR * newPath) { if (newPath && newPath[0]) @@ -1911,16 +1887,13 @@ void NppParameters::setWorkingDir(const TCHAR * newPath) else { if (PathFileExists(_nppGUI._defaultDirExp)) - { _currentDirectory = _nppGUI._defaultDirExp; - } else - { _currentDirectory = _nppPath.c_str(); - } } } + bool NppParameters::loadSession(Session & session, const TCHAR *sessionFileName) { TiXmlDocument *pXmlSessionDocument = new TiXmlDocument(sessionFileName); @@ -1932,6 +1905,7 @@ bool NppParameters::loadSession(Session & session, const TCHAR *sessionFileName) return loadOkay; } + bool NppParameters::getSessionFromXmlTree(TiXmlDocument *pSessionDoc, Session *pSession) { if ((pSessionDoc) && (!pSession)) @@ -2591,9 +2565,10 @@ LangType NppParameters::getLangFromExt(const TCHAR *ext) if (pLS) userList = pLS->getLexerUserExt(); - generic_string list(TEXT("")); + generic_string list; if (defList) list += defList; + if (userList) { list += TEXT(" "); @@ -2662,10 +2637,8 @@ bool NppParameters::writeSettingsFilesOnCloudForThe1stTime(const generic_string { bool isOK = false; - if (cloudSettingsPath == TEXT("")) - { + if (cloudSettingsPath.empty()) return false; - } // config.xml generic_string cloudConfigPath = cloudSettingsPath; @@ -3110,7 +3083,7 @@ void NppParameters::feedUserKeywordList(TiXmlNode *node) { if (!lstrcmp(udlVersion, TEXT("")) && !lstrcmp(keywordsName, TEXT("Delimiters"))) // support for old style (pre 2.0) { - basic_string temp = TEXT(""); + basic_string temp; kwl = (valueNode)?valueNode->Value():TEXT("000000"); temp += TEXT("00"); if (kwl[0] != '0') temp += kwl[0]; temp += TEXT(" 01"); @@ -3127,7 +3100,7 @@ void NppParameters::feedUserKeywordList(TiXmlNode *node) { kwl = (valueNode)?valueNode->Value():TEXT(""); //int len = _tcslen(kwl); - basic_string temp = TEXT(" "); + basic_string temp{TEXT(" ")}; temp += kwl; size_t pos = 0; @@ -3604,14 +3577,15 @@ generic_string NppParameters::getLocPathFromStr(const generic_string & localizat if (localizationCode == TEXT("uz")) return TEXT("uzbek.xml"); - return TEXT(""); + return generic_string(); } + void NppParameters::feedKeyWordsParameters(TiXmlNode *node) { - TiXmlNode *langRoot = node->FirstChildElement(TEXT("Languages")); - if (!langRoot) return; + if (!langRoot) + return; for (TiXmlNode *langNode = langRoot->FirstChildElement(TEXT("Language")); langNode ; @@ -5310,7 +5284,7 @@ bool NppParameters::writeGUIParams() pStr = _nppGUI._matchedPairConf._doHtmlXmlTag?TEXT("yes"):TEXT("no"); element->SetAttribute(TEXT("htmlXmlTag"), pStr); - TiXmlElement hist_element(TEXT("")); + TiXmlElement hist_element{TEXT("")}; hist_element.SetValue(TEXT("UserDefinePair")); // remove all old sub-nodes @@ -5566,7 +5540,7 @@ bool NppParameters::writeGUIParams() GUIConfigElement->SetAttribute(TEXT("doubleQuotes"), _nppGUI._matchedPairConf._doDoubleQuotes?TEXT("yes"):TEXT("no")); GUIConfigElement->SetAttribute(TEXT("htmlXmlTag"), _nppGUI._matchedPairConf._doHtmlXmlTag?TEXT("yes"):TEXT("no")); - TiXmlElement hist_element(TEXT("")); + TiXmlElement hist_element{TEXT("")}; hist_element.SetValue(TEXT("UserDefinePair")); for (size_t i = 0, nb = _nppGUI._matchedPairConf._matchedPairs.size(); i < nb; ++i) { @@ -5698,7 +5672,7 @@ bool NppParameters::writeFindHistory() (findHistoryRoot->ToElement())->SetAttribute(TEXT("transparency"), _findHistory._transparency); (findHistoryRoot->ToElement())->SetAttribute(TEXT("dotMatchesNewline"), _findHistory._dotMatchesNewline?TEXT("yes"):TEXT("no")); - TiXmlElement hist_element(TEXT("")); + TiXmlElement hist_element{TEXT("")}; hist_element.SetValue(TEXT("Path")); for (size_t i = 0, len = _findHistory._findHistoryPaths.size(); i < len; ++i) @@ -6203,7 +6177,7 @@ void NppParameters::insertUserLang2Tree(TiXmlNode *node, UserLangContainer *user TiXmlElement *rootElement = (node->InsertEndChild(TiXmlElement(TEXT("UserLang"))))->ToElement(); TCHAR temp[32]; - generic_string udlVersion = TEXT(""); + generic_string udlVersion; udlVersion += generic_itoa(SCE_UDL_VERSION_MAJOR, temp, 10); udlVersion += TEXT("."); udlVersion += generic_itoa(SCE_UDL_VERSION_MINOR, temp, 10); diff --git a/PowerEditor/src/ScitillaComponent/Buffer.cpp b/PowerEditor/src/ScitillaComponent/Buffer.cpp index 3354c40cc..2ef011ed1 100644 --- a/PowerEditor/src/ScitillaComponent/Buffer.cpp +++ b/PowerEditor/src/ScitillaComponent/Buffer.cpp @@ -923,11 +923,11 @@ bool FileManager::backupCurrentBuffer() else // buffer not dirty, sync: delete the backup file { generic_string backupFilePath = buffer->getBackupFileName(); - if (backupFilePath != TEXT("")) + if (not backupFilePath.empty()) { // delete backup file generic_string file2Delete = buffer->getBackupFileName(); - buffer->setBackupFileName(TEXT("")); + buffer->setBackupFileName(generic_string()); result = (::DeleteFile(file2Delete.c_str()) != 0); // Session changes, save it @@ -993,7 +993,7 @@ bool FileManager::deleteCurrentBufferBackup() if (not backupFilePath.empty()) { // delete backup file - buffer->setBackupFileName(TEXT("")); + buffer->setBackupFileName(generic_string()); result = (::DeleteFile(backupFilePath.c_str()) != 0); } @@ -1001,6 +1001,7 @@ bool FileManager::deleteCurrentBufferBackup() return result; } + bool FileManager::saveBuffer(BufferID id, const TCHAR * filename, bool isCopy, generic_string * error_msg) { HANDLE writeEvent = ::OpenEvent(EVENT_ALL_ACCESS, TRUE, TEXT("nppWrittingEvent")); @@ -1115,11 +1116,11 @@ bool FileManager::saveBuffer(BufferID id, const TCHAR * filename, bool isCopy, g /* for saveAs it's not necessary since this action is for the "current" directory, so we let manage in SAVEPOINTREACHED event generic_string backupFilePath = buffer->getBackupFileName(); - if (backupFilePath != TEXT("")) + if (not backupFilePath.empty()) { // delete backup file generic_string file2Delete = buffer->getBackupFileName(); - buffer->setBackupFileName(TEXT("")); + buffer->setBackupFileName(generic_string()); ::DeleteFile(file2Delete.c_str()); } */ @@ -1140,7 +1141,7 @@ bool FileManager::saveBuffer(BufferID id, const TCHAR * filename, bool isCopy, g if (not backupFilePath.empty()) { // delete backup file - buffer->setBackupFileName(TEXT("")); + buffer->setBackupFileName(generic_string()); ::DeleteFile(backupFilePath.c_str()); } diff --git a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp index 809c62cb6..fb769b6bf 100644 --- a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp +++ b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp @@ -699,12 +699,12 @@ INT_PTR CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM //Single actions case IDCANCEL: (*_ppEditView)->execute(SCI_CALLTIPCANCEL); - setStatusbarMessage(TEXT(""), FSNoMessage); + setStatusbarMessage(generic_string(), FSNoMessage); display(false); break; case IDOK : // Find Next : only for FIND_DLG and REPLACE_DLG { - setStatusbarMessage(TEXT(""), FSNoMessage); + setStatusbarMessage(generic_string(), FSNoMessage); bool isUnicode = (*_ppEditView)->getCurrentBuffer()->getUnicodeMode() != uni8Bit; HWND hFindCombo = ::GetDlgItem(_hSelf, IDFINDWHAT); @@ -2141,7 +2141,7 @@ void FindReplaceDlg::execSavedCommand(int cmd, int intValue, generic_string stri (*_ppEditView)->execute(SCI_ENDUNDOACTION); nppParamInst->_isFindReplacing = false; - generic_string result = TEXT(""); + generic_string result; if (nbReplaced < 0) result = TEXT("Replace All: The regular expression is malformed."); @@ -2161,7 +2161,7 @@ void FindReplaceDlg::execSavedCommand(int cmd, int intValue, generic_string stri case IDCCOUNTALL : { int nbCounted = processAll(ProcessCountAll, _env); - generic_string result = TEXT(""); + generic_string result; if (nbCounted < 0) result = TEXT("Count: The regular expression to search is malformed."); @@ -2182,9 +2182,12 @@ void FindReplaceDlg::execSavedCommand(int cmd, int intValue, generic_string stri nppParamInst->_isFindReplacing = true; int nbMarked = processAll(ProcessMarkAll, _env); nppParamInst->_isFindReplacing = false; - generic_string result = TEXT(""); + generic_string result; + if (nbMarked < 0) + { result = TEXT("Mark: The regular expression to search is malformed."); + } else { TCHAR moreInfo[128]; @@ -2194,6 +2197,7 @@ void FindReplaceDlg::execSavedCommand(int cmd, int intValue, generic_string stri wsprintf(moreInfo, TEXT("%d matches."), nbMarked); result = moreInfo; } + setStatusbarMessage(result, FSMessage); break; } diff --git a/PowerEditor/src/WinControls/ContextMenu/ContextMenu.cpp b/PowerEditor/src/WinControls/ContextMenu/ContextMenu.cpp index e518f705e..a175a8a0c 100644 --- a/PowerEditor/src/WinControls/ContextMenu/ContextMenu.cpp +++ b/PowerEditor/src/WinControls/ContextMenu/ContextMenu.cpp @@ -31,16 +31,17 @@ MenuItemUnit::MenuItemUnit(unsigned long cmdID, const TCHAR *itemName, const TCHAR *parentFolderName) : _cmdID(cmdID) { if (!itemName) - _itemName = TEXT(""); + _itemName.clear(); else _itemName = itemName; if (!parentFolderName) - _parentFolderName = TEXT(""); + _parentFolderName.clear(); else _parentFolderName = parentFolderName; } + ContextMenu::~ContextMenu() { if (isCreated()) @@ -50,6 +51,7 @@ ContextMenu::~ContextMenu() ::DestroyMenu(_hMenu); } } + void ContextMenu::create(HWND hParent, const std::vector & menuItemArray, const HMENU mainMenuHandle) { @@ -57,15 +59,15 @@ void ContextMenu::create(HWND hParent, const std::vector & menuIte _hMenu = ::CreatePopupMenu(); bool lastIsSep = false; HMENU hParentFolder = NULL; - generic_string currentParentFolderStr = TEXT(""); + generic_string currentParentFolderStr; int j = 0; for (size_t i = 0, len = menuItemArray.size(); i < len; ++i) { const MenuItemUnit & item = menuItemArray[i]; - if (item._parentFolderName == TEXT("")) + if (item._parentFolderName.empty()) { - currentParentFolderStr = TEXT(""); + currentParentFolderStr.clear(); hParentFolder = NULL; j = 0; } diff --git a/PowerEditor/src/WinControls/ContextMenu/ContextMenu.h b/PowerEditor/src/WinControls/ContextMenu/ContextMenu.h index 5e58ca5ff..ce8c72bf8 100644 --- a/PowerEditor/src/WinControls/ContextMenu/ContextMenu.h +++ b/PowerEditor/src/WinControls/ContextMenu/ContextMenu.h @@ -24,53 +24,55 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - - -#ifndef CONTEXTMENU_H -#define CONTEXTMENU_H - +#pragma once #include "Common.h" -struct MenuItemUnit { - unsigned long _cmdID; + + +struct MenuItemUnit final +{ + unsigned long _cmdID = 0; generic_string _itemName; generic_string _parentFolderName; - MenuItemUnit() : _cmdID(0), _itemName(TEXT("")), _parentFolderName(TEXT("")){}; - MenuItemUnit(unsigned long cmdID, generic_string itemName, generic_string parentFolderName=TEXT("")) + + MenuItemUnit() = default; + MenuItemUnit(unsigned long cmdID, generic_string itemName, generic_string parentFolderName = generic_string()) : _cmdID(cmdID), _itemName(itemName), _parentFolderName(parentFolderName){}; - MenuItemUnit(unsigned long cmdID, const TCHAR *itemName, const TCHAR *parentFolderName=NULL); + MenuItemUnit(unsigned long cmdID, const TCHAR *itemName, const TCHAR *parentFolderName = nullptr); }; -class ContextMenu { + +class ContextMenu final +{ public: - ContextMenu() : _hParent(NULL), _hMenu(NULL) {}; ~ContextMenu(); void create(HWND hParent, const std::vector & menuItemArray, const HMENU mainMenuHandle = NULL); - bool isCreated() const {return _hMenu != NULL;}; + bool isCreated() const {return _hMenu != NULL;} void display(const POINT & p) const { ::TrackPopupMenu(_hMenu, TPM_LEFTALIGN, p.x, p.y, 0, _hParent, NULL); - }; + } - void enableItem(int cmdID, bool doEnable) const { - int flag = doEnable?MF_ENABLED | MF_BYCOMMAND:MF_DISABLED | MF_GRAYED | MF_BYCOMMAND; + void enableItem(int cmdID, bool doEnable) const + { + int flag = doEnable ? (MF_ENABLED | MF_BYCOMMAND) : (MF_DISABLED | MF_GRAYED | MF_BYCOMMAND); ::EnableMenuItem(_hMenu, cmdID, flag); - }; + } - void checkItem(int cmdID, bool doCheck) const { - ::CheckMenuItem(_hMenu, cmdID, MF_BYCOMMAND | (doCheck?MF_CHECKED:MF_UNCHECKED)); - }; + void checkItem(int cmdID, bool doCheck) const + { + ::CheckMenuItem(_hMenu, cmdID, MF_BYCOMMAND | (doCheck ? MF_CHECKED : MF_UNCHECKED)); + } - HMENU getMenuHandle() { + HMENU getMenuHandle() const + { return _hMenu; - }; + } private: - HWND _hParent; - HMENU _hMenu; + HWND _hParent = NULL; + HMENU _hMenu = NULL; std::vector _subMenus; }; - -#endif //CONTEXTMENU_H diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp b/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp index 97f8c635b..aad3e4bdc 100644 --- a/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp +++ b/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp @@ -1374,7 +1374,7 @@ void DockingCont::SelectTab(int iTab) for (int iItem = 0; iItem < iItemCnt; ++iItem) { - generic_string szText(TEXT("")); + generic_string szText; if (iItem == iTab && pszMaxTxt) { // fake here an icon before text ... diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingDlgInterface.h b/PowerEditor/src/WinControls/DockingWnd/DockingDlgInterface.h index 8c1208d2b..74cb8f33b 100644 --- a/PowerEditor/src/WinControls/DockingWnd/DockingDlgInterface.h +++ b/PowerEditor/src/WinControls/DockingWnd/DockingDlgInterface.h @@ -41,23 +41,28 @@ #include "Common.h" #include "StaticDialog.h" + + class DockingDlgInterface : public StaticDialog { public: - DockingDlgInterface(): StaticDialog(), _HSource(NULL),\ - _dlgID(-1), _isFloating(TRUE), _iDockedPos(0), _pluginName(TEXT("")) {}; + DockingDlgInterface() = default; - DockingDlgInterface(int dlgID): StaticDialog(), _HSource(NULL),\ - _dlgID(dlgID), _isFloating(TRUE), _iDockedPos(0), _pluginName(TEXT("")) {}; + explicit DockingDlgInterface(int dlgID) + : _dlgID(dlgID) + {} - virtual void init(HINSTANCE hInst, HWND parent) { + + virtual void init(HINSTANCE hInst, HWND parent) + { StaticDialog::init(hInst, parent); TCHAR temp[MAX_PATH]; ::GetModuleFileName((HMODULE)hInst, temp, MAX_PATH); _moduleName = ::PathFindFileName(temp); - }; + } - void create(tTbData * data, bool isRTL = false){ + void create(tTbData * data, bool isRTL = false) + { StaticDialog::create(_dlgID, isRTL); TCHAR temp[MAX_PATH]; ::GetWindowText(_hSelf, temp, MAX_PATH); @@ -71,36 +76,34 @@ public: // additional info data->pszAddInfo = NULL; - }; + } - virtual void updateDockingDlg() { + virtual void updateDockingDlg() + { ::SendMessage(_hParent, NPPM_DMMUPDATEDISPINFO, 0, (LPARAM)_hSelf); } - virtual void destroy() { - }; + virtual void destroy() {} - virtual void setBackgroundColor(COLORREF) { - }; + virtual void setBackgroundColor(COLORREF) {} - virtual void setForegroundColor(COLORREF) { - }; + virtual void setForegroundColor(COLORREF) {} virtual void display(bool toShow = true) const { ::SendMessage(_hParent, toShow?NPPM_DMMSHOW:NPPM_DMMHIDE, 0, (LPARAM)_hSelf); - }; + } bool isClosed() const { return _isClosed; - }; + } void setClosed(bool toClose) { _isClosed = toClose; - }; + } const TCHAR * getPluginFileName() const { return _moduleName.c_str(); - }; + } protected : virtual INT_PTR CALLBACK run_dlgProc(UINT message, WPARAM, LPARAM lParam) @@ -144,13 +147,13 @@ protected : }; // Handles - HWND _HSource; - int _dlgID; - bool _isFloating; - int _iDockedPos; + HWND _HSource = NULL; + int _dlgID = -1; + bool _isFloating = true; + int _iDockedPos = 0; generic_string _moduleName; generic_string _pluginName; - bool _isClosed; + bool _isClosed = false; }; #endif // DOCKINGDLGINTERFACE_H diff --git a/PowerEditor/src/WinControls/FunctionList/functionParser.cpp b/PowerEditor/src/WinControls/FunctionList/functionParser.cpp index a015edd6f..6e7aabd36 100644 --- a/PowerEditor/src/WinControls/FunctionList/functionParser.cpp +++ b/PowerEditor/src/WinControls/FunctionList/functionParser.cpp @@ -358,7 +358,7 @@ void FunctionParser::funcParse(std::vector & foundInfos, size_t begin fi._pos = foundPos; } - if (classStructName != TEXT("")) + if (not classStructName.empty()) { fi._data2 = classStructName; fi._pos2 = -1; // change -1 valeur for validated data2 @@ -378,9 +378,7 @@ void FunctionParser::funcParse(std::vector & foundInfos, size_t begin foundInfos.push_back(fi); } else - { foundInfos.push_back(fi); - } } begin = targetStart + foundTextLen; @@ -388,16 +386,17 @@ void FunctionParser::funcParse(std::vector & foundInfos, size_t begin } } + generic_string FunctionParser::parseSubLevel(size_t begin, size_t end, std::vector< generic_string > dataToSearch, int & foundPos, ScintillaEditView **ppEditView) { if (begin >= end) { foundPos = -1; - return TEXT(""); + return generic_string(); } if (!dataToSearch.size()) - return TEXT(""); + return generic_string(); int flags = SCFIND_REGEXP | SCFIND_POSIX | SCFIND_REGEXP_DOTMATCHESNL; @@ -408,7 +407,7 @@ generic_string FunctionParser::parseSubLevel(size_t begin, size_t end, std::vect if (targetStart == -1 || targetStart == -2) { foundPos = -1; - return TEXT(""); + return generic_string(); } int targetEnd = int((*ppEditView)->execute(SCI_GETTARGETEND)); @@ -417,17 +416,16 @@ generic_string FunctionParser::parseSubLevel(size_t begin, size_t end, std::vect dataToSearch.erase(dataToSearch.begin()); return parseSubLevel(targetStart, targetEnd, dataToSearch, foundPos, ppEditView); } - else // only one processed element, so we conclude the result - { - TCHAR foundStr[1024]; - (*ppEditView)->getGenericText(foundStr, 1024, targetStart, targetEnd); + // only one processed element, so we conclude the result + TCHAR foundStr[1024]; + (*ppEditView)->getGenericText(foundStr, 1024, targetStart, targetEnd); - foundPos = targetStart; - return foundStr; - } + foundPos = targetStart; + return foundStr; } + bool FunctionParsersManager::parse(std::vector & foundInfos, const AssociationInfo & assoInfo) { if (!_pXmlFuncListDoc) @@ -445,6 +443,7 @@ bool FunctionParsersManager::parse(std::vector & foundInfos, const As return true; } + size_t FunctionZoneParser::getBodyClosePos(size_t begin, const TCHAR *bodyOpenSymbol, const TCHAR *bodyCloseSymbol, const std::vector< std::pair > & commentZones, ScintillaEditView **ppEditView) { size_t cntOpen = 1; @@ -522,15 +521,13 @@ void FunctionZoneParser::classParse(vector & foundInfos, vector< pair generic_string classStructName = parseSubLevel(targetStart, targetEnd, _classNameExprArray, foundPos, ppEditView); - if (_openSymbole != TEXT("") && _closeSymbole != TEXT("")) + if (not _openSymbole.empty() && not _closeSymbole.empty()) { targetEnd = getBodyClosePos(targetEnd, _openSymbole.c_str(), _closeSymbole.c_str(), commentZones, ppEditView); } if (targetEnd > int(end)) //we found a result but outside our range, therefore do not process it - { break; - } scannedZones.push_back(pair(targetStart, targetEnd)); @@ -549,12 +546,11 @@ void FunctionZoneParser::classParse(vector & foundInfos, vector< pair } } + void FunctionParser::getCommentZones(vector< pair > & commentZone, size_t begin, size_t end, ScintillaEditView **ppEditView) { - if ((begin >= end) || (_commentExpr == TEXT(""))) - { + if ((begin >= end) || (_commentExpr.empty())) return; - } int flags = SCFIND_REGEXP | SCFIND_POSIX | SCFIND_REGEXP_DOTMATCHESNL; @@ -567,9 +563,7 @@ void FunctionParser::getCommentZones(vector< pair > & commentZone, siz targetStart = int((*ppEditView)->execute(SCI_GETTARGETSTART)); targetEnd = int((*ppEditView)->execute(SCI_GETTARGETEND)); if (targetEnd > int(end)) //we found a result but outside our range, therefore do not process it - { break; - } commentZone.push_back(pair(targetStart, targetEnd)); @@ -582,18 +576,18 @@ void FunctionParser::getCommentZones(vector< pair > & commentZone, siz } } + bool FunctionParser::isInZones(int pos2Test, const std::vector< std::pair > & zones) { for (size_t i = 0, len = zones.size(); i < len; ++i) { if (pos2Test >= zones[i].first && pos2Test < zones[i].second) - { return true; - } } return false; } + void FunctionParser::getInvertZones(vector< pair > & destZones, vector< pair > & sourceZones, size_t begin, size_t end) { if (sourceZones.size() == 0) @@ -622,6 +616,7 @@ void FunctionParser::getInvertZones(vector< pair > & destZones, vecto } } + void FunctionZoneParser::parse(std::vector & foundInfos, size_t begin, size_t end, ScintillaEditView **ppEditView, generic_string classStructName) { vector< pair > classZones, commentZones, nonCommentZones; @@ -647,8 +642,10 @@ void FunctionUnitParser::parse(std::vector & foundInfos, size_t begin // // SortClass for vector> // sort in _selLpos : increased order -struct SortZones { - bool operator() (pair & l, pair & r) { +struct SortZones final +{ + bool operator() (pair & l, pair & r) + { return (l.first < r.first); } }; @@ -677,4 +674,4 @@ void FunctionMixParser::parse(std::vector & foundInfos, size_t begin, _funcUnitPaser->funcParse(foundInfos, nonScannedZones[i].first, nonScannedZones[i].second, ppEditView, classStructName); } } -} \ No newline at end of file +} diff --git a/PowerEditor/src/WinControls/FunctionList/functionParser.h b/PowerEditor/src/WinControls/FunctionList/functionParser.h index 31233d7bf..8512d4a8c 100644 --- a/PowerEditor/src/WinControls/FunctionList/functionParser.h +++ b/PowerEditor/src/WinControls/FunctionList/functionParser.h @@ -24,23 +24,23 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -#ifndef FUNCTIONPARSER_H -#define FUNCTIONPARSER_H - +#pragma once; class ScintillaEditView; class TiXmlDocument; class TiXmlNode; -struct foundInfo { + + +struct foundInfo final +{ generic_string _data; generic_string _data2; - int _pos; - int _pos2; - foundInfo(): _data(TEXT("")), _data2(TEXT("")), _pos(-1), _pos2(-1) {}; + int _pos = -1; + int _pos2 = -1; }; -class FunctionParser { +class FunctionParser +{ friend class FunctionParsersManager; public: FunctionParser(const TCHAR *id, const TCHAR *displayName, const TCHAR *commentExpr, generic_string functionExpr, std::vector functionNameExprArray, std::vector classNameExprArray): @@ -62,7 +62,8 @@ protected: }; -class FunctionZoneParser : public FunctionParser { +class FunctionZoneParser : public FunctionParser +{ public: FunctionZoneParser(const TCHAR *id, const TCHAR *displayName, const TCHAR *commentExpr, generic_string rangeExpr, generic_string openSymbole, generic_string closeSymbole, std::vector classNameExprArray, generic_string functionExpr, std::vector functionNameExprArray): @@ -84,70 +85,77 @@ private: -class FunctionUnitParser : public FunctionParser { +class FunctionUnitParser : public FunctionParser +{ public: FunctionUnitParser(const TCHAR *id, const TCHAR *displayName, const TCHAR *commentExpr, generic_string mainExpr, std::vector functionNameExprArray, - std::vector classNameExprArray): FunctionParser(id, displayName, commentExpr, mainExpr, functionNameExprArray, classNameExprArray){}; + std::vector classNameExprArray): FunctionParser(id, displayName, commentExpr, mainExpr, functionNameExprArray, classNameExprArray) + {} void parse(std::vector & foundInfos, size_t begin, size_t end, ScintillaEditView **ppEditView, generic_string classStructName = TEXT("")); - }; -class FunctionMixParser : public FunctionZoneParser { +class FunctionMixParser : public FunctionZoneParser +{ public: FunctionMixParser(const TCHAR *id, const TCHAR *displayName, const TCHAR *commentExpr, generic_string rangeExpr, generic_string openSymbole, generic_string closeSymbole, std::vector classNameExprArray, generic_string functionExpr, std::vector functionNameExprArray, FunctionUnitParser *funcUnitPaser): FunctionZoneParser(id, displayName, commentExpr, rangeExpr, openSymbole, closeSymbole, classNameExprArray, functionExpr, functionNameExprArray), _funcUnitPaser(funcUnitPaser){}; - ~FunctionMixParser() { - if (_funcUnitPaser) - delete _funcUnitPaser; + ~FunctionMixParser() + { + delete _funcUnitPaser; } + void parse(std::vector & foundInfos, size_t begin, size_t end, ScintillaEditView **ppEditView, generic_string classStructName = TEXT("")); private: - FunctionUnitParser *_funcUnitPaser; + FunctionUnitParser* _funcUnitPaser = nullptr; }; -struct AssociationInfo { + +struct AssociationInfo final +{ int _id; int _langID; generic_string _ext; generic_string _userDefinedLangName; - AssociationInfo(int id, int langID, const TCHAR *ext, const TCHAR *userDefinedLangName): _id(id), _langID(langID) { + AssociationInfo(int id, int langID, const TCHAR *ext, const TCHAR *userDefinedLangName) + : _id(id), _langID(langID) + { if (ext) _ext = ext; else - _ext = TEXT(""); + _ext.clear(); if (userDefinedLangName) _userDefinedLangName = userDefinedLangName; else - _userDefinedLangName = TEXT(""); + _userDefinedLangName.clear(); }; }; -class FunctionParsersManager { + +class FunctionParsersManager final +{ public: - FunctionParsersManager() : _ppEditView(NULL), _pXmlFuncListDoc(NULL){}; ~FunctionParsersManager(); + bool init(generic_string xmlPath, ScintillaEditView ** ppEditView); bool parse(std::vector & foundInfos, const AssociationInfo & assoInfo); void writeFunctionListXml(const TCHAR *destFoder) const; + private: - ScintillaEditView **_ppEditView; + ScintillaEditView **_ppEditView = nullptr; std::vector _parsers; std::vector _associationMap; - TiXmlDocument *_pXmlFuncListDoc; + TiXmlDocument *_pXmlFuncListDoc = nullptr; bool getFuncListFromXmlTree(); bool getZonePaserParameters(TiXmlNode *classRangeParser, generic_string &mainExprStr, generic_string &openSymboleStr, generic_string &closeSymboleStr, std::vector &classNameExprArray, generic_string &functionExprStr, std::vector &functionNameExprArray); bool getUnitPaserParameters(TiXmlNode *functionParser, generic_string &mainExprStr, std::vector &functionNameExprArray, std::vector &classNameExprArray); FunctionParser * getParser(const AssociationInfo & assoInfo); -}; - -#endif //FUNCTIONPARSER_H - +}; \ No newline at end of file From 2739a973d724c2741d1b017e2c3dd842a68cd65e Mon Sep 17 00:00:00 2001 From: Don Ho Date: Sat, 15 Aug 2015 16:28:43 +0200 Subject: [PATCH 42/85] [RESTORE] Add back "Notepad++ Community (Forum)" menu item --- PowerEditor/src/Notepad_plus.rc | 2 +- PowerEditor/src/NppCommands.cpp | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/PowerEditor/src/Notepad_plus.rc b/PowerEditor/src/Notepad_plus.rc index 133c68f65..5581a98dd 100644 --- a/PowerEditor/src/Notepad_plus.rc +++ b/PowerEditor/src/Notepad_plus.rc @@ -846,7 +846,7 @@ BEGIN MENUITEM "Notepad++ Home", IDM_HOMESWEETHOME MENUITEM "Notepad++ Project Page", IDM_PROJECTPAGE //MENUITEM "Online Documentation", IDM_ONLINEHELP - //MENUITEM "Forum", IDM_FORUM + MENUITEM "Notepad++ Community (Forum)", IDM_FORUM MENUITEM "Live Support", IDM_ONLINESUPPORT MENUITEM "Get More Plugins", IDM_PLUGINSHOME MENUITEM SEPARATOR diff --git a/PowerEditor/src/NppCommands.cpp b/PowerEditor/src/NppCommands.cpp index 85bf17b38..6c43941a7 100644 --- a/PowerEditor/src/NppCommands.cpp +++ b/PowerEditor/src/NppCommands.cpp @@ -2292,13 +2292,13 @@ void Notepad_plus::command(int id) ::MessageBox(NULL, COMMAND_ARG_HELP, TEXT("Notepad++ Command Argument Help"), MB_OK); break; } - /* + case IDM_FORUM: { - ::ShellExecute(NULL, TEXT("open"), TEXT(""), NULL, NULL, SW_SHOWNORMAL); + ::ShellExecute(NULL, TEXT("open"), TEXT("https://notepad-plus-plus.org/community/"), NULL, NULL, SW_SHOWNORMAL); break; } - */ + case IDM_ONLINESUPPORT: { ::ShellExecute(NULL, TEXT("open"), TEXT("https://gitter.im/notepad-plus-plus/notepad-plus-plus"), NULL, NULL, SW_SHOWNORMAL); From b94767f5e6ebdd38ffc94c4d4b0c7f4eba8a0082 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Mon, 17 Aug 2015 00:34:00 +0200 Subject: [PATCH 43/85] [UPDATE] Update english.xml for v6.8.2 --- PowerEditor/installer/nativeLang/chinese.xml | 31 ++++++++++++-------- PowerEditor/installer/nativeLang/english.xml | 16 ++++++---- PowerEditor/installer/nativeLang/french.xml | 24 ++++++++++----- 3 files changed, 46 insertions(+), 25 deletions(-) diff --git a/PowerEditor/installer/nativeLang/chinese.xml b/PowerEditor/installer/nativeLang/chinese.xml index 8f6faf576..a125489cd 100644 --- a/PowerEditor/installer/nativeLang/chinese.xml +++ b/PowerEditor/installer/nativeLang/chinese.xml @@ -1,6 +1,6 @@ - +

@@ -87,8 +87,7 @@ - - + @@ -145,8 +144,14 @@ - - + + + + + + + + @@ -196,6 +201,7 @@ + @@ -258,7 +264,7 @@ - + @@ -266,6 +272,7 @@ + @@ -432,8 +439,8 @@ - - + + @@ -459,6 +466,8 @@ + + @@ -644,7 +653,7 @@ - + @@ -777,9 +786,7 @@ - - - + diff --git a/PowerEditor/installer/nativeLang/english.xml b/PowerEditor/installer/nativeLang/english.xml index 54f1da0f3..9ae3289d9 100644 --- a/PowerEditor/installer/nativeLang/english.xml +++ b/PowerEditor/installer/nativeLang/english.xml @@ -1,6 +1,6 @@ - +
@@ -201,6 +201,7 @@ + @@ -277,6 +278,7 @@ + @@ -470,6 +472,8 @@ + + @@ -655,7 +659,7 @@ - + @@ -666,10 +670,10 @@ - - - - + + + + diff --git a/PowerEditor/installer/nativeLang/french.xml b/PowerEditor/installer/nativeLang/french.xml index c5198c521..8e8001a3e 100644 --- a/PowerEditor/installer/nativeLang/french.xml +++ b/PowerEditor/installer/nativeLang/french.xml @@ -1,6 +1,6 @@ - +
@@ -90,6 +90,7 @@ + @@ -130,8 +131,14 @@ - - + + + + + + + + @@ -199,6 +206,7 @@ + @@ -273,6 +281,7 @@ + @@ -477,6 +486,8 @@ + + @@ -621,6 +632,7 @@ + @@ -764,10 +776,8 @@ - - - - + + From da1abe066e5c0af7adce87660dbfb344e82d9526 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pereira?= Date: Fri, 7 Aug 2015 18:50:01 +0100 Subject: [PATCH 44/85] [UPDATE] Update portuguese.xml --- .../installer/nativeLang/portuguese.xml | 185 +++++++++--------- 1 file changed, 96 insertions(+), 89 deletions(-) diff --git a/PowerEditor/installer/nativeLang/portuguese.xml b/PowerEditor/installer/nativeLang/portuguese.xml index 327349347..d3b88f0ad 100644 --- a/PowerEditor/installer/nativeLang/portuguese.xml +++ b/PowerEditor/installer/nativeLang/portuguese.xml @@ -7,15 +7,15 @@ - + - + - + - - + + @@ -26,7 +26,7 @@ - + @@ -76,23 +76,23 @@ - - + + - - + + - + - + - - + + - + @@ -108,12 +108,12 @@ - + - + @@ -123,9 +123,9 @@ - - - + + + @@ -134,7 +134,7 @@ - + @@ -144,10 +144,10 @@ - - - - + + + + @@ -158,7 +158,7 @@ - + @@ -201,14 +201,14 @@ - - + + - + @@ -251,11 +251,11 @@ - - + + - - + + @@ -263,13 +263,13 @@ - - - + + + - - - + + + @@ -278,17 +278,17 @@ - - + +
- + - + @@ -305,7 +305,7 @@ - +
@@ -313,7 +313,7 @@ - + @@ -344,14 +344,14 @@ - + - + - + @@ -361,11 +361,11 @@ - + - + @@ -401,17 +401,17 @@ - + - + - + - - + + @@ -421,7 +421,7 @@ - + @@ -444,23 +444,23 @@ - + - - + + - + - + @@ -492,12 +492,12 @@ - + - + @@ -528,42 +528,42 @@ - + - + - + - + - + - + - + - + @@ -576,7 +576,7 @@ - + @@ -631,7 +631,7 @@ - + @@ -700,7 +700,7 @@ - + @@ -741,7 +741,7 @@ - + @@ -770,7 +770,9 @@ - + @@ -832,9 +834,9 @@
- - - + + + @@ -881,15 +883,15 @@ - - + + - - + + @@ -897,9 +899,9 @@ - + - + @@ -919,12 +921,17 @@ Updated by: André Silva 29/05/2011 -New update by: +New updates by: David Cunha 10/09/2012 Luis Neves 27/09/2013 (versão 6.4.5) 20/09/2014 (versão 6.6.9) Updated and revised by Manuela Silva (Interpreter/Translator) -Tradução de Acordo com o Novo Acordo Ortográfico -P.F., NÃO ALTEREM A ORDEM PORQUE TORNA-SE MAIS DIFÍCIL A COMPARAÇÃO ENTRE OS FICHEIROS PT E EN ---> \ No newline at end of file +João Pereira +changelog: +PT- Corrigidos erros de tradução e palavras por interpretar +EN - Corrected translation errors and missing translations for some words +29/07/2015 +TRADUÇÃO DE ACORDO COM O NOVO ACORDO ORTOGRÁFICO +POR FAVOR, NÃO ALTEREM A ORDEM PORQUE TORNA-SE MAIS DIFÍCIL A COMPARAÇÃO ENTRE OS FICHEIROS PT E EN +--> From 7b352fb43899c916fe1b4251f6bca384a380d276 Mon Sep 17 00:00:00 2001 From: Don HO Date: Mon, 17 Aug 2015 23:48:20 +0200 Subject: [PATCH 45/85] Fix some typos --- PowerEditor/bin/change.log | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PowerEditor/bin/change.log b/PowerEditor/bin/change.log index 31b1b3ffc..5cea2cfec 100644 --- a/PowerEditor/bin/change.log +++ b/PowerEditor/bin/change.log @@ -1,13 +1,13 @@ Notepad++ v6.8.1 bug-fixes: -1. Fix the Source Code Pro font making OS hanging issue (for some specific hardware congiguration). +1. Fix the Source Code Pro font making OS hanging issue (for some specific hardware configuration). 2. Make current default font (Source Code Pro) prettier by adding its bold, italic and bold-italic fonts. -3. Fix "Restore recent close file" text disappearing issue for some circonstance. +3. Fix "Restore recent close file" text disappearing issue for some circumstance. 4. Fix snapshot file after saving being always dirty problem. 5. Fix document tab moving by clicking close button issue due to splitter inaccuracy. 6. Fix a regression of Preferences dialog in which some modified options are not applied immediately. -7. Fix inconsistant untitled document name issue (new 0 instead of new 1). -8. Fix Macro button on toolbar inconsistant issue at Notepad++ startup. +7. Fix inconsistent untitled document name issue (new 0 instead of new 1). +8. Fix Macro button on toolbar inconsistent issue at Notepad++ startup. From 4ebd2d6c6517eb68bea3c147a23646c6b6d0641b Mon Sep 17 00:00:00 2001 From: Don Ho Date: Tue, 18 Aug 2015 22:42:58 +0200 Subject: [PATCH 46/85] [UPDATE] Update localization files --- PowerEditor/installer/nativeLang/korean.xml | 1520 +++++++++--------- PowerEditor/installer/nativeLang/turkish.xml | 25 +- 2 files changed, 775 insertions(+), 770 deletions(-) diff --git a/PowerEditor/installer/nativeLang/korean.xml b/PowerEditor/installer/nativeLang/korean.xml index c3164bf2a..8c2a6da5c 100644 --- a/PowerEditor/installer/nativeLang/korean.xml +++ b/PowerEditor/installer/nativeLang/korean.xml @@ -1,252 +1,258 @@ - - + +
- - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -258,99 +264,98 @@ - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + +
- + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + +
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -364,346 +369,347 @@ - - - - - - - + + + + + + + - - - - + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - + - - - - + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + - - - + + + - - + + - - - - + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + @@ -711,189 +717,187 @@ - - - - - - - + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - + + + + + - - - - + + + + - - - + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + - - - + + + - - - - - - + + + + + + - - - - - + + + + + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - + + + + + + + + + + + + - + - - - + + + - - - - + + + + - + - - - + + + - - - - + + + + - - + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - - - + + + + + + + - - - - - + + + + + diff --git a/PowerEditor/installer/nativeLang/turkish.xml b/PowerEditor/installer/nativeLang/turkish.xml index 7dfafe450..a42cbd651 100644 --- a/PowerEditor/installer/nativeLang/turkish.xml +++ b/PowerEditor/installer/nativeLang/turkish.xml @@ -1,6 +1,6 @@ - +
@@ -86,7 +86,7 @@ - + @@ -263,11 +263,11 @@ - - - - - + + + + + @@ -357,9 +357,9 @@ - - - + + + @@ -731,13 +731,13 @@ - + - + @@ -866,6 +866,7 @@ + From 54b04cd284e8dd88238ead836affe5f6165621bf Mon Sep 17 00:00:00 2001 From: Don Ho Date: Wed, 19 Aug 2015 01:20:56 +0200 Subject: [PATCH 47/85] [RELEASE] Notepad++ v6.8.2 released --- PowerEditor/bin/change.log | 21 +++++++++++---------- PowerEditor/installer/nppSetup.nsi | 4 ++-- PowerEditor/src/resource.h | 6 +++--- 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/PowerEditor/bin/change.log b/PowerEditor/bin/change.log index 5cea2cfec..b72a7e0a9 100644 --- a/PowerEditor/bin/change.log +++ b/PowerEditor/bin/change.log @@ -1,14 +1,15 @@ -Notepad++ v6.8.1 bug-fixes: - -1. Fix the Source Code Pro font making OS hanging issue (for some specific hardware configuration). -2. Make current default font (Source Code Pro) prettier by adding its bold, italic and bold-italic fonts. -3. Fix "Restore recent close file" text disappearing issue for some circumstance. -4. Fix snapshot file after saving being always dirty problem. -5. Fix document tab moving by clicking close button issue due to splitter inaccuracy. -6. Fix a regression of Preferences dialog in which some modified options are not applied immediately. -7. Fix inconsistent untitled document name issue (new 0 instead of new 1). -8. Fix Macro button on toolbar inconsistent issue at Notepad++ startup. +Notepad++ v6.8.2 bug-fixes: +1. Remove Source Code Pro font du to the different issues. +2. Add back "Notepad++ Community (Forum)" menu item. +3. Fix a visual glitch on starup and on exit. +4. Fix "Open in/Move to new instance" issue (to memorize the language and the position). +5. Fix Preferences dialog loses focus issue while enabling document list panel. +6. Fix the narrow columns problem in Ascii Insert Panel under a high DPI. +7. Fix the list items' squeezed height problem in function list panel and project panel under a high DPI. +8. Fix panel caption squeezed display under a high DPI. +9. Fixed buffer overrun when opening a recent file. +10. Make toolbar refresh properly while switching over small/big icons. Included plugins: diff --git a/PowerEditor/installer/nppSetup.nsi b/PowerEditor/installer/nppSetup.nsi index f18360e54..8d8303ace 100644 --- a/PowerEditor/installer/nppSetup.nsi +++ b/PowerEditor/installer/nppSetup.nsi @@ -36,10 +36,10 @@ ; Define the application name !define APPNAME "Notepad++" -!define APPVERSION "6.8.1" +!define APPVERSION "6.8.2" !define APPNAMEANDVERSION "${APPNAME} v${APPVERSION}" !define VERSION_MAJOR 6 -!define VERSION_MINOR 81 +!define VERSION_MINOR 82 !define APPWEBSITE "http://notepad-plus-plus.org/" diff --git a/PowerEditor/src/resource.h b/PowerEditor/src/resource.h index 18371c9f5..bc1e1cc43 100644 --- a/PowerEditor/src/resource.h +++ b/PowerEditor/src/resource.h @@ -26,13 +26,13 @@ // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #pragma once -#define NOTEPAD_PLUS_VERSION TEXT("Notepad++ v6.8.1") +#define NOTEPAD_PLUS_VERSION TEXT("Notepad++ v6.8.2") // should be X.Y : ie. if VERSION_DIGITALVALUE == 4, 7, 1, 0 , then X = 4, Y = 71 // ex : #define VERSION_VALUE TEXT("5.63\0") -#define VERSION_VALUE TEXT("6.8.1\0") -#define VERSION_DIGITALVALUE 6, 8, 1, 0 +#define VERSION_VALUE TEXT("6.82\0") +#define VERSION_DIGITALVALUE 6, 8, 2, 0 #ifndef IDC_STATIC #define IDC_STATIC -1 From 234e0615db2c4d7c03bab283c2ea73f8caafca3b Mon Sep 17 00:00:00 2001 From: Don Ho Date: Thu, 20 Aug 2015 02:35:38 +0200 Subject: [PATCH 48/85] [RELEASE] Notepad++ 6.8.2 release Use default font if font name loaded from stylers.xml cannot be found in system. --- PowerEditor/src/Parameters.cpp | 12 ++++++++++++ PowerEditor/src/Parameters.h | 1 + .../src/ScitillaComponent/ScintillaEditView.cpp | 13 +++++++++++-- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp index 09716f9a5..92ea9dd4d 100644 --- a/PowerEditor/src/Parameters.cpp +++ b/PowerEditor/src/Parameters.cpp @@ -1511,6 +1511,18 @@ void NppParameters::setFontList(HWND hWnd) ::EnumFontFamiliesEx(hDC, &lf, EnumFontFamExProc, (LPARAM)&_fontlist, 0); } +bool NppParameters::isInFontList(const generic_string fontName2Search) const +{ + if (fontName2Search.empty()) + return false; + + for (size_t i = 0, len = _fontlist.size(); i < len; i++) + { + if (_fontlist[i] == fontName2Search) + return true; + } + return false; +} void NppParameters::getLangKeywordsFromXmlTree() { diff --git a/PowerEditor/src/Parameters.h b/PowerEditor/src/Parameters.h index 282cf51d7..852f27f21 100644 --- a/PowerEditor/src/Parameters.h +++ b/PowerEditor/src/Parameters.h @@ -1366,6 +1366,7 @@ public: void setCurLineHilitingColour(COLORREF colour2Set); void setFontList(HWND hWnd); + bool isInFontList(const generic_string fontName2Search) const; const std::vector& getFontList() const { return _fontlist; } int getNbUserLang() const {return _nbUserLang;} diff --git a/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp b/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp index 2263370bf..9afd51545 100644 --- a/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp +++ b/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp @@ -428,6 +428,7 @@ LRESULT ScintillaEditView::scintillaNew_Proc(HWND hwnd, UINT Message, WPARAM wPa return _callWindowProc(_scintillaDefaultProc, hwnd, Message, wParam, lParam); } +#define DEFAULT_FONT_NAME "Courier New" void ScintillaEditView::setSpecialStyle(const Style & styleToSet) { @@ -441,8 +442,16 @@ void ScintillaEditView::setSpecialStyle(const Style & styleToSet) if (styleToSet._fontName && lstrcmp(styleToSet._fontName, TEXT("")) != 0) { WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); - const char * fontNameA = wmc->wchar2char(styleToSet._fontName, CP_UTF8); - execute(SCI_STYLESETFONT, (WPARAM)styleID, (LPARAM)fontNameA); + + if (not _pParameter->isInFontList(styleToSet._fontName)) + { + execute(SCI_STYLESETFONT, (WPARAM)styleID, (LPARAM)DEFAULT_FONT_NAME); + } + else + { + const char * fontNameA = wmc->wchar2char(styleToSet._fontName, CP_UTF8); + execute(SCI_STYLESETFONT, (WPARAM)styleID, (LPARAM)fontNameA); + } } int fontStyle = styleToSet._fontStyle; if (fontStyle != STYLE_NOT_USED) From 6c93399c6b3bfdc14bd87c98ae6a97609a40970b Mon Sep 17 00:00:00 2001 From: squarefractal Date: Thu, 20 Aug 2015 15:22:45 +0530 Subject: [PATCH 49/85] C/C++: Add uint{8,16,32,64}_t and size_t data types (closes #750) --- PowerEditor/src/langs.model.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PowerEditor/src/langs.model.xml b/PowerEditor/src/langs.model.xml index 27abc13aa..38de11aa7 100644 --- a/PowerEditor/src/langs.model.xml +++ b/PowerEditor/src/langs.model.xml @@ -62,7 +62,7 @@ alignof and and_eq bitand bitor break case catch compl const_cast continue default delete do dynamic_cast else false for goto if namespace new not not_eq nullptr operator or or_eq reinterpret_cast return sizeof static_assert static_cast switch this throw true try typedef typeid using while xor xor_eq NULL - alignas asm auto bool char char16_t char32_t class const constexpr decltype double enum explicit export extern final float friend inline int long mutable noexcept override private protected public register short signed static struct template thread_local typename union unsigned virtual void volatile wchar_t + alignas asm auto bool char char16_t char32_t class const constexpr decltype double enum explicit export extern final float friend inline int int8_t int16_t int32_t int64_t int_fast8_t int_fast16_t int_fast32_t int_fast64_t intmax_t intptr_t long mutable noexcept override private protected public register short signed size_t ssize_t static struct template thread_local typename uint8_t uint16_t uint32_t uint64_t uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t uintmax_t uintptr_t union unsigned virtual void volatile wchar_t abstract as base break case catch checked continue default delegate do else event explicit extern false finally fixed for foreach goto if implicit in interface internal is lock namespace new null object operator out override params private protected public readonly ref return sealed sizeof stackalloc switch this throw true try typeof unchecked unsafe using virtual while From d39f11a57a2f0294cd5f5c521560e8fcbba38dc5 Mon Sep 17 00:00:00 2001 From: squarefractal Date: Thu, 20 Aug 2015 15:15:20 +0530 Subject: [PATCH 50/85] ASM: Add movsxd and cdqe instructions (closes #751) --- PowerEditor/src/langs.model.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PowerEditor/src/langs.model.xml b/PowerEditor/src/langs.model.xml index 38de11aa7..4a0a7f176 100644 --- a/PowerEditor/src/langs.model.xml +++ b/PowerEditor/src/langs.model.xml @@ -11,7 +11,7 @@ abort abs abstract accept access aliased all and array at begin body case constant declare delay delta digits do else elsif end entry exception exit for function generic goto if in interface is limited loop mod new not null of or others out overriding package pragma private procedure protected raise range record rem renames requeue return reverse select separate some subtype synchronized tagged task terminate then type until use when while with with xor - aaa aad aam aas adc add and call cbw clc cld cli cmc cmp cmps cmpsb cmpsw cwd daa das dec div esc hlt idiv imul in inc int into iret ja jae jb jbe jc jcxz je jg jge jl jle jmp jna jnae jnb jnbe jnc jne jng jnge jnl jnle jno jnp jns jnz jo jp jpe jpo js jz lahf lds lea les lods lodsb lodsw loop loope loopew loopne loopnew loopnz loopnzw loopw loopz loopzw mov movs movsb movsw mul neg nop not or out pop popf push pushf rcl rcr ret retf retn rol ror sahf sal sar sbb scas scasb scasw shl shr stc std sti stos stosb stosw sub test wait xchg xlat xlatb xor bound enter ins insb insw leave outs outsb outsw popa pusha pushw arpl lar lsl sgdt sidt sldt smsw str verr verw clts lgdt lidt lldt lmsw ltr bsf bsr bt btc btr bts cdq cmpsd cwde insd iretd iretdf iretf jecxz lfs lgs lodsd loopd looped loopned loopnzd loopzd lss movsd movsx movzx outsd popad popfd pushad pushd pushfd scasd seta setae setb setbe setc sete setg setge setl setle setna setnae setnb setnbe setnc setne setng setnge setnl setnle setno setnp setns setnz seto setp setpe setpo sets setz shld shrd stosd bswap cmpxchg invd invlpg wbinvd xadd lock rep repe repne repnz repz cflush cpuid emms femms cmovo cmovno cmovb cmovc cmovnae cmovae cmovnb cmovnc cmove cmovz cmovne cmovnz cmovbe cmovna cmova cmovnbe cmovs cmovns cmovp cmovpe cmovnp cmovpo cmovl cmovnge cmovge cmovnl cmovle cmovng cmovg cmovnle cmpxchg486 cmpxchg8b loadall loadall286 ibts icebp int1 int3 int01 int03 iretw popaw popfw pushaw pushfw rdmsr rdpmc rdshr rdtsc rsdc rsldt rsm rsts salc smi smint smintold svdc svldt svts syscall sysenter sysexit sysret ud0 ud1 ud2 umov xbts wrmsr wrshr + aaa aad aam aas adc add and call cbw cdqe clc cld cli cmc cmp cmps cmpsb cmpsw cwd daa das dec div esc hlt idiv imul in inc int into iret ja jae jb jbe jc jcxz je jg jge jl jle jmp jna jnae jnb jnbe jnc jne jng jnge jnl jnle jno jnp jns jnz jo jp jpe jpo js jz lahf lds lea les lods lodsb lodsw loop loope loopew loopne loopnew loopnz loopnzw loopw loopz loopzw mov movs movsb movsw mul neg nop not or out pop popf push pushf rcl rcr ret retf retn rol ror sahf sal sar sbb scas scasb scasw shl shr stc std sti stos stosb stosw sub test wait xchg xlat xlatb xor bound enter ins insb insw leave outs outsb outsw popa pusha pushw arpl lar lsl sgdt sidt sldt smsw str verr verw clts lgdt lidt lldt lmsw ltr bsf bsr bt btc btr bts cdq cmpsd cwde insd iretd iretdf iretf jecxz lfs lgs lodsd loopd looped loopned loopnzd loopzd lss movsd movsx movsxd movzx outsd popad popfd pushad pushd pushfd scasd seta setae setb setbe setc sete setg setge setl setle setna setnae setnb setnbe setnc setne setng setnge setnl setnle setno setnp setns setnz seto setp setpe setpo sets setz shld shrd stosd bswap cmpxchg invd invlpg wbinvd xadd lock rep repe repne repnz repz cflush cpuid emms femms cmovo cmovno cmovb cmovc cmovnae cmovae cmovnb cmovnc cmove cmovz cmovne cmovnz cmovbe cmovna cmova cmovnbe cmovs cmovns cmovp cmovpe cmovnp cmovpo cmovl cmovnge cmovge cmovnl cmovle cmovng cmovg cmovnle cmpxchg486 cmpxchg8b loadall loadall286 ibts icebp int1 int3 int01 int03 iretw popaw popfw pushaw pushfw rdmsr rdpmc rdshr rdtsc rsdc rsldt rsm rsts salc smi smint smintold svdc svldt svts syscall sysenter sysexit sysret ud0 ud1 ud2 umov xbts wrmsr wrshr f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcom fcomp fcompp fdecstp fdisi fdiv fdivp fdivr fdivrp feni ffree fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisub fisubr fld fld1 fldcw fldenv fldenvw fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnsavew fnstcw fnstenv fnstenvw fnstsw fpatan fprem fptan frndint frstor frstorw fsave fsavew fscale fsqrt fst fstcw fstenv fstenvw fstp fstsw fsub fsubp fsubr fsubrp ftst fwait fxam fxch fxtract fyl2x fyl2xp1 fsetpm fcos fldenvd fnsaved fnstenvd fprem1 frstord fsaved fsin fsincos fstenvd fucom fucomp fucompp fcomi fcomip ffreep fcmovb fcmove fcmovbe fcmovu fcmovnb fcmovne fcmovnbe fcmovnu ah al ax bh bl bp bx ch cl cr0 cr2 cr3 cr4 cs cx dh di dl dr0 dr1 dr2 dr3 dr6 dr7 ds dx eax ebp ebx ecx edi edx es esi esp fs gs si sp ss st tr3 tr4 tr5 tr6 tr7 st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 .186 .286 .286c .286p .287 .386 .386c .386p .387 .486 .486p .8086 .8087 .alpha .break .code .const .continue .cref .data .data? .dosseg .else .elseif .endif .endw .err .err1 .err2 .errb .errdef .errdif .errdifi .erre .erridn .erridni .errnb .errndef .errnz .exit .fardata .fardata? .if .lall .lfcond .list .listall .listif .listmacro .listmacroall .model .no87 .nocref .nolist .nolistif .nolistmacro .radix .repeat .sall .seq .sfcond .stack .startup .tfcond .type .until .untilcxz .while .xall .xcref .xlist alias align assume catstr comm comment db dd df dosseg dq dt dup dw echo else elseif elseif1 elseif2 elseifb elseifdef elseifdif elseifdifi elseife elseifidn elseifidni elseifnb elseifndef end endif endm endp ends eq equ even exitm extern externdef extrn for forc ge goto group gt high highword if if1 if2 ifb ifdef ifdif ifdifi ife ifidn ifidni ifnb ifndef include includelib instr invoke irp irpc label le length lengthof local low lowword lroffset lt macro mask mod .msfloat name ne offset opattr option org %out page popcontext proc proto ptr public purge pushcontext record repeat rept seg segment short size sizeof sizestr struc struct substr subtitle subttl textequ this title type typedef union while width db dw dd dq dt resb resw resd resq rest incbin equ times %define %idefine %xdefine %xidefine %undef %assign %iassign %strlen %substr %macro %imacro %endmacro %rotate .nolist %if %elif %else %endif %ifdef %ifndef %elifdef %elifndef %ifmacro %ifnmacro %elifmacro %elifnmacro %ifctk %ifnctk %elifctk %elifnctk %ifidn %ifnidn %elifidn %elifnidn %ifidni %ifnidni %elifidni %elifnidni %ifid %ifnid %elifid %elifnid %ifstr %ifnstr %elifstr %elifnstr %ifnum %ifnnum %elifnum %elifnnum %error %rep %endrep %exitrep %include %push %pop %repl struct endstruc istruc at iend align alignb %arg %stacksize %local %line bits use16 use32 section absolute extern global common cpu org section group import export From 55a2a38b388e4e47aecc05faa9b52c18a15387d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arben=20=C3=87okaj?= Date: Wed, 19 Aug 2015 16:26:11 +0200 Subject: [PATCH 51/85] translation: updated albanian.xml (closes #748) --- PowerEditor/installer/nativeLang/albanian.xml | 1178 +++++++++++++---- 1 file changed, 918 insertions(+), 260 deletions(-) diff --git a/PowerEditor/installer/nativeLang/albanian.xml b/PowerEditor/installer/nativeLang/albanian.xml index 01939feac..f69febca6 100644 --- a/PowerEditor/installer/nativeLang/albanian.xml +++ b/PowerEditor/installer/nativeLang/albanian.xml @@ -1,284 +1,942 @@ - - -
- - - - - - - - - - - - + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + - - - - - - - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
\ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From c914c5a325066317668f33cde698ecf0635a1359 Mon Sep 17 00:00:00 2001 From: Artem Polivanchuk Date: Tue, 18 Aug 2015 23:07:16 +0300 Subject: [PATCH 52/85] translation: update of Ukrainian lang (closes #742) --- .../installer/nativeLang/ukrainian.xml | 158 +++++++++--------- 1 file changed, 79 insertions(+), 79 deletions(-) diff --git a/PowerEditor/installer/nativeLang/ukrainian.xml b/PowerEditor/installer/nativeLang/ukrainian.xml index 332d93564..403076c41 100644 --- a/PowerEditor/installer/nativeLang/ukrainian.xml +++ b/PowerEditor/installer/nativeLang/ukrainian.xml @@ -167,28 +167,28 @@ - - - - - - - - - - + + + + + + + + + + - - - - - + + + + + - - - - - + + + + + @@ -207,18 +207,18 @@ - + - - - - - - - - - + + + + + + + + + @@ -275,7 +275,7 @@ - + @@ -286,7 +286,7 @@ - + @@ -375,7 +375,7 @@ - + @@ -432,45 +432,45 @@ - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + @@ -489,14 +489,14 @@ - - - - - - - - + + + + + + + + @@ -706,13 +706,13 @@ - + - + From ec66bc059a45af58f50e2918bffeaa13ff26083d Mon Sep 17 00:00:00 2001 From: squarefractal Date: Thu, 20 Aug 2015 16:57:19 +0530 Subject: [PATCH 53/85] UNIX: Add a list of commonly available Linux commands (closes #753) --- PowerEditor/src/langs.model.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PowerEditor/src/langs.model.xml b/PowerEditor/src/langs.model.xml index 4a0a7f176..4791d5b8f 100644 --- a/PowerEditor/src/langs.model.xml +++ b/PowerEditor/src/langs.model.xml @@ -31,7 +31,7 @@
- alias ar asa awk banner basename bash bc bdiff break bunzip2 bzip2 cal calendar case cat cc cd chmod cksum clear cmp col comm compress continue cp cpio crypt csplit ctags cut date dc dd declare deroff dev df diff diff3 dircmp dirname do done du echo ed egrep elif else env esac eval ex exec exit expand export expr false fc fgrep fi file find fmt fold for function functions getconf getopt getopts grep gres hash head help history iconv id if in integer jobs join kill local lc let line ln logname look ls m4 mail mailx make man mkdir more mt mv newgrp nl nm nohup ntps od pack paste patch pathchk pax pcat perl pg pr print printf ps pwd read readonly red return rev rm rmdir sed select set sh shift size sleep sort spell split start stop strings strip stty sum suspend sync tail tar tee test then time times touch tr trap true tsort tty type typeset ulimit umask unalias uname uncompress unexpand uniq unpack unset until uudecode uuencode vi vim vpax wait wc whence which while who wpaste wstart xargs zcat + 7z adduser alias apt-get ar asa autoconf automake awk banner base64 basename bash bc bdiff blkid break bsdcpio bsdtar bunzip2 bzcmp bzdiff bzegrep bzfgrep bzgrep bzip2 bzip2recover bzless bzmore c++ cal calendar case cat cc cd cfdisk chattr chgrp chmod chown chroot chvt cksum clang clang++ clear cmp col column comm compgen compress continue convert cp cpio crontab crypt csplit ctags curl cut date dc dd deallocvt declare deluser depmod deroff df dialog diff diff3 dig dircmp dirname disown do done dpkg du echo ed egrep elif else env esac eval ex exec exit expand export expr false fc fdisk ffmpeg fgrep fi file find flex flock fmt fold for fsck function functions fuser fusermount g++ gawk gcc gdb getconf getopt getopts git gpg gpgsplit gpgv grep gres groff groups gunzip gzexe hash hd head help hexdump hg history httpd iconv id if ifconfig ifdown ifquery ifup in insmod integer inxi ip jobs join kill killall killall5 lc ld ldd let lex line ln local logname look ls lsattr lsb_release lscpu lshw lsusb lzcmp lzegrep lzfgrep lzgrep lzless lzma lzmainfo lzmore m4 mail mailx make man mkdir mkfifo mkswap mktemp modinfo modprobe mogrify more mount msgfmt mt mv nameif nasm nc ndisasm netcat newgrp nl nm nohup ntps objdump od openssl pack pacman passwd paste patch pathchk pax pcat pcregrep pcretest perl pg ping ping6 pivot_root poweroff pr print printf ps pwd python python2 python3 ranlib read readlink readonly reboot red reset return rev rm rmdir rmmod rpm rsync sed select service set sh sha1sum sha224sum sha256sum sha3sum sha512sum shift shred shuf shutdown size sleep sort spell split start stop strings strip stty su sudo sum suspend switch_root sync systemctl tac tail tar tee test then time times touch tr trap troff true tsort tty type typeset ulimit umask umount unalias uname uncompress unexpand uniq unlink unlzma unpack unset until unzip unzipsfx useradd userdel uudecode uuencode vi vim vpax wait wc wget whence which while who wpaste wstart xargs xdotool xxd xz xzcat xzcmp xzdiff xzfgrep xzgrep xzless xzmore yes yum zcat zcmp zdiff zegrep zfgrep zforce zgrep zless zmore znew zsh rem set if else exist errorlevel for in do break call copy chcp cd chdir choice cls country ctty date del erase dir echo exit goto loadfix loadhigh mkdir md move path pause prompt rename ren rmdir rd shift time type ver verify vol com con lpt nul defined not errorlevel cmdextversion From 3319612a267220b4fed1522211fb004b1f189ea4 Mon Sep 17 00:00:00 2001 From: Adrian Avramescu Date: Wed, 5 Aug 2015 16:30:32 -0700 Subject: [PATCH 54/85] Fix word count regex to include words separated by newline (fixes #640, closes #653) --- PowerEditor/src/Notepad_plus.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index c554cf775..b8d1ea549 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -2906,7 +2906,7 @@ size_t Notepad_plus::getSelectedBytes() int Notepad_plus::wordCount() { FindOption env; - env._str2Search = TEXT("[^ \\\\.,;:!?()+\\-\\*/=\\]\\[{}&~\"'`|@$%<>\\^]+"); + env._str2Search = TEXT("[^ \\\\.,;:!?()+\\r\\n\\-\\*/=\\]\\[{}&~\"'`|@$%<>\\^]+"); env._searchType = FindRegex; return _findReplaceDlg.processAll(ProcessCountAll, &env, true); } From 3ed63d2b0204e532ddf73589cf43526637d2c173 Mon Sep 17 00:00:00 2001 From: Ricardo Date: Tue, 11 Aug 2015 02:23:03 -0300 Subject: [PATCH 55/85] langs.model.xml: Add some extensions --- PowerEditor/src/langs.model.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PowerEditor/src/langs.model.xml b/PowerEditor/src/langs.model.xml index 4791d5b8f..c22740958 100644 --- a/PowerEditor/src/langs.model.xml +++ b/PowerEditor/src/langs.model.xml @@ -96,7 +96,7 @@ !doctype a abbr accept accept-charset accesskey acronym action address align alink alt applet archive area article aside audio axis b background base basefont bdi bdo bgsound bgcolor big blink blockquote body border br button canvas caption cellpadding cellspacing center char charoff charset checkbox checked cite class classid clear code codebase codetype col colgroup color cols colspan command compact content contenteditable contextmenu coords data datafld dataformatas datalist datapagesize datasrc datetime dd declare defer del details dfn dialog dir disabled div dl draggable dropzone dt element em embed enctype event face fieldset figcaption figure file font footer for form frame frameborder frameset h1 h2 h3 h4 h5 h6 head header height hgroup hidden hr href hreflang hspace html http-equiv i id iframe image img input ins isindex ismap kbd keygen label lang language leftmargin legend li link listing longdesc main map marginheight marginwidth mark marquee maxlength media menu menuitem meta meter multicol method multiple name nav nobr noembed noframes nohref noresize noscript noshade nowrap object ol onabort onautocomplete onautocompleteerror onafterprint onbeforeonload onbeforeprint onblur oncancel oncanplay oncanplaythrough onchange onclick onclose oncontextmenu oncuechange ondblclick ondrag ondragend ondragenter ondragleave ondragover ondragstart ondrop ondurationchange onemptied onended onerror onfocus onhashchange oninput oninvalid onkeydown onkeypress onkeyup onload onloadeddata onloadedmetadata onloadstart onmessage onmousedown onmouseenter onmouseleave onmousemove onmouseout onmouseover onmouseup onmousewheel onoffline ononline onpagehide onpageshow onpause onplay onplaying onpointercancel onpointerdown onpointerenter onpointerleave onpointerlockchange onpointerlockerror onpointermove onpointerout onpointerover onpointerup onpopstate onprogress onratechange onreadystatechange onredo onreset onresize onscroll onseeked onseeking onselect onshow onsort onselect onstalled onstorage onsubmit onsuspend ontimeupdate ontoggle onundo onunload onvolumechange onwaiting optgroup option output p param picture plaintext password placeholder pre profile progress prompt public q radio readonly rel reset rev rows rowspan rp rt rtc ruby rules s samp scheme scope script section select shadow selected shape size small source spacer span spellcheck src standby start strike strong style sub submit summary sup svg svg:svg tabindex table target tbody td template text textarea tfoot th thead time title topmargin tr track tt type u ul usemap valign value valuetype var version video vlink vspace wbr xmp width xml xmlns - + code components custommessages dirs files icons ini installdelete langoptions languages messages registry run setup types tasks uninstalldelete uninstallrun _istool @@ -220,7 +220,7 @@ std ieee work standard textio std_logic_1164 std_logic_arith std_logic_misc std_logic_signed std_logic_textio std_logic_unsigned numeric_bit numeric_std math_complex math_real vital_primitives vital_timing boolean bit character severity_level integer real time delay_length natural positive string bit_vector file_open_kind file_open_status line text side width std_ulogic std_ulogic_vector std_logic std_logic_vector X01 X01Z UX01 UX01Z unsigned signed - + From ea8c4f21f98a03eef5a405269bfcc5e59ff1fe91 Mon Sep 17 00:00:00 2001 From: Ricardo Date: Tue, 11 Aug 2015 02:20:47 -0300 Subject: [PATCH 56/85] langs.model.xml: Additions to PHP highlight (closes #700) + August 10: * Added/updated Functions and Predefined Constants from these categories: Direct IO, xdiff, xattr, Proctitle, Inotify; Math, Statistic, BC Math, bcmul, GMP, Trader; Zip, Zlib, Bzip2, LZF, Rar; PDF, PS, RPM Reader, GnuPG, FDF, Ming; OpenAL, ID3, oggvorbis; Cairo, GD and Image, Exif; IIS, COM, win32ps, win32service, Eio, Expect, Libevent, PCNTL, POSIX, pthreads, WinCache; Session, Msession, Session PgSQL; Ncurses, Newt, Readline, Kerberos V, Radius; Mailparse, Cyrus, vpopmail; SVN, SSH2, Socket, TCP, Gupnp, Gopher, SNMP, mqseries; MCVE, SPPLUS; BBCode, ssdeep; bcompiler, APC, APD, Blenc, OPcache, Xhprof; SPL, GeoIP, Yaml, Fann, Judy, Parsekit, Taint, Tokenizer, Tidy; mnoGoSearch. + July 25: * Comprehensive addition of PHP Functions and Predefined Constants from systems running these PHP versions: 5.6.8 (win), 5.5.24 (win), 5.4.38 (linux), 5.3.10 (linux) and 5.3.5 (win). * Added "array_sort" that is not in any list. + July 20: * Added/updated Functions and Predefined Constants from these categories: Multibyte String, HTTP, intl. * Added procedural style Functions and Predefined Constants related to databases: CUBRID, DB++, Firebird/InterBase, FrontBase, IBM DB2, Informix, Ingres, MaxDB, Mongo, Mssql, MySQL, MySQLi, OCI8, ODBC, Paradox, PostgreSQL, SQLSRV, SQLite, SQLite3, dBase, dbx, filePro, mSQL, Sybase. --- PowerEditor/src/langs.model.xml | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/PowerEditor/src/langs.model.xml b/PowerEditor/src/langs.model.xml index c22740958..a0688cd31 100644 --- a/PowerEditor/src/langs.model.xml +++ b/PowerEditor/src/langs.model.xml @@ -155,10 +155,23 @@ NULL __FILE__ __LINE__ __PACKAGE__ __DATA__ __END__ AUTOLOAD BEGIN CORE DESTROY END EQ GE GT INIT LE LT NE CHECK abs accept alarm and atan2 bind binmode bless caller chdir chmod chomp chop chown chr chroot close closedir cmp connect continue cos crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent endhostent endnetent endprotoent endpwent endservent eof eq eval exec exists exit exp fcntl fileno flock for foreach fork format formline ge getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getppid getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt glob gmtime goto grep gt hex if index int ioctl join keys kill last lc lcfirst le length link listen local localtime lock log lstat lt m map mkdir msgctl msgget msgrcv msgsnd my ne next no not oct open opendir or ord our pack package pipe pop pos print printf prototype push q qq qr quotemeta qu qw qx rand read readdir readline readlink readpipe recv redo ref rename require reset return reverse rewinddir rindex rmdir s scalar seek seekdir select semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unless unlink unpack unshift untie until use utime values vec wait waitpid wantarray warn while write x xor y - __autoload __class__ __compiler_halt_offset__ __construct __destruct __dir__ __file__ __function__ __halt_compiler __line__ __method__ __namespace__ __sleep __trait__ __wakeup abday_1 abday_2 abday_3 abday_4 abday_5 abday_6 abday_7 abmon_1 abmon_10 abmon_11 abmon_12 abmon_2 abmon_3 abmon_4 abmon_5 abmon_6 abmon_7 abmon_8 abmon_9 abstract addcslashes addslashes alt_digits am_str and apache_child_terminate apache_get_modules apache_get_version apache_getenv apache_lookup_uri apache_note apache_request_headers apache_reset_timeout apache_response_headers apache_setenv array array_change_key_case array_chunk array_column array_combine array_count_values array_diff array_diff_assoc array_diff_key array_diff_uassoc array_diff_ukey array_fill array_fill_keys array_filter array_filter_use_both array_filter_use_key array_flip array_intersect array_intersect_assoc array_intersect_key array_intersect_uassoc array_intersect_ukey array_key_exists array_keys array_map array_merge array_merge_recursive array_multisort array_pad array_pop array_product array_push array_rand array_reduce array_replace array_replace_recursive array_reverse array_search array_shift array_slice array_splice array_sum array_udiff array_udiff_assoc array_udiff_uassoc array_uintersect array_uintersect_assoc array_uintersect_uassoc array_unique array_unshift array_values array_walk array_walk_recursive arrayaccess arrayiterator arrayobject arsort as asort assert assert_active assert_bail assert_callback assert_options assert_quiet_eval assert_warning base64_decode base64_encode basename bin2hex bool boolean boolval break bzclose bzerrno bzerror bzerrstr bzflush bzopen bzread bzwrite cal_days_in_month cal_from_jd cal_info cal_to_jd call_user_func call_user_func_array call_user_method call_user_method_array callable case case_lower case_upper catch cfunction char_max chdir checkdate checkdnsrr chgrp chmod chop chown chr chroot chunk_split class class_alias class_exists clearstatcache cli_get_process_title cli_set_process_title clone closedir closelog codeset com_get com_invoke com_load com_propget com_propput com_set compact connection_aborted connection_normal connection_status connection_timeout const constant continue convert_cyr_string convert_uudecode convert_uuencode copy count count_chars count_normal count_recursive crc32 create_function credits_all credits_docs credits_fullpage credits_general credits_group credits_modules credits_qa credits_sapi crncystr crypt crypt_blowfish crypt_ext_des crypt_md5 crypt_salt_length crypt_std_des curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_getinfo curl_init curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_pause curl_reset curl_setopt curl_setopt_array curl_share_close curl_share_init curl_share_setopt curl_strerror curl_unescape curl_version currency_symbol current d_fmt d_t_fmt date date_add date_create date_create_from_format date_create_immutable date_create_immutable_from_format date_date_set date_default_timezone_get date_default_timezone_set date_diff date_format date_get_last_errors date_interval_create_from_date_string date_interval_format date_isodate_set date_modify date_offset_get date_parse date_parse_from_format date_sub date_sun_info date_sunrise date_sunset date_time_set date_timestamp_get date_timestamp_set date_timezone_get date_timezone_set day_1 day_2 day_3 day_4 day_5 day_6 day_7 debug_backtrace debug_print_backtrace debug_zval_dump decimal_point declare default default_include_path define define_syslog_variables defined delete die dir directory directory_separator dirname disk_free_space disk_total_space diskfreespace dl dns_a dns_aaaa dns_all dns_any dns_check_record dns_cname dns_get_mx dns_get_record dns_hinfo dns_mx dns_ns dns_ptr dns_soa dns_txt do double doubleval e_all e_compile_error e_compile_warning e_core_error e_core_warning e_deprecated e_error e_notice e_parse e_recoverable_error e_strict e_user_deprecated e_user_error e_user_notice e_user_warning e_warning each easter_date easter_days echo else elseif empty end enddeclare endfor endforeach endif endswitch endwhile ent_compat ent_disallowed ent_html401 ent_html5 ent_ignore ent_noquotes ent_quotes ent_substitute ent_xhtml ent_xml1 era era_d_fmt era_d_t_fmt era_t_fmt era_year ereg ereg_replace eregi eregi_replace error_get_last error_log error_reporting escapeshellarg escapeshellcmd eval exec exit explode extends extension_loaded extr_if_exists extr_overwrite extr_prefix_all extr_prefix_if_exists extr_prefix_invalid extr_prefix_same extr_refs extr_skip extract false fclose feof fflush fgetc fgetcsv fgets fgetss file file_exists file_get_contents file_put_contents fileatime filectime filegroup fileinode filemtime fileowner fileperms filesize filetype filter_callback filter_default filter_flag_allow_fraction filter_flag_allow_hex filter_flag_allow_octal filter_flag_allow_scientific filter_flag_allow_thousand filter_flag_empty_string_null filter_flag_encode_amp filter_flag_encode_high filter_flag_encode_low filter_flag_ipv4 filter_flag_ipv6 filter_flag_no_encode_quotes filter_flag_no_priv_range filter_flag_no_res_range filter_flag_none filter_flag_path_required filter_flag_query_required filter_flag_strip_high filter_flag_strip_low filter_force_array filter_has_var filter_id filter_input filter_input_array filter_list filter_null_on_failure filter_require_array filter_require_scalar filter_sanitize_email filter_sanitize_encoded filter_sanitize_magic_quotes filter_sanitize_number_float filter_sanitize_number_int filter_sanitize_special_chars filter_sanitize_string filter_sanitize_stripped filter_sanitize_url filter_unsafe_raw filter_validate_boolean filter_validate_email filter_validate_float filter_validate_int filter_validate_ip filter_validate_mac filter_validate_regexp filter_validate_url filter_var filter_var_array final finally finfo_buffer finfo_close finfo_file finfo_open finfo_set_flags float floatval flock floor flush fmod fnmatch fopen for foreach forward_static_call forward_static_call_array fpassthru fprintf fputcsv fputs frac_digits fread frenchtojd fscanf fseek fsockopen fstat ftell ftok ftp_alloc ftp_cdup ftp_chdir ftp_chmod ftp_close ftp_connect ftp_delete ftp_exec ftp_fget ftp_fput ftp_get ftp_get_option ftp_login ftp_mdtm ftp_mkdir ftp_nb_continue ftp_nb_fget ftp_nb_fput ftp_nb_get ftp_nb_put ftp_nlist ftp_pasv ftp_put ftp_pwd ftp_quit ftp_raw ftp_rawlist ftp_rename ftp_rmdir ftp_set_option ftp_site ftp_size ftp_ssl_connect ftp_systype ftruncate func_get_arg func_get_args func_num_args function function_exists fwrite gc_collect_cycles gc_disable gc_enable gc_enabled gd_info get_browser get_called_class get_cfg_var get_class get_class_methods get_class_vars get_current_user get_declared_classes get_declared_interfaces get_declared_traits get_defined_constants get_defined_functions get_defined_vars get_extension_funcs get_headers get_html_translation_table get_include_path get_included_files get_loaded_extensions get_magic_quotes_gpc get_magic_quotes_runtime get_meta_tags get_object_vars get_parent_class get_required_files get_resource_type getallheaders getcwd getdate getdir getenv gethostbyaddr gethostbyname gethostbynamel gethostname getimagesize getimagesizefromstring getlastmod getmxrr getmygid getmyinode getmypid getmyuid getopt getprotobyname getprotobynumber getrusage getservbyname getservbyport gettimeofday gettype glob global gmdate gmmktime gmstrftime goto gregoriantojd grouping gzclose gzcompress gzdecode gzdeflate gzencode gzeof gzfile gzgetc gzgets gzgetss gzinflate gzopen gzpassthru gzputs gzread gzrewind gzseek gztell gzuncompress gzwrite hash hash_algos hash_copy hash_equals hash_file hash_final hash_hmac hash_hmac_file hash_init hash_pbkdf2 hash_update hash_update_file hash_update_stream header header_register_callback header_remove headers_list headers_sent hebrev hebrevc hex2bin highlight_file highlight_string html_entities html_entity_decode html_specialchars htmlentities htmlspecialchars htmlspecialchars_decode - http_build_query http_response_code idate if ignore_user_abort image2wbmp image_type_to_extension image_type_to_mime_type imageaffine imageaffinematrixconcat imageaffinematrixget imagealphablending imageantialias imagearc imagechar imagecharup imagecolorallocate imagecolorallocatealpha imagecolorat imagecolorclosest imagecolorclosestalpha imagecolorclosesthwb imagecolordeallocate imagecolorexact imagecolorexactalpha imagecolormatch imagecolorresolve imagecolorresolvealpha imagecolorset imagecolorsforindex imagecolorstotal imagecolortransparent imageconvolution imagecopy imagecopymerge imagecopymergegray imagecopyresampled imagecopyresized imagecreate imagecreatefromgd imagecreatefromgd2 imagecreatefromgd2part imagecreatefromgif imagecreatefromjpeg imagecreatefrompng imagecreatefromstring imagecreatefromwbmp imagecreatefromwebp imagecreatefromxbm imagecreatefromxpm imagecreatetruecolor imagecrop imagecropauto imagedashedline imagedestroy imageellipse imagefill imagefilledarc imagefilledellipse imagefilledpolygon imagefilledrectangle imagefilltoborder imagefilter imageflip imagefontheight imagefontwidth imageftbbox imagefttext imagegammacorrect imagegd imagegd2 imagegif imagegrabscreen imagegrabwindow imageinterlace imageistruecolor imagejpeg imagelayereffect imageline imageloadfont imagepalettecopy imagepalettetotruecolor imagepng imagepolygon imagepsbbox imagepsencodefont imagepsextendfont imagepsfreefont imagepsloadfont imagepsslantfont imagepstext imagerectangle imagerotate imagesavealpha imagescale imagesetbrush imagesetinterpolation imagesetpixel imagesetstyle imagesetthickness imagesettile imagestring imagestringup imagesx imagesy imagetruecolortopalette imagettfbbox imagettftext imagetypes imagewbmp imagewebp imagexbm imap_8bit imap_alerts imap_append imap_base64 imap_binary imap_body imap_bodystruct imap_check imap_clearflag_full imap_close imap_create imap_createmailbox imap_delete imap_deletemailbox imap_errors imap_expunge imap_fetch_overview imap_fetchbody imap_fetchheader imap_fetchmime imap_fetchstructure imap_fetchtext imap_gc imap_get_quota imap_get_quotaroot imap_getacl imap_getmailboxes imap_getsubscribed imap_header imap_headerinfo imap_headers imap_last_error imap_list imap_listmailbox imap_listscan imap_listsubscribed imap_lsub imap_mail imap_mail_compose imap_mail_copy imap_mail_move imap_mailboxmsginfo imap_mime_header_decode imap_msgno imap_num_msg imap_num_recent imap_open imap_ping imap_qprint imap_rename imap_renamemailbox imap_reopen imap_rfc822_parse_adrlist imap_rfc822_parse_headers imap_rfc822_write_address imap_savebody imap_scan imap_scanmailbox imap_search imap_set_quota imap_setacl imap_setflag_full imap_sort imap_status imap_subscribe imap_thread imap_timeout imap_uid imap_undelete imap_unsubscribe imap_utf7_decode imap_utf7_encode imap_utf8 implements implode import_request_variables in_array include include_once inet_ntop inet_pton info_all info_configuration info_credits info_environment info_general info_license info_modules info_variables ini_all ini_alter ini_get ini_get_all ini_perdir ini_restore ini_set ini_system ini_user input_cookie input_env input_get input_post input_request input_server input_session instanceof insteadof int int_curr_symbol int_frac_digits integer interface interface_exists intval ip2long iptcembed iptcparse is_a is_array is_bool is_callable is_dir is_double is_executable is_file is_float is_int is_integer is_link is_long is_null is_numeric is_object is_readable is_real is_resource is_scalar is_string is_subclass_of is_uploaded_file is_writable is_writeable isset jddayofweek jdmonthname jdtofrench jdtogregorian jdtojewish jdtojulian jdtounix jewishtojd join jpeg2wbmp json_decode json_encode json_last_error json_last_error_msg juliantojd key key_exists krsort ksort lc_all lc_collate lc_ctype lc_messages lc_monetary lc_numeric lc_time lcfirst lchgrp lchown ldap_8859_to_t61 ldap_add ldap_bind ldap_close ldap_compare ldap_connect ldap_control_paged_result ldap_control_paged_result_response ldap_count_entries ldap_delete ldap_dn2ufn ldap_err2str ldap_errno ldap_error ldap_escape ldap_explode_dn ldap_first_attribute ldap_first_entry ldap_first_reference ldap_free_result ldap_get_attributes ldap_get_dn ldap_get_entries ldap_get_option ldap_get_values ldap_get_values_len ldap_list ldap_mod_add ldap_mod_del ldap_mod_replace ldap_modify ldap_modify_batch ldap_next_attribute ldap_next_entry ldap_next_reference ldap_parse_reference ldap_parse_result ldap_read ldap_rename ldap_sasl_bind ldap_search ldap_set_option ldap_set_rebind_proc ldap_sort ldap_start_tls ldap_t61_to_8859 ldap_unbind levenshtein link linkinfo list localeconv localtime lock_ex lock_nb lock_sh lock_un log_alert log_auth log_authpriv log_cons log_crit log_cron log_daemon log_debug log_emerg log_err log_info log_kern log_local0 log_local1 log_local2 log_local3 log_local4 log_local5 log_local6 log_local7 log_lpr log_mail log_ndelay log_news log_notice log_nowait log_odelay log_perror log_pid log_syslog log_user log_uucp log_warning long2ip lstat ltrim m_1_pi m_2_pi m_2_sqrtpi m_e m_ln10 m_ln2 m_log10e m_log2e m_pi m_pi_2 m_pi_4 m_sqrt1_2 m_sqrt2 magic_quotes_runtime main mcrypt_cbc mcrypt_cfb mcrypt_create_iv mcrypt_decrypt mcrypt_ecb mcrypt_enc_get_algorithms_name mcrypt_enc_get_block_size mcrypt_enc_get_iv_size mcrypt_enc_get_key_size mcrypt_enc_get_modes_name mcrypt_enc_get_supported_key_sizes mcrypt_enc_is_block_algorithm mcrypt_enc_is_block_algorithm_mode mcrypt_enc_is_block_mode mcrypt_enc_self_test mcrypt_encrypt mcrypt_generic mcrypt_generic_deinit mcrypt_generic_end mcrypt_generic_init mcrypt_get_block_size mcrypt_get_cipher_name mcrypt_get_iv_size mcrypt_get_key_size mcrypt_list_algorithms mcrypt_list_modes mcrypt_module_close mcrypt_module_get_algo_block_size mcrypt_module_get_algo_key_size mcrypt_module_get_supported_key_sizes mcrypt_module_is_block_algorithm mcrypt_module_is_block_algorithm_mode mcrypt_module_is_block_mode mcrypt_module_open mcrypt_module_self_test mcrypt_ofb md5 md5_file mdecrypt_generic memory_get_peak_usage memory_get_usage metaphone method_exists mhash mhash_count mhash_get_block_size mhash_get_hash_name mhash_keygen_s2k microtime mime_content_type mkdir mktime mon_1 mon_10 mon_11 mon_12 mon_2 mon_3 mon_4 mon_5 mon_6 mon_7 mon_8 mon_9 mon_decimal_point mon_grouping mon_thousands_sep money_format move_uploaded_file msg_get_queue msg_queue_exists msg_receive msg_remove_queue msg_send msg_set_queue msg_stat_queue n_cs_precedes n_sep_by_space n_sign_posn namespace natcasesort natsort negative_sign new next nl2br nl_langinfo noexpr nostr null number_format ob_clean ob_end_clean ob_end_flush ob_flush ob_get_clean ob_get_contents ob_get_flush ob_get_length ob_get_level ob_get_status ob_gzhandler ob_implicit_flush ob_list_handlers ob_start object ocibindbyname ocicolumnisnull ocicolumnname ocicolumnsize ocicolumntype ocicommit ocidefinebyname ocierror ociexecute ocifetch ocifetchinto ocifetchstatement ocifreestatement ocilogoff ocilogon ocinewcursor ocinewdescriptor ocinlogon ocinumcols ociparse ociplogon ociresult ocirollback ocirowcount ociserverversion ocistatementtype old_function opendir openlog openssl_cipher_iv_length openssl_csr_export openssl_csr_export_to_file openssl_csr_get_public_key openssl_csr_get_subject openssl_csr_new openssl_csr_sign openssl_decrypt openssl_dh_compute_key openssl_digest openssl_encrypt openssl_error_string openssl_free_key openssl_get_cert_locations openssl_get_cipher_methods openssl_get_md_methods openssl_get_privatekey openssl_get_publickey openssl_open openssl_pbkdf2 openssl_pkcs12_export openssl_pkcs12_export_to_file openssl_pkcs12_read openssl_pkcs7_decrypt openssl_pkcs7_encrypt openssl_pkcs7_sign openssl_pkcs7_verify openssl_pkey_export openssl_pkey_export_to_file openssl_pkey_free openssl_pkey_get_details openssl_pkey_get_private openssl_pkey_get_public openssl_pkey_new openssl_private_decrypt openssl_private_encrypt openssl_public_decrypt openssl_public_encrypt openssl_random_pseudo_bytes openssl_seal openssl_sign openssl_spki_export openssl_spki_export_challenge openssl_spki_new openssl_spki_verify openssl_verify openssl_x509_check_private_key openssl_x509_checkpurpose openssl_x509_export openssl_x509_export_to_file openssl_x509_fingerprint openssl_x509_free openssl_x509_parse openssl_x509_read or ord output_add_rewrite_var output_reset_rewrite_vars p_cs_precedes p_sep_by_space p_sign_posn pack parent parse_ini_file parse_ini_string parse_str parse_url passthru path_separator pathinfo pathinfo_basename pathinfo_dirname pathinfo_extension pclose pear_extension_dir pear_install_dir pfsockopen - php_bindir php_check_syntax php_config_file_path php_config_file_scan_dir php_datadir php_debug php_eol php_extension_dir php_extra_version php_ini_loaded_file php_ini_scanned_files php_int_max php_int_size php_libdir php_localstatedir php_logo_guid php_major_version php_mandir php_maxpathlen php_minor_version php_os php_output_handler_clean php_output_handler_cleanable php_output_handler_cont php_output_handler_end php_output_handler_final php_output_handler_flush php_output_handler_flushable php_output_handler_removable php_output_handler_start php_output_handler_stdflags php_output_handler_write php_prefix php_query_rfc1738 php_query_rfc3986 php_release_version php_sapi php_sapi_name php_shlib_suffix php_strip_whitespace php_sysconfdir php_uname php_url_fragment php_url_host php_url_pass php_url_path php_url_port php_url_query php_url_scheme php_url_user php_version php_version_id php_windows_nt_domain_controller php_windows_nt_server php_windows_nt_workstation php_windows_version_build php_windows_version_major php_windows_version_minor php_windows_version_platform php_windows_version_producttype php_windows_version_sp_major php_windows_version_sp_minor php_windows_version_suitemask php_zts phpcredits phpinfo phpversion pm_str png2wbmp popen pos positive_sign prev print print_r printf private proc_close proc_get_status proc_nice proc_open proc_terminate property_exists protected psfs_err_fatal psfs_feed_me psfs_flag_flush_close psfs_flag_flush_inc psfs_flag_normal psfs_pass_on public putenv quoted_printable_decode quoted_printable_encode quotemeta radixchar range rawurldecode rawurlencode readdir readfile readgzfile readlink real realpath realpath_cache_get realpath_cache_size register_shutdown_function register_tick_function rename require require_once reset resource restore_error_handler restore_exception_handler restore_include_path return rewind rewinddir rmdir rsort rtrim scandir seek_cur seek_end seek_set sem_acquire sem_get sem_release sem_remove serialize session_start set_error_handler set_exception_handler set_file_buffer set_include_path set_magic_quotes_runtime set_socket_blocking set_time_limit setcookie setlocale setrawcookie settype sha1 sha1_file shell_exec shm_attach shm_detach shm_get_var shm_has_var shm_put_var shm_remove shm_remove_var show_source shuffle similar_text sizeof sleep socket_get_status socket_set_blocking socket_set_timeout sort sort_asc sort_desc sort_flag_case sort_locale_string sort_natural sort_numeric sort_regular sort_string soundex split spliti sprintf sql_regcase sscanf ssh2_auth_agent ssh2_auth_hostbased_file ssh2_auth_none ssh2_auth_password ssh2_auth_pubkey_file ssh2_connect ssh2_exec ssh2_fetch_stream ssh2_fingerprint ssh2_methods_negotiated ssh2_publickey_add ssh2_publickey_init ssh2_publickey_list ssh2_publickey_remove ssh2_scp_recv ssh2_scp_send ssh2_sftp ssh2_sftp_chmod ssh2_sftp_lstat ssh2_sftp_mkdir ssh2_sftp_readlink ssh2_sftp_realpath ssh2_sftp_rename ssh2_sftp_rmdir ssh2_sftp_stat ssh2_sftp_symlink ssh2_sftp_unlink ssh2_shell ssh2_tunnel stat static stdclass str_getcsv str_ireplace str_pad str_pad_both str_pad_left str_pad_right str_repeat str_replace str_rot13 str_shuffle str_split str_word_count strcasecmp strchr strcmp strcoll strcspn stream_bucket_append stream_bucket_make_writeable stream_bucket_new stream_bucket_prepend stream_cast_as_stream stream_cast_for_select stream_client_async_connect stream_client_connect stream_client_persistent stream_context_create stream_context_get_default stream_context_get_options stream_context_get_params stream_context_set_default stream_context_set_option stream_context_set_params stream_copy_to_stream stream_encoding stream_filter_all stream_filter_append stream_filter_prepend stream_filter_read stream_filter_register stream_filter_remove stream_filter_write stream_get_contents stream_get_filters stream_get_line stream_get_meta_data stream_get_transports stream_get_wrappers stream_ipproto_icmp stream_ipproto_ip stream_ipproto_raw stream_ipproto_tcp stream_ipproto_udp stream_is_local stream_meta_access stream_meta_group stream_meta_group_name stream_meta_owner stream_meta_owner_name stream_meta_touch stream_notification_callback stream_notify_auth_required stream_notify_auth_result stream_notify_completed stream_notify_connect stream_notify_failure stream_notify_file_size_is stream_notify_mime_type_is stream_notify_progress stream_notify_redirected stream_notify_resolve stream_notify_severity_err stream_notify_severity_info stream_notify_severity_warn stream_pf_inet stream_pf_inet6 stream_pf_unix stream_register_wrapper stream_report_errors stream_resolve_include_path stream_select stream_server_bind stream_server_listen stream_set_blocking stream_set_chunk_size stream_set_read_buffer stream_set_timeout stream_set_write_buffer stream_shut_rd stream_shut_rdwr stream_shut_wr stream_sock_dgram stream_sock_raw stream_sock_rdm stream_sock_seqpacket stream_sock_stream stream_socket_accept stream_socket_client stream_socket_enable_crypto stream_socket_get_name stream_socket_pair stream_socket_recvfrom stream_socket_sendto stream_socket_server stream_socket_shutdown stream_supports_lock stream_use_path stream_wrapper_register stream_wrapper_restore stream_wrapper_unregister strftime string strip_tags stripcslashes stripos stripslashes stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpbrk strpos strptime strrchr strrev strripos strrpos strspn strstr strtok strtolower strtotime strtoupper strtr strval substr substr_compare substr_count substr_replace switch symlink sys_get_temp_dir sys_getloadavg syslog system t_fmt t_fmt_ampm tempnam thousands_sep thousep throw time time_nanosleep time_sleep_until timezone_abbreviations_list timezone_identifiers_list timezone_location_get timezone_name_from_abbr timezone_name_get timezone_offset_get timezone_open timezone_transitions_get timezone_version_get tmpfile touch trait trait_exists trigger_error trim true try uasort ucfirst ucwords uksort umask uniqid unixtojd unlink unpack unregister_tick_function unserialize unset urldecode urlencode use user_error usleep usort utf8_decode utf8_encode var var_dump var_export version_compare vfprintf virtual vprintf vsprintf while wordwrap xml_error_string xml_get_current_byte_index xml_get_current_column_number xml_get_current_line_number xml_get_error_code xml_parse xml_parse_into_struct xml_parser_create xml_parser_create_ns xml_parser_free xml_parser_get_option xml_parser_set_option xml_set_character_data_handler xml_set_default_handler xml_set_element_handler xml_set_end_namespace_decl_handler xml_set_external_entity_ref_handler xml_set_notation_decl_handler xml_set_object xml_set_processing_instruction_handler xml_set_start_namespace_decl_handler xml_set_unparsed_entity_decl_handler xor yesexpr yesstr yield zend_logo_guid zend_thread_id zend_version zip_close zip_entry_close zip_entry_compressedsize zip_entry_compressionmethod zip_entry_filesize zip_entry_name zip_entry_open zip_entry_read zip_open zip_read zlib_decode zlib_encode zlib_get_coding_type - sqlite_valid sqlite_unbuffered_query sqlite_udf_encode_binary sqlite_udf_decode_binary sqlite_single_query sqlite_seek sqlite_rewind sqlite_query sqlite_prev sqlite_popen sqlite_open sqlite_num_rows sqlite_num_fields sqlite_next sqlite_libversion sqlite_libencoding sqlite_last_insert_rowid sqlite_last_error sqlite_key sqlite_has_prev sqlite_has_more sqlite_field_name sqlite_fetch_string sqlite_fetch_single sqlite_fetch_object sqlite_fetch_column_types sqlite_fetch_array sqlite_fetch_all sqlite_factory sqlite_exec sqlite_escape_string sqlite_error_string sqlite_current sqlite_create_function sqlite_create_aggregate sqlite_column sqlite_close sqlite_changes sqlite_busy_timeout sqlite_array_query odbc_tables odbc_tableprivileges odbc_statistics odbc_specialcolumns odbc_setoption odbc_rollback odbc_result_all odbc_result odbc_procedures odbc_procedurecolumns odbc_primarykeys odbc_prepare odbc_pconnect odbc_num_rows odbc_num_fields odbc_next_result odbc_longreadlen odbc_gettypeinfo odbc_free_result odbc_foreignkeys odbc_field_type odbc_field_scale odbc_field_precision odbc_field_num odbc_field_name odbc_field_len odbc_fetch_row odbc_fetch_object odbc_fetch_into odbc_fetch_array odbc_execute odbc_exec odbc_errormsg odbc_error odbc_do odbc_data_source odbc_cursor odbc_connect odbc_commit odbc_columns odbc_columnprivileges odbc_close_all odbc_close odbc_binmode odbc_autocommit mysqli_warning_count mysqli_use_result mysqli_thread_safe mysqli_thread_id mysqli_store_result mysqli_stmt_store_result mysqli_stmt_sqlstate mysqli_stmt_send_long_data mysqli_stmt_result_metadata mysqli_stmt_reset mysqli_stmt_prepare mysqli_stmt_param_count mysqli_stmt_num_rows mysqli_stmt_next_result mysqli_stmt_more_results mysqli_stmt_insert_id mysqli_stmt_init mysqli_stmt_get_warnings mysqli_stmt_get_result mysqli_stmt_free_result mysqli_stmt_field_count mysqli_stmt_fetch mysqli_stmt_execute mysqli_stmt_error mysqli_stmt_errno mysqli_stmt_data_seek mysqli_stmt_close mysqli_stmt_bind_result mysqli_stmt_bind_param mysqli_stmt_attr_set mysqli_stmt_attr_get mysqli_stmt_affected_rows mysqli_stat mysqli_ssl_set mysqli_sqlstate mysqli_set_opt mysqli_set_local_infile_handler mysqli_set_local_infile_default mysqli_set_charset mysqli_send_long_data mysqli_select_db mysqli_rollback mysqli_refresh mysqli_real_query mysqli_real_escape_string mysqli_real_connect mysqli_query mysqli_prepare mysqli_ping mysqli_param_count mysqli_num_rows mysqli_num_fields mysqli_next_result mysqli_multi_query mysqli_more_results mysqli_kill mysqli_insert_id mysqli_init mysqli_info mysqli_get_warnings mysqli_get_server_version mysqli_get_server_info mysqli_get_proto_info mysqli_get_metadata mysqli_get_host_info mysqli_get_connection_stats mysqli_get_client_version mysqli_get_client_stats mysqli_get_client_info mysqli_get_charset mysqli_get_cache_stats mysqli_free_result mysqli_field_tell mysqli_field_seek mysqli_field_count mysqli_fetch_row mysqli_fetch_object mysqli_fetch_lengths mysqli_fetch_fields mysqli_fetch_field_direct mysqli_fetch_field mysqli_fetch_assoc mysqli_fetch_array mysqli_fetch_all mysqli_fetch mysqli_execute mysqli_escape_string mysqli_error mysqli_errno mysqli_embedded_server_start mysqli_embedded_server_end mysqli_dump_debug_info mysqli_debug mysqli_data_seek mysqli_connect_error mysqli_connect_errno mysqli_connect mysqli_commit mysqli_close mysqli_client_encoding mysqli_change_user mysqli_bind_result mysqli_bind_param mysqli_autocommit mysqli_affected_rows mysql_unbuffered_query mysql_thread_id mysql_tablename mysql_stat mysql_set_charset mysql_select_db mysql_result mysql_real_escape_string mysql_query mysql_ping mysql_pconnect mysql_num_rows mysql_num_fields mysql_list_tables mysql_list_processes mysql_list_fields mysql_list_dbs mysql_insert_id mysql_info mysql_get_server_info mysql_get_proto_info mysql_get_host_info mysql_get_client_info mysql_free_result mysql_field_type mysql_field_table mysql_field_seek mysql_field_name mysql_field_len mysql_field_flags mysql_fetch_row mysql_fetch_object mysql_fetch_lengths mysql_fetch_field mysql_fetch_assoc mysql_fetch_array mysql_escape_string mysql_error mysql_errno mysql_drop_db mysql_db_query mysql_db_name mysql_data_seek mysql_create_db mysql_connect mysql_close mysql_client_encoding mysql_affected_rows mssql_select_db mssql_rows_affected mssql_result mssql_query mssql_pconnect mssql_num_rows mssql_num_fields mssql_next_result mssql_min_message_severity mssql_min_error_severity mssql_init mssql_guid_string mssql_get_last_message mssql_free_statement mssql_free_result mssql_field_type mssql_field_seek mssql_field_name mssql_field_length mssql_fetch_row mssql_fetch_object mssql_fetch_field mssql_fetch_batch mssql_fetch_assoc mssql_fetch_array mssql_execute mssql_data_seek mssql_connect mssql_close mssql_bind msql_select_db msql_result msql_regcase msql_query msql_pconnect msql_numrows msql_numfields msql_num_rows msql_num_fields msql_list_tables msql_list_fields msql_list_dbs msql_free_result msql_fieldtype msql_fieldtable msql_fieldname msql_fieldlen msql_fieldflags msql_field_type msql_field_table msql_field_seek msql_field_name msql_field_len msql_field_flags msql_fetch_row msql_fetch_object msql_fetch_field msql_fetch_array msql_error msql_drop_db msql_dbname msql_db_query msql_data_seek msql_createdb msql_create_db msql_connect msql_close msql_affected_rows msql maxdb_warning_count maxdb_use_result maxdb_thread_safe maxdb_thread_id maxdb_store_result maxdb_stmt_store_result maxdb_stmt_sqlstate maxdb_stmt_send_long_data maxdb_stmt_result_metadata maxdb_stmt_reset maxdb_stmt_prepare maxdb_stmt_param_count maxdb_stmt_num_rows maxdb_stmt_init maxdb_stmt_free_result maxdb_stmt_fetch maxdb_stmt_execute maxdb_stmt_error maxdb_stmt_errno maxdb_stmt_data_seek maxdb_stmt_close_long_data maxdb_stmt_close maxdb_stmt_bind_result maxdb_stmt_bind_param maxdb_stmt_affected_rows maxdb_stat maxdb_ssl_set maxdb_sqlstate maxdb_set_opt maxdb_server_init maxdb_server_end maxdb_send_query maxdb_send_long_data maxdb_select_db maxdb_rpl_query_type maxdb_rpl_probe maxdb_rpl_parse_enabled maxdb_rollback maxdb_report maxdb_real_query maxdb_real_escape_string maxdb_real_connect maxdb_query maxdb_prepare maxdb_ping maxdb_param_count maxdb_options maxdb_num_rows maxdb_num_fields maxdb_next_result maxdb_multi_query maxdb_more_results maxdb_master_query maxdb_kill maxdb_insert_id maxdb_init maxdb_info maxdb_get_server_version maxdb_get_server_info maxdb_get_proto_info maxdb_get_metadata maxdb_get_host_info maxdb_get_client_version maxdb_get_client_info maxdb_free_result maxdb_field_tell maxdb_field_seek maxdb_field_count maxdb_fetch_row maxdb_fetch_object maxdb_fetch_lengths maxdb_fetch_fields maxdb_fetch_field_direct maxdb_fetch_field maxdb_fetch_assoc maxdb_fetch_array maxdb_fetch maxdb_execute maxdb_escape_string maxdb_error maxdb_errno maxdb_enable_rpl_parse maxdb_enable_reads_from_master maxdb_embedded_connect maxdb_dump_debug_info maxdb_disable_rpl_parse maxdb_disable_reads_from_master maxdb_debug maxdb_data_seek maxdb_connect_error maxdb_connect_errno maxdb_connect maxdb_commit maxdb_close_long_data maxdb_close maxdb_client_encoding maxdb_character_set_name maxdb_change_user maxdb_bind_result maxdb_bind_param maxdb_autocommit maxdb_affected_rows dba_sync dba_replace dba_popen dba_optimize dba_open dba_nextkey dba_list dba_key_split dba_insert dba_handlers dba_firstkey dba_fetch dba_exists dba_delete dba_close chdb_create + __autoload __class__ __compiler_halt_offset__ __construct __destruct __dir__ __file__ __function__ __halt_compiler __line__ __method__ __namespace__ __sleep __trait__ __wakeup _cookie _files _get _post abday_1 abday_2 abday_3 abday_4 abday_5 abday_6 abday_7 abmon_1 abmon_10 abmon_11 abmon_12 abmon_2 abmon_3 abmon_4 abmon_5 abmon_6 abmon_7 abmon_8 abmon_9 abs abstract acos acosh addcslashes addslashes af_inet af_inet6 af_unix al_bits al_buffer al_channels al_cone_inner_angle al_cone_outer_angle al_cone_outer_gain al_direction al_false al_format_mono16 al_format_mono8 al_format_stereo16 al_format_stereo8 al_frequency al_gain al_initial al_looping al_max_distance al_max_gain al_min_gain al_orientation al_paused al_pitch al_playing al_position al_reference_distance al_rolloff_factor al_size al_source_relative al_source_state al_stopped al_true al_velocity alc_frequency alc_refresh alc_sync alt_digits am_str and apache_child_terminate apache_get_modules apache_get_version apache_getenv apache_lookup_uri apache_map apache_note apache_request_headers apache_reset_timeout apache_response_headers apache_setenv apc_add apc_bin_dump apc_bin_dumpfile apc_bin_load apc_bin_loadfile apc_bin_verify_crc32 apc_bin_verify_md5 apc_cache_info apc_cas apc_clear_cache apc_compile_file apc_dec apc_define_constants apc_delete apc_delete_file apc_exists apc_fetch apc_inc apc_iter_all apc_iter_atime apc_iter_ctime apc_iter_device apc_iter_dtime apc_iter_filename apc_iter_inode apc_iter_key apc_iter_md5 apc_iter_mem_size apc_iter_mtime apc_iter_none apc_iter_num_hits apc_iter_refcount apc_iter_ttl apc_iter_type apc_iter_value apc_list_active apc_list_deleted apc_load_constants apc_sma_info apc_store apd_breakpoint apd_callstack apd_clunk apd_continue apd_croak apd_dump_function_table apd_dump_persistent_resources apd_dump_regular_resources apd_echo apd_get_active_symbols apd_set_pprof_trace apd_set_session apd_set_session_trace apd_set_session_trace_socket apd_version args_trace array array_change_key_case array_chunk array_column array_combine array_count_values array_diff array_diff_assoc array_diff_key array_diff_uassoc array_diff_ukey array_fill array_fill_keys array_filter array_filter_use_both array_filter_use_key array_flip array_intersect array_intersect_assoc array_intersect_key array_intersect_uassoc array_intersect_ukey array_key_exists array_keys array_map array_merge array_merge_recursive array_multisort array_pad array_pop array_product array_push array_rand array_reduce array_replace array_replace_recursive array_reverse array_search array_shift array_slice array_sort array_splice array_sum array_udiff array_udiff_assoc array_udiff_uassoc array_uintersect array_uintersect_assoc array_uintersect_uassoc array_unique array_unshift array_values array_walk array_walk_recursive arrayaccess arrayiterator arrayobject arsort as asin asinh asort assert assert_active assert_bail assert_callback assert_options assert_quiet_eval assert_warning assignment_trace atan atan2 atanh base64_decode base64_encode base_convert basename bbcode_add_element bbcode_add_smiley bbcode_arg_double_quote bbcode_arg_html_quote bbcode_arg_quote_escaping bbcode_arg_single_quote bbcode_auto_correct bbcode_correct_reopen_tags bbcode_create bbcode_default_smileys_off bbcode_default_smileys_on bbcode_destroy bbcode_disable_tree_build bbcode_flags_arg_parsing bbcode_flags_cdata_not_allowed bbcode_flags_deny_reopen_child bbcode_flags_one_open_per_level bbcode_flags_remove_if_empty bbcode_flags_smileys_off bbcode_flags_smileys_on bbcode_force_smileys_off bbcode_parse bbcode_set_arg_parser bbcode_set_flags bbcode_set_flags_add bbcode_set_flags_remove bbcode_set_flags_set bbcode_smileys_case_insensitive bbcode_type_arg bbcode_type_noarg bbcode_type_optarg bbcode_type_root bbcode_type_single bcadd bccomp bcdiv bcmod bcmul bcompiler_load bcompiler_load_exe bcompiler_parse_class bcompiler_read bcompiler_write_class bcompiler_write_constant bcompiler_write_exe_footer bcompiler_write_file bcompiler_write_footer bcompiler_write_function bcompiler_write_functions_from_file bcompiler_write_header bcompiler_write_included_filename bcpow bcpowmod bcscale bcsqrt bcsub bin2hex bind_textdomain_codeset bindec bindtextdomain blenc_encrypt blenc_ext_version bool boolean boolval break bson_decode bson_encode bus_adraln bus_adrerr bus_objerr bzclose bzcompress bzdecompress bzerrno bzerror bzerrstr bzflush bzopen bzread bzwrite cairo_antialias_default cairo_antialias_gray cairo_antialias_none cairo_antialias_subpixel cairo_content_alpha cairo_content_color cairo_content_color_alpha cairo_create cairo_extend_none cairo_extend_pad cairo_extend_reflect cairo_extend_repeat cairo_fill_rule_even_odd cairo_fill_rule_winding cairo_filter_best cairo_filter_bilinear cairo_filter_fast cairo_filter_gaussian cairo_filter_good cairo_filter_nearest cairo_font_face_get_type cairo_font_face_status cairo_font_options_create cairo_font_options_equal cairo_font_options_get_antialias cairo_font_options_get_hint_metrics cairo_font_options_get_hint_style cairo_font_options_get_subpixel_order cairo_font_options_hash cairo_font_options_merge cairo_font_options_set_antialias cairo_font_options_set_hint_metrics cairo_font_options_set_hint_style cairo_font_options_set_subpixel_order cairo_font_options_status cairo_font_slant_italic cairo_font_slant_normal cairo_font_slant_oblique cairo_font_type_ft cairo_font_type_quartz cairo_font_type_toy cairo_font_type_win32 cairo_font_weight_bold cairo_font_weight_normal cairo_format_a1 cairo_format_a8 cairo_format_argb32 cairo_format_rgb24 cairo_format_stride_for_width cairo_hint_metrics_default cairo_hint_metrics_off cairo_hint_metrics_on cairo_hint_style_default cairo_hint_style_full cairo_hint_style_medium cairo_hint_style_none cairo_hint_style_slight cairo_image_surface_create cairo_image_surface_create_for_data cairo_image_surface_create_from_png cairo_image_surface_get_data cairo_image_surface_get_format cairo_image_surface_get_height cairo_image_surface_get_stride cairo_image_surface_get_width cairo_line_cap_butt cairo_line_cap_round cairo_line_cap_square cairo_line_join_bevel cairo_line_join_miter cairo_line_join_round cairo_matrix_create_scale cairo_matrix_create_translate cairo_matrix_invert cairo_matrix_multiply cairo_matrix_rotate cairo_matrix_transform_distance cairo_matrix_transform_point cairo_matrix_translate cairo_operator_add cairo_operator_atop cairo_operator_clear cairo_operator_dest cairo_operator_dest_atop cairo_operator_dest_in cairo_operator_dest_out cairo_operator_dest_over cairo_operator_in cairo_operator_out cairo_operator_over cairo_operator_saturate cairo_operator_source cairo_operator_xor cairo_pattern_add_color_stop_rgb cairo_pattern_add_color_stop_rgba cairo_pattern_create_for_surface cairo_pattern_create_linear cairo_pattern_create_radial cairo_pattern_create_rgb cairo_pattern_create_rgba cairo_pattern_get_color_stop_count cairo_pattern_get_color_stop_rgba cairo_pattern_get_extend cairo_pattern_get_filter cairo_pattern_get_linear_points cairo_pattern_get_matrix cairo_pattern_get_radial_circles cairo_pattern_get_rgba cairo_pattern_get_surface cairo_pattern_get_type cairo_pattern_set_extend cairo_pattern_set_filter cairo_pattern_set_matrix cairo_pattern_status cairo_pattern_type_linear cairo_pattern_type_radial cairo_pattern_type_solid cairo_pattern_type_surface cairo_pdf_surface_create cairo_pdf_surface_set_size cairo_ps_get_levels cairo_ps_level_2 cairo_ps_level_3 cairo_ps_level_to_string cairo_ps_surface_create cairo_ps_surface_dsc_begin_page_setup cairo_ps_surface_dsc_begin_setup cairo_ps_surface_dsc_comment cairo_ps_surface_get_eps cairo_ps_surface_restrict_to_level cairo_ps_surface_set_eps cairo_ps_surface_set_size cairo_scaled_font_create cairo_scaled_font_extents cairo_scaled_font_get_ctm cairo_scaled_font_get_font_face cairo_scaled_font_get_font_matrix cairo_scaled_font_get_font_options cairo_scaled_font_get_scale_matrix cairo_scaled_font_get_type cairo_scaled_font_glyph_extents cairo_scaled_font_status cairo_scaled_font_text_extents cairo_status_clip_not_representable cairo_status_file_not_found cairo_status_invalid_content cairo_status_invalid_dash cairo_status_invalid_dsc_comment cairo_status_invalid_format cairo_status_invalid_index cairo_status_invalid_matrix cairo_status_invalid_path_data cairo_status_invalid_pop_group cairo_status_invalid_restore cairo_status_invalid_status cairo_status_invalid_stride cairo_status_invalid_string cairo_status_invalid_visual cairo_status_no_current_point cairo_status_no_memory cairo_status_null_pointer cairo_status_pattern_type_mismatch cairo_status_read_error cairo_status_success cairo_status_surface_finished cairo_status_surface_type_mismatch cairo_status_temp_file_error cairo_status_write_error cairo_subpixel_order_bgr cairo_subpixel_order_default cairo_subpixel_order_rgb cairo_subpixel_order_vbgr cairo_subpixel_order_vrgb cairo_surface_copy_page cairo_surface_create_similar cairo_surface_finish cairo_surface_flush cairo_surface_get_content cairo_surface_get_device_offset cairo_surface_get_font_options cairo_surface_get_type cairo_surface_mark_dirty cairo_surface_mark_dirty_rectangle cairo_surface_set_device_offset cairo_surface_set_fallback_resolution cairo_surface_show_page cairo_surface_status cairo_surface_type_beos cairo_surface_type_directfb cairo_surface_type_glitz cairo_surface_type_image cairo_surface_type_os2 cairo_surface_type_pdf cairo_surface_type_ps cairo_surface_type_quartz cairo_surface_type_quartz_image cairo_surface_type_svg cairo_surface_type_win32 cairo_surface_type_win32_printing cairo_surface_type_xcb cairo_surface_type_xlib cairo_surface_write_to_png cairo_svg_surface_create cairo_svg_surface_restrict_to_version cairo_svg_version_1_1 cairo_svg_version_1_2 + cairo_svg_version_to_string cal_days_in_month cal_dow_dayno cal_dow_long cal_dow_short cal_easter_always_gregorian cal_easter_always_julian cal_easter_default cal_easter_roman cal_french cal_from_jd cal_gregorian cal_info cal_jewish cal_jewish_add_alafim cal_jewish_add_alafim_geresh cal_jewish_add_gereshayim cal_julian cal_month_french cal_month_gregorian_long cal_month_gregorian_short cal_month_jewish cal_month_julian_long cal_month_julian_short cal_num_cals cal_to_jd calcul_hmac calculhmac call_user_func call_user_func_array call_user_method call_user_method_array callable case case_lower case_upper catch ceil cfunction char_max chdb_create chdir checkdate checkdnsrr chgrp chmod chop chown chr chroot chunk_split cl_expunge class class_alias class_exists class_implements class_parents class_uses cld_continued cld_dumped cld_exited cld_killed cld_stopped cld_trapped clearstatcache cli_get_process_title cli_set_process_title clone closedir closelog clsctx_all clsctx_inproc_handler clsctx_inproc_server clsctx_local_server clsctx_remote_server clsctx_server codeset collator_asort collator_compare collator_create collator_get_attribute collator_get_error_code collator_get_error_message collator_get_locale collator_get_sort_key collator_get_strength collator_set_attribute collator_set_strength collator_sort collator_sort_with_sort_keys com_create_guid com_event_sink com_get com_get_active_object com_invoke com_load com_load_typelib com_message_pump com_print_typeinfo com_propget com_propput com_set compact connection_aborted connection_normal connection_status connection_timeout const constant continue convert_cyr_string convert_uudecode convert_uuencode copy cos cosh count count_chars count_normal count_recursive cp_acp cp_maccp cp_move cp_oemcp cp_symbol cp_thread_acp cp_uid cp_utf7 cp_utf8 crc32 create_function credits_all credits_docs credits_fullpage credits_general credits_group credits_modules credits_qa credits_sapi crncystr crypt crypt_blowfish crypt_ext_des crypt_md5 crypt_salt_length crypt_sha256 crypt_sha512 crypt_std_des ctype_alnum ctype_alpha ctype_cntrl ctype_digit ctype_graph ctype_lower ctype_print ctype_punct ctype_space ctype_upper ctype_xdigit cubrid_affected_rows cubrid_assoc cubrid_async cubrid_autocommit_false cubrid_autocommit_true cubrid_bind cubrid_both cubrid_client_encoding cubrid_close cubrid_close_prepare cubrid_close_request cubrid_col_get cubrid_col_size cubrid_column_names cubrid_column_types cubrid_commit cubrid_connect cubrid_connect_with_url cubrid_current_oid cubrid_cursor_current cubrid_cursor_error cubrid_cursor_first cubrid_cursor_last cubrid_cursor_success cubrid_data_seek cubrid_db_name cubrid_disconnect cubrid_drop cubrid_errno cubrid_error cubrid_error_code cubrid_error_code_facility cubrid_error_msg cubrid_exec_query_all cubrid_execute cubrid_facility_cas cubrid_facility_cci cubrid_facility_client cubrid_facility_dbms cubrid_fetch cubrid_fetch_array cubrid_fetch_assoc cubrid_fetch_field cubrid_fetch_lengths cubrid_fetch_object cubrid_fetch_row cubrid_field_flags cubrid_field_len cubrid_field_name cubrid_field_seek cubrid_field_table cubrid_field_type cubrid_free_result cubrid_get cubrid_get_autocommit cubrid_get_charset cubrid_get_class_name cubrid_get_client_info cubrid_get_db_parameter cubrid_get_query_timeout cubrid_get_server_info cubrid_include_oid cubrid_insert_id cubrid_is_instance cubrid_list_dbs cubrid_lob cubrid_lob2_bind cubrid_lob2_close cubrid_lob2_export cubrid_lob2_import cubrid_lob2_new cubrid_lob2_read cubrid_lob2_seek cubrid_lob2_seek64 cubrid_lob2_size cubrid_lob2_size64 cubrid_lob2_tell cubrid_lob2_tell64 cubrid_lob2_write cubrid_lob_close cubrid_lob_export cubrid_lob_get cubrid_lob_send cubrid_lob_size cubrid_lock_read cubrid_lock_write cubrid_move_cursor cubrid_next_result cubrid_no_more_data cubrid_num cubrid_num_cols cubrid_num_fields cubrid_num_rows cubrid_object cubrid_param_isolation_level cubrid_param_lock_timeout cubrid_pconnect cubrid_pconnect_with_url cubrid_ping cubrid_prepare cubrid_put cubrid_query cubrid_real_escape_string cubrid_result cubrid_rollback cubrid_sch_attr_privilege cubrid_sch_attribute cubrid_sch_class cubrid_sch_class_attribute cubrid_sch_class_method cubrid_sch_class_privilege cubrid_sch_constraint cubrid_sch_cross_reference cubrid_sch_direct_super_class cubrid_sch_exported_keys cubrid_sch_imported_keys cubrid_sch_method cubrid_sch_method_file cubrid_sch_primary_key cubrid_sch_query_spec cubrid_sch_subclass cubrid_sch_superclass cubrid_sch_trigger cubrid_sch_vclass cubrid_schema cubrid_seq_drop cubrid_seq_insert cubrid_seq_put cubrid_set_add cubrid_set_autocommit cubrid_set_db_parameter cubrid_set_drop cubrid_set_query_timeout cubrid_unbuffered_query cubrid_version curl_close curl_copy_handle curl_errno curl_error curl_escape curl_exec curl_file_create curl_fnmatchfunc_fail curl_fnmatchfunc_match curl_fnmatchfunc_nomatch curl_getinfo curl_http_version_1_0 curl_http_version_1_1 curl_http_version_2_0 curl_http_version_none curl_init curl_ipresolve_v4 curl_ipresolve_v6 curl_ipresolve_whatever curl_lock_data_cookie curl_lock_data_dns curl_lock_data_ssl_session curl_multi_add_handle curl_multi_close curl_multi_exec curl_multi_getcontent curl_multi_info_read curl_multi_init curl_multi_remove_handle curl_multi_select curl_multi_setopt curl_multi_strerror curl_netrc_ignored curl_netrc_optional curl_netrc_required curl_pause curl_readfunc_pause curl_reset curl_rtspreq_announce curl_rtspreq_describe curl_rtspreq_get_parameter curl_rtspreq_options curl_rtspreq_pause curl_rtspreq_play curl_rtspreq_receive curl_rtspreq_record curl_rtspreq_set_parameter curl_rtspreq_setup curl_rtspreq_teardown curl_setopt curl_setopt_array curl_share_close curl_share_init curl_share_setopt curl_sslversion_default curl_sslversion_sslv2 curl_sslversion_sslv3 curl_sslversion_tlsv1 curl_sslversion_tlsv1_0 curl_sslversion_tlsv1_1 curl_sslversion_tlsv1_2 curl_strerror curl_timecond_ifmodsince curl_timecond_ifunmodsince curl_timecond_lastmod curl_timecond_none curl_tlsauth_srp curl_unescape curl_version curl_version_http2 curl_version_ipv6 curl_version_kerberos4 curl_version_libz curl_version_ssl curl_wrappers_enabled curl_writefunc_pause curlauth_any curlauth_anysafe curlauth_basic curlauth_digest curlauth_digest_ie curlauth_gssnegotiate curlauth_none curlauth_ntlm curlauth_only curlclosepolicy_callback curlclosepolicy_least_recently_used curlclosepolicy_least_traffic curlclosepolicy_oldest curlclosepolicy_slowest curle_aborted_by_callback curle_bad_calling_order curle_bad_content_encoding curle_bad_download_resume curle_bad_function_argument curle_bad_password_entered curle_couldnt_connect curle_couldnt_resolve_host curle_couldnt_resolve_proxy curle_failed_init curle_file_couldnt_read_file curle_filesize_exceeded curle_ftp_access_denied curle_ftp_bad_download_resume curle_ftp_cant_get_host curle_ftp_cant_reconnect curle_ftp_couldnt_get_size curle_ftp_couldnt_retr_file curle_ftp_couldnt_set_ascii curle_ftp_couldnt_set_binary curle_ftp_couldnt_stor_file curle_ftp_couldnt_use_rest curle_ftp_partial_file curle_ftp_port_failed curle_ftp_quote_error curle_ftp_ssl_failed curle_ftp_user_password_incorrect curle_ftp_weird_227_format curle_ftp_weird_pass_reply curle_ftp_weird_pasv_reply curle_ftp_weird_server_reply curle_ftp_weird_user_reply curle_ftp_write_error curle_function_not_found curle_got_nothing curle_http_not_found curle_http_port_failed curle_http_post_error curle_http_range_error curle_http_returned_error curle_ldap_cannot_bind curle_ldap_invalid_url curle_ldap_search_failed curle_library_not_found curle_malformat_user curle_obsolete curle_ok curle_operation_timedout curle_operation_timeouted curle_out_of_memory curle_partial_file curle_read_error curle_recv_error curle_send_error curle_share_in_use curle_ssh curle_ssl_cacert curle_ssl_certproblem curle_ssl_cipher curle_ssl_connect_error curle_ssl_engine_notfound curle_ssl_engine_setfailed curle_ssl_peer_certificate curle_telnet_option_syntax curle_too_many_redirects curle_unknown_telnet_option curle_unsupported_protocol curle_url_malformat curle_url_malformat_user curle_write_error curlftpauth_default curlftpauth_ssl curlftpauth_tls curlftpmethod_multicwd curlftpmethod_nocwd curlftpmethod_singlecwd curlftpssl_all curlftpssl_ccc_active curlftpssl_ccc_none curlftpssl_ccc_passive curlftpssl_control curlftpssl_none curlftpssl_try curlgssapi_delegation_flag curlgssapi_delegation_policy_flag curlinfo_appconnect_time curlinfo_certinfo curlinfo_condition_unmet curlinfo_connect_time curlinfo_content_length_download curlinfo_content_length_upload curlinfo_content_type curlinfo_cookielist curlinfo_effective_url curlinfo_filetime curlinfo_ftp_entry_path curlinfo_header_out curlinfo_header_size curlinfo_http_code curlinfo_http_connectcode curlinfo_httpauth_avail curlinfo_lastone curlinfo_local_ip curlinfo_local_port curlinfo_namelookup_time curlinfo_num_connects curlinfo_os_errno curlinfo_pretransfer_time curlinfo_primary_ip curlinfo_primary_port curlinfo_private curlinfo_proxyauth_avail curlinfo_redirect_count curlinfo_redirect_time curlinfo_redirect_url curlinfo_request_size curlinfo_response_code curlinfo_rtsp_client_cseq curlinfo_rtsp_cseq_recv curlinfo_rtsp_server_cseq curlinfo_rtsp_session_id curlinfo_size_download curlinfo_size_upload curlinfo_speed_download curlinfo_speed_upload curlinfo_ssl_engines curlinfo_ssl_verifyresult curlinfo_starttransfer_time curlinfo_total_time curlm_bad_easy_handle curlm_bad_handle curlm_call_multi_perform curlm_internal_error curlm_ok curlm_out_of_memory curlmopt_maxconnects curlmopt_pipelining curlmsg_done curlopt_accept_encoding curlopt_accepttimeout_ms curlopt_address_scope curlopt_append curlopt_autoreferer curlopt_binarytransfer curlopt_buffersize curlopt_cainfo + curlopt_capath curlopt_certinfo curlopt_closepolicy curlopt_connect_only curlopt_connecttimeout curlopt_connecttimeout_ms curlopt_cookie curlopt_cookiefile curlopt_cookiejar curlopt_cookielist curlopt_cookiesession curlopt_crlf curlopt_crlfile curlopt_customrequest curlopt_dirlistonly curlopt_dns_cache_timeout curlopt_dns_servers curlopt_dns_use_global_cache curlopt_egdsocket curlopt_encoding curlopt_failonerror curlopt_file curlopt_filetime curlopt_fnmatch_function curlopt_followlocation curlopt_forbid_reuse curlopt_fresh_connect curlopt_ftp_account curlopt_ftp_alternative_to_user curlopt_ftp_create_missing_dirs curlopt_ftp_filemethod curlopt_ftp_response_timeout curlopt_ftp_skip_pasv_ip curlopt_ftp_ssl curlopt_ftp_ssl_ccc curlopt_ftp_use_eprt curlopt_ftp_use_epsv curlopt_ftp_use_pret curlopt_ftpappend curlopt_ftpascii curlopt_ftplistonly curlopt_ftpport curlopt_ftpsslauth curlopt_gssapi_delegation curlopt_header curlopt_headerfunction curlopt_http200aliases curlopt_http_content_decoding curlopt_http_transfer_decoding curlopt_http_version curlopt_httpauth curlopt_httpget curlopt_httpheader curlopt_httpproxytunnel curlopt_ignore_content_length curlopt_infile curlopt_infilesize curlopt_interface curlopt_ipresolve curlopt_issuercert curlopt_keypasswd curlopt_krb4level curlopt_krblevel curlopt_localport curlopt_localportrange curlopt_low_speed_limit curlopt_low_speed_time curlopt_mail_auth curlopt_mail_from curlopt_mail_rcpt curlopt_max_recv_speed_large curlopt_max_send_speed_large curlopt_maxconnects curlopt_maxfilesize curlopt_maxredirs curlopt_mute curlopt_netrc curlopt_netrc_file curlopt_new_directory_perms curlopt_new_file_perms curlopt_nobody curlopt_noprogress curlopt_noproxy curlopt_nosignal curlopt_passwdfunction curlopt_password curlopt_port curlopt_post curlopt_postfields curlopt_postquote curlopt_postredir curlopt_prequote curlopt_private curlopt_progressfunction curlopt_protocols curlopt_proxy curlopt_proxy_transfer_mode curlopt_proxyauth curlopt_proxypassword curlopt_proxyport curlopt_proxytype curlopt_proxyusername curlopt_proxyuserpwd curlopt_put curlopt_quote curlopt_random_file curlopt_range curlopt_readdata curlopt_readfunction curlopt_redir_protocols curlopt_referer curlopt_resolve curlopt_resume_from curlopt_returntransfer curlopt_rtsp_client_cseq curlopt_rtsp_request curlopt_rtsp_server_cseq curlopt_rtsp_session_id curlopt_rtsp_stream_uri curlopt_rtsp_transport curlopt_safe_upload curlopt_share curlopt_socks5_gssapi_nec curlopt_socks5_gssapi_service curlopt_ssh_auth_types curlopt_ssh_host_public_key_md5 curlopt_ssh_knownhosts curlopt_ssh_private_keyfile curlopt_ssh_public_keyfile curlopt_ssl_cipher_list curlopt_ssl_options curlopt_ssl_sessionid_cache curlopt_ssl_verifyhost curlopt_ssl_verifypeer curlopt_sslcert curlopt_sslcertpasswd curlopt_sslcerttype curlopt_sslengine curlopt_sslengine_default curlopt_sslkey curlopt_sslkeypasswd curlopt_sslkeytype curlopt_sslversion curlopt_stderr curlopt_tcp_keepalive curlopt_tcp_keepidle curlopt_tcp_keepintvl curlopt_tcp_nodelay curlopt_telnetoptions curlopt_tftp_blksize curlopt_timecondition curlopt_timeout curlopt_timeout_ms curlopt_timevalue curlopt_tlsauth_password curlopt_tlsauth_type curlopt_tlsauth_username curlopt_transfer_encoding curlopt_transfertext curlopt_unrestricted_auth curlopt_upload curlopt_url curlopt_use_ssl curlopt_useragent curlopt_username curlopt_userpwd curlopt_verbose curlopt_wildcardmatch curlopt_writefunction curlopt_writeheader curlpause_all curlpause_cont curlpause_recv curlpause_recv_cont curlpause_send curlpause_send_cont curlproto_all curlproto_dict curlproto_file curlproto_ftp curlproto_ftps curlproto_gopher curlproto_http curlproto_https curlproto_imap curlproto_imaps curlproto_ldap curlproto_ldaps curlproto_pop3 curlproto_pop3s curlproto_rtmp curlproto_rtmpe curlproto_rtmps curlproto_rtmpt curlproto_rtmpte curlproto_rtmpts curlproto_rtsp curlproto_scp curlproto_sftp curlproto_smtp curlproto_smtps curlproto_telnet curlproto_tftp curlproxy_http curlproxy_socks4 curlproxy_socks4a curlproxy_socks5 curlproxy_socks5_hostname curlshopt_none curlshopt_share curlshopt_unshare curlssh_auth_any curlssh_auth_default curlssh_auth_host curlssh_auth_keyboard curlssh_auth_none curlssh_auth_password curlssh_auth_publickey curlsslopt_allow_beast curlusessl_all curlusessl_control curlusessl_none curlusessl_try curlversion_now currency_symbol current cyrus_authenticate cyrus_bind cyrus_callback_noliteral cyrus_callback_numbered cyrus_close cyrus_conn_initialresponse cyrus_conn_nonsyncliteral cyrus_connect cyrus_query cyrus_unbind d_fmt d_t_fmt date date_add date_atom date_cookie date_create date_create_from_format date_create_immutable date_create_immutable_from_format date_date_set date_default_timezone_get date_default_timezone_set date_diff date_format date_get_last_errors date_interval_create_from_date_string date_interval_format date_iso8601 date_isodate_set date_modify date_offset_get date_parse date_parse_from_format date_rfc1036 date_rfc1123 date_rfc2822 date_rfc3339 date_rfc822 date_rfc850 date_rss date_sub date_sun_info date_sunrise date_sunset date_time_set date_timestamp_get date_timestamp_set date_timezone_get date_timezone_set date_w3c datefmt_create datefmt_format datefmt_get_calendar datefmt_get_datetype datefmt_get_error_code datefmt_get_error_message datefmt_get_locale datefmt_get_pattern datefmt_get_timetype datefmt_get_timezone_id datefmt_is_lenient datefmt_localtime datefmt_parse datefmt_set_calendar datefmt_set_lenient datefmt_set_pattern datefmt_set_timezone_id day_1 day_2 day_3 day_4 day_5 day_6 day_7 db2_autocommit db2_autocommit_off db2_autocommit_on db2_binary db2_bind_param db2_case_lower db2_case_natural db2_case_upper db2_char db2_client_info db2_close db2_column_privileges db2_columns db2_commit db2_conn_error db2_conn_errormsg db2_connect db2_convert db2_cursor_type db2_deferred_prepare_off db2_deferred_prepare_on db2_double db2_escape_string db2_exec db2_execute db2_fetch_array db2_fetch_assoc db2_fetch_both db2_fetch_object db2_fetch_row db2_field_display_size db2_field_name db2_field_num db2_field_precision db2_field_scale db2_field_type db2_field_width db2_foreign_keys db2_forward_only db2_free_result db2_free_stmt db2_get_option db2_last_insert_id db2_lob_read db2_long db2_next_result db2_num_fields db2_num_rows db2_param_file db2_param_in db2_param_inout db2_param_out db2_passthru db2_pclose db2_pconnect db2_prepare db2_primary_keys db2_procedure_columns db2_procedures db2_result db2_rollback db2_scrollable db2_server_info db2_set_option db2_special_columns db2_statistics db2_stmt_error db2_stmt_errormsg db2_table_privileges db2_tables dba_close dba_delete dba_exists dba_fetch dba_firstkey dba_handlers dba_insert dba_key_split dba_list dba_nextkey dba_open dba_optimize dba_popen dba_replace dba_sync dbase_add_record dbase_close dbase_create dbase_delete_record dbase_get_header_info dbase_get_record dbase_get_record_with_names dbase_numfields dbase_numrecords dbase_open dbase_pack dbase_replace_record dbplus_add dbplus_aql dbplus_chdir dbplus_close dbplus_curr dbplus_err_close dbplus_err_corrupt_tuple dbplus_err_crc dbplus_err_create dbplus_err_dbparse dbplus_err_dbpreexit dbplus_err_dbrunerr dbplus_err_duplicate dbplus_err_empty dbplus_err_eoscan dbplus_err_fifo dbplus_err_length dbplus_err_locked dbplus_err_lseek dbplus_err_magic dbplus_err_malloc dbplus_err_nidx dbplus_err_noerr dbplus_err_nolock dbplus_err_nusers dbplus_err_ontrap dbplus_err_open dbplus_err_panic dbplus_err_perm dbplus_err_pgsize dbplus_err_pipe dbplus_err_preexit dbplus_err_preproc dbplus_err_read dbplus_err_restricted dbplus_err_tcl dbplus_err_unknown dbplus_err_user dbplus_err_version dbplus_err_wait dbplus_err_warning0 dbplus_err_wlocked dbplus_err_wopen dbplus_err_write dbplus_errcode dbplus_errno dbplus_find dbplus_first dbplus_flush dbplus_freealllocks dbplus_freelock dbplus_freerlocks dbplus_getlock dbplus_getunique dbplus_info dbplus_last dbplus_lockrel dbplus_next dbplus_open dbplus_prev dbplus_rchperm dbplus_rcreate dbplus_rcrtexact dbplus_rcrtlike dbplus_resolve dbplus_restorepos dbplus_rkeys dbplus_ropen dbplus_rquery dbplus_rrename dbplus_rsecindex dbplus_runlink dbplus_rzap dbplus_savepos dbplus_setindex dbplus_setindexbynumber dbplus_sql dbplus_tcl dbplus_tremove dbplus_undo dbplus_undoprepare dbplus_unlockrel dbplus_unselect dbplus_update dbplus_xlockrel dbplus_xunlockrel dbx_close dbx_cmp_asc dbx_cmp_desc dbx_cmp_native dbx_cmp_number dbx_cmp_text dbx_colnames_lowercase dbx_colnames_unchanged dbx_colnames_uppercase dbx_compare dbx_connect dbx_error dbx_escape_string dbx_fbsql dbx_fetch_row dbx_mssql dbx_mysql dbx_oci8 dbx_odbc dbx_persistent dbx_pgsql dbx_query dbx_result_assoc dbx_result_index dbx_result_info dbx_result_unbuffered dbx_sort dbx_sqlite dbx_sybasect dcgettext dcngettext debug_backtrace debug_backtrace_ignore_args debug_backtrace_provide_object debug_print_backtrace debug_zval_dump decbin dechex decimal_point declare decoct default default_include_path define define_syslog_variables defined deg2rad delete dgettext die dio_close dio_fcntl dio_open dio_read dio_seek dio_stat dio_tcsetattr dio_truncate dio_write dir directory directory_separator dirname disk_free_space disk_total_space diskfreespace disp_e_badindex disp_e_divbyzero disp_e_overflow dl dngettext dns_a dns_a6 dns_aaaa dns_all dns_any dns_check_record dns_cname dns_get_mx dns_get_record dns_hinfo dns_mx dns_naptr dns_ns dns_ptr dns_soa dns_srv dns_txt do dom_hierarchy_request_err dom_import_simplexml dom_index_size_err dom_inuse_attribute_err dom_invalid_access_err dom_invalid_character_err dom_invalid_modification_err dom_invalid_state_err dom_namespace_err dom_no_data_allowed_err dom_no_modification_allowed_err dom_not_found_err + dom_not_supported_err dom_php_err dom_syntax_err dom_validation_err dom_wrong_document_err domstring_size_err double doubleval e_all e_compile_error e_compile_warning e_core_error e_core_warning e_deprecated e_error e_notice e_parse e_recoverable_error e_strict e_user_deprecated e_user_error e_user_notice e_user_warning e_warning each easter_date easter_days echo eio_busy eio_cancel eio_chmod eio_chown eio_close eio_custom eio_dt_blk eio_dt_chr eio_dt_cmp eio_dt_dir eio_dt_door eio_dt_fifo eio_dt_lnk eio_dt_max eio_dt_mpb eio_dt_mpc eio_dt_nam eio_dt_nwk eio_dt_reg eio_dt_sock eio_dt_unknown eio_dt_wht eio_dup2 eio_event_loop eio_falloc_fl_keep_size eio_fallocate eio_fchmod eio_fchown eio_fdatasync eio_fstat eio_fstatvfs eio_fsync eio_ftruncate eio_futime eio_get_event_stream eio_get_last_error eio_grp eio_grp_add eio_grp_cancel eio_grp_limit eio_init eio_link eio_lstat eio_mkdir eio_mknod eio_nop eio_npending eio_nready eio_nreqs eio_nthreads eio_o_append eio_o_creat eio_o_excl eio_o_fsync eio_o_nonblock eio_o_rdonly eio_o_rdwr eio_o_trunc eio_o_wronly eio_open eio_poll eio_pri_default eio_pri_max eio_pri_min eio_read eio_readahead eio_readdir eio_readdir_dents eio_readdir_dirs_first eio_readdir_found_unknown eio_readdir_stat_order eio_readlink eio_realpath eio_rename eio_rmdir eio_s_ifblk eio_s_ifchr eio_s_ififo eio_s_ifreg eio_s_ifsock eio_s_irgrp eio_s_iroth eio_s_irusr eio_s_iwgrp eio_s_iwoth eio_s_iwusr eio_s_ixgrp eio_s_ixoth eio_s_ixusr eio_seek eio_seek_cur eio_seek_end eio_seek_set eio_sendfile eio_set_max_idle eio_set_max_parallel eio_set_max_poll_reqs eio_set_max_poll_time eio_set_min_parallel eio_stat eio_statvfs eio_symlink eio_sync eio_sync_file_range eio_sync_file_range_wait_after eio_sync_file_range_wait_before eio_sync_file_range_write eio_syncfs eio_truncate eio_unlink eio_utime eio_write else elseif empty enc7bit enc8bit encbase64 encbinary encother encquotedprintable end enddeclare endfor endforeach endif endswitch endwhile ent_compat ent_disallowed ent_html401 ent_html5 ent_ignore ent_noquotes ent_quotes ent_substitute ent_xhtml ent_xml1 era era_d_fmt era_d_t_fmt era_t_fmt era_year ereg ereg_replace eregi eregi_replace error_get_last error_log error_reporting error_trace escapeshellarg escapeshellcmd ev_persist ev_read ev_signal ev_timeout ev_write eval event_add event_base_free event_base_loop event_base_loopbreak event_base_loopexit event_base_new event_base_priority_init event_base_reinit event_base_set event_buffer_base_set event_buffer_disable event_buffer_enable event_buffer_fd_set event_buffer_free event_buffer_new event_buffer_priority_set event_buffer_read event_buffer_set_callback event_buffer_timeout_set event_buffer_watermark_set event_buffer_write event_del event_free event_new event_priority_set event_set event_timer_add event_timer_del event_timer_new event_timer_set evloop_nonblock evloop_once exec exif_imagetype exif_read_data exif_tagname exif_thumbnail exif_use_mbstring exit exp exp_eof exp_exact exp_fullbuffer exp_glob exp_regexp exp_timeout expect_expectl expect_popen explode expm1 extends extension_loaded extr_if_exists extr_overwrite extr_prefix_all extr_prefix_if_exists extr_prefix_invalid extr_prefix_same extr_refs extr_skip extract ezmlm_hash f_dupfd f_getfd f_getfl f_getlk f_getown f_rdlck f_setfl f_setlk f_setlkw f_setown f_unlck f_wrlck false fann_cascadetrain_on_data fann_cascadetrain_on_file fann_clear_scaling_params fann_copy fann_cos fann_cos_symmetric fann_create_from_file fann_create_shortcut fann_create_shortcut_array fann_create_sparse fann_create_sparse_array fann_create_standard fann_create_standard_array fann_create_train fann_create_train_from_callback fann_descale_input fann_descale_output fann_descale_train fann_destroy fann_destroy_train fann_duplicate_train_data fann_e_cant_allocate_mem fann_e_cant_open_config_r fann_e_cant_open_config_w fann_e_cant_open_td_r fann_e_cant_open_td_w fann_e_cant_read_config fann_e_cant_read_connections fann_e_cant_read_neuron fann_e_cant_read_td fann_e_cant_train_activation fann_e_cant_use_activation fann_e_cant_use_train_alg fann_e_index_out_of_bound fann_e_input_no_match fann_e_no_error fann_e_output_no_match fann_e_scale_not_present fann_e_train_data_mismatch fann_e_train_data_subset fann_e_wrong_config_version fann_e_wrong_num_connections fann_elliot fann_elliot_symmetric fann_errorfunc_linear fann_errorfunc_tanh fann_gaussian fann_gaussian_stepwise fann_gaussian_symmetric fann_get_activation_function fann_get_activation_steepness fann_get_bias_array fann_get_bit_fail fann_get_bit_fail_limit fann_get_cascade_activation_functions fann_get_cascade_activation_functions_count fann_get_cascade_activation_steepnesses fann_get_cascade_activation_steepnesses_count fann_get_cascade_candidate_change_fraction fann_get_cascade_candidate_limit fann_get_cascade_candidate_stagnation_epochs fann_get_cascade_max_cand_epochs fann_get_cascade_max_out_epochs fann_get_cascade_min_cand_epochs fann_get_cascade_min_out_epochs fann_get_cascade_num_candidate_groups fann_get_cascade_num_candidates fann_get_cascade_output_change_fraction fann_get_cascade_output_stagnation_epochs fann_get_cascade_weight_multiplier fann_get_connection_array fann_get_connection_rate fann_get_errno fann_get_errstr fann_get_layer_array fann_get_learning_momentum fann_get_learning_rate fann_get_mse fann_get_network_type fann_get_num_input fann_get_num_layers fann_get_num_output fann_get_quickprop_decay fann_get_quickprop_mu fann_get_rprop_decrease_factor fann_get_rprop_delta_max fann_get_rprop_delta_min fann_get_rprop_delta_zero fann_get_rprop_increase_factor fann_get_sarprop_step_error_shift fann_get_sarprop_step_error_threshold_factor fann_get_sarprop_temperature fann_get_sarprop_weight_decay_shift fann_get_total_connections fann_get_total_neurons fann_get_train_error_function fann_get_train_stop_function fann_get_training_algorithm fann_init_weights fann_length_train_data fann_linear fann_linear_piece fann_linear_piece_symmetric fann_merge_train_data fann_nettype_layer fann_nettype_shortcut fann_num_input_train_data fann_num_output_train_data fann_print_error fann_randomize_weights fann_read_train_from_file fann_reset_errno fann_reset_errstr fann_reset_mse fann_run fann_save fann_save_train fann_scale_input fann_scale_input_train_data fann_scale_output fann_scale_output_train_data fann_scale_train fann_scale_train_data fann_set_activation_function fann_set_activation_function_hidden fann_set_activation_function_layer fann_set_activation_function_output fann_set_activation_steepness fann_set_activation_steepness_hidden fann_set_activation_steepness_layer fann_set_activation_steepness_output fann_set_bit_fail_limit fann_set_callback fann_set_cascade_activation_functions fann_set_cascade_activation_steepnesses fann_set_cascade_candidate_change_fraction fann_set_cascade_candidate_limit fann_set_cascade_candidate_stagnation_epochs fann_set_cascade_max_cand_epochs fann_set_cascade_max_out_epochs fann_set_cascade_min_cand_epochs fann_set_cascade_min_out_epochs fann_set_cascade_num_candidate_groups fann_set_cascade_output_change_fraction fann_set_cascade_output_stagnation_epochs fann_set_cascade_weight_multiplier fann_set_error_log fann_set_input_scaling_params fann_set_learning_momentum fann_set_learning_rate fann_set_output_scaling_params fann_set_quickprop_decay fann_set_quickprop_mu fann_set_rprop_decrease_factor fann_set_rprop_delta_max fann_set_rprop_delta_min fann_set_rprop_delta_zero fann_set_rprop_increase_factor fann_set_sarprop_step_error_shift fann_set_sarprop_step_error_threshold_factor fann_set_sarprop_temperature fann_set_sarprop_weight_decay_shift fann_set_scaling_params fann_set_train_error_function fann_set_train_stop_function fann_set_training_algorithm fann_set_weight fann_set_weight_array fann_shuffle_train_data fann_sigmoid fann_sigmoid_stepwise fann_sigmoid_symmetric fann_sigmoid_symmetric_stepwise fann_sin fann_sin_symmetric fann_stopfunc_bit fann_stopfunc_mse fann_subset_train_data fann_test fann_test_data fann_threshold fann_threshold_symmetric fann_train fann_train_batch fann_train_epoch fann_train_incremental fann_train_on_data fann_train_on_file fann_train_quickprop fann_train_rprop fann_train_sarprop fastcgi_finish_request fbsql_affected_rows fbsql_assoc fbsql_autocommit fbsql_blob_size fbsql_both fbsql_change_user fbsql_clob_size fbsql_close fbsql_commit fbsql_connect fbsql_create_blob fbsql_create_clob fbsql_create_db fbsql_data_seek fbsql_database fbsql_database_password fbsql_db_query fbsql_db_status fbsql_drop_db fbsql_errno fbsql_error fbsql_fetch_array fbsql_fetch_assoc fbsql_fetch_field fbsql_fetch_lengths fbsql_fetch_object fbsql_fetch_row fbsql_field_flags fbsql_field_len fbsql_field_name fbsql_field_seek fbsql_field_table fbsql_field_type fbsql_free_result fbsql_get_autostart_info fbsql_hostname fbsql_insert_id fbsql_iso_read_committed fbsql_iso_read_uncommitted fbsql_iso_repeatable_read fbsql_iso_serializable fbsql_iso_versioned fbsql_list_dbs fbsql_list_fields fbsql_list_tables fbsql_lob_direct fbsql_lob_handle fbsql_lock_deferred fbsql_lock_optimistic fbsql_lock_pessimistic fbsql_next_result fbsql_noexec fbsql_num fbsql_num_fields fbsql_num_rows fbsql_password fbsql_pconnect fbsql_query fbsql_read_blob fbsql_read_clob fbsql_result fbsql_rollback fbsql_rows_fetched fbsql_running fbsql_select_db fbsql_set_characterset fbsql_set_lob_mode fbsql_set_password fbsql_set_transaction fbsql_start_db fbsql_starting fbsql_stop_db fbsql_stopped fbsql_stopping fbsql_table_name fbsql_tablename fbsql_unknown fbsql_username fbsql_warnings fclose fdf_add_doc_javascript fdf_add_template fdf_close fdf_create fdf_enum_values fdf_errno fdf_error fdf_get_ap fdf_get_attachment fdf_get_encoding fdf_get_file fdf_get_flags fdf_get_opt + fdf_get_status fdf_get_value fdf_get_version fdf_header fdf_next_field_name fdf_open fdf_open_string fdf_remove_item fdf_save fdf_save_string fdf_set_ap fdf_set_encoding fdf_set_file fdf_set_flags fdf_set_javascript_action fdf_set_on_import_javascript fdf_set_opt fdf_set_status fdf_set_submit_form_action fdf_set_target_frame fdf_set_value fdf_set_version fdfaa fdfaction fdfap fdfapref fdfas fdfcalculate fdfclearff fdfclrf fdfdown fdfdownap fdfenter fdfexit fdfff fdffile fdfflags fdfformat fdfid fdfif fdfkeystroke fdfnormalap fdfrolloverap fdfsetf fdfsetff fdfstatus fdfup fdfvalidate fdfvalue feof fflush fgetc fgetcsv fgets fgetss file file_append file_binary file_exists file_get_contents file_ignore_new_lines file_no_default_context file_put_contents file_skip_empty_lines file_text file_use_include_path fileatime filectime filegroup fileinfo_continue fileinfo_devices fileinfo_mime fileinfo_mime_encoding fileinfo_mime_type fileinfo_none fileinfo_preserve_atime fileinfo_raw fileinfo_symlink fileinode filemtime fileowner fileperms filepro filepro_fieldcount filepro_fieldname filepro_fieldtype filepro_fieldwidth filepro_retrieve filepro_rowcount filesize filetype filter_callback filter_default filter_flag_allow_fraction filter_flag_allow_hex filter_flag_allow_octal filter_flag_allow_scientific filter_flag_allow_thousand filter_flag_empty_string_null filter_flag_encode_amp filter_flag_encode_high filter_flag_encode_low filter_flag_host_required filter_flag_ipv4 filter_flag_ipv6 filter_flag_no_encode_quotes filter_flag_no_priv_range filter_flag_no_res_range filter_flag_none filter_flag_path_required filter_flag_query_required filter_flag_scheme_required filter_flag_strip_backtick filter_flag_strip_high filter_flag_strip_low filter_force_array filter_has_var filter_id filter_input filter_input_array filter_list filter_null_on_failure filter_require_array filter_require_scalar filter_sanitize_email filter_sanitize_encoded filter_sanitize_full_special_chars filter_sanitize_magic_quotes filter_sanitize_number_float filter_sanitize_number_int filter_sanitize_special_chars filter_sanitize_string filter_sanitize_stripped filter_sanitize_url filter_unsafe_raw filter_validate_boolean filter_validate_email filter_validate_float filter_validate_int filter_validate_ip filter_validate_mac filter_validate_regexp filter_validate_url filter_var filter_var_array final finally finfo_buffer finfo_close finfo_file finfo_open finfo_set_flags firebird/interbase float floatval flock floor flush fmod fnm_casefold fnm_noescape fnm_pathname fnm_period fnmatch fopen for force_deflate force_gzip foreach forward_static_call forward_static_call_array fpassthru fpe_fltdiv fpe_fltinv fpe_fltovf fpe_fltres fpe_fltsub fpe_fltund fpe_intdiv fpe_intovf fprintf fputcsv fputs frac_digits fread frenchtojd fscanf fseek fsockopen fstat ft_internal ft_not ft_peek ft_prefetchtext ft_uid ftell ftok ftp_alloc ftp_ascii ftp_autoresume ftp_autoseek ftp_binary ftp_cdup ftp_chdir ftp_chmod ftp_close ftp_connect ftp_delete ftp_exec ftp_failed ftp_fget ftp_finished ftp_fput ftp_get ftp_get_option ftp_image ftp_login ftp_mdtm ftp_mkdir ftp_moredata ftp_nb_continue ftp_nb_fget ftp_nb_fput ftp_nb_get ftp_nb_put ftp_nlist ftp_pasv ftp_put ftp_pwd ftp_quit ftp_raw ftp_rawlist ftp_rename ftp_rmdir ftp_set_option ftp_site ftp_size ftp_ssl_connect ftp_systype ftp_text ftp_timeout_sec ftruncate func_get_arg func_get_args func_num_args function function_exists function_trace fwrite gc_collect_cycles gc_disable gc_enable gc_enabled gd_bundled gd_extra_version gd_info gd_major_version gd_minor_version gd_release_version gd_version geoip_asnum_by_name geoip_asnum_edition geoip_cabledsl_speed geoip_city_edition_rev0 geoip_city_edition_rev1 geoip_continent_code_by_name geoip_corporate_speed geoip_country_code3_by_name geoip_country_code_by_name geoip_country_edition geoip_country_name_by_name geoip_database_info geoip_db_avail geoip_db_filename geoip_db_get_all_info geoip_dialup_speed geoip_domain_by_name geoip_domain_edition geoip_id_by_name geoip_isp_by_name geoip_isp_edition geoip_netspeed_edition geoip_netspeedcell_by_name geoip_org_by_name geoip_org_edition geoip_proxy_edition geoip_record_by_name geoip_region_by_name geoip_region_edition_rev0 geoip_region_edition_rev1 geoip_region_name_by_code geoip_setup_custom_directory geoip_time_zone_by_country_and_region geoip_unknown_speed get_browser get_called_class get_cfg_var get_class get_class_methods get_class_vars get_current_user get_declared_classes get_declared_interfaces get_declared_traits get_defined_constants get_defined_functions get_defined_vars get_extension_funcs get_headers get_html_translation_table get_include_path get_included_files get_loaded_extensions get_magic_quotes_gpc get_magic_quotes_runtime get_meta_tags get_object_vars get_parent_class get_required_files get_resource_type getallheaders getcwd getdate getdir getenv gethostbyaddr gethostbyname gethostbynamel gethostname getimagesize getimagesizefromstring getlastmod getmxrr getmygid getmyinode getmypid getmyuid getopt getprotobyname getprotobynumber getrandmax getrusage getservbyname getservbyport gettext gettimeofday gettype glob glob_available_flags glob_brace glob_err glob_mark glob_nocheck glob_noescape glob_nosort glob_onlydir global globals gmdate gmmktime gmp_abs gmp_add gmp_and gmp_big_endian gmp_clrbit gmp_cmp gmp_com gmp_div gmp_div_q gmp_div_qr gmp_div_r gmp_divexact gmp_export gmp_fact gmp_gcd gmp_gcdext gmp_hamdist gmp_import gmp_init gmp_intval gmp_invert gmp_jacobi gmp_legendre gmp_little_endian gmp_lsw_first gmp_mod gmp_mpir_version gmp_msw_first gmp_mul gmp_native_endian gmp_neg gmp_nextprime gmp_or gmp_perfect_square gmp_popcount gmp_pow gmp_powm gmp_prob_prime gmp_random gmp_random_bits gmp_random_range gmp_root gmp_rootrem gmp_round_minusinf gmp_round_plusinf gmp_round_zero gmp_scan0 gmp_scan1 gmp_setbit gmp_sign gmp_sqrt gmp_sqrtrem gmp_strval gmp_sub gmp_testbit gmp_version gmp_xor gmstrftime gnupg_adddecryptkey gnupg_addencryptkey gnupg_addsignkey gnupg_cleardecryptkeys gnupg_clearencryptkeys gnupg_clearsignkeys gnupg_decrypt gnupg_decryptverify gnupg_encrypt gnupg_encryptsign gnupg_error_exception gnupg_error_silent gnupg_error_warning gnupg_export gnupg_geterror gnupg_getprotocol gnupg_import gnupg_init gnupg_keyinfo gnupg_protocol_cms gnupg_protocol_openpgp gnupg_setarmor gnupg_seterrormode gnupg_setsignmode gnupg_sig_mode_clear gnupg_sig_mode_detach gnupg_sig_mode_normal gnupg_sign gnupg_sigsum_bad_policy gnupg_sigsum_crl_missing gnupg_sigsum_crl_too_old gnupg_sigsum_green gnupg_sigsum_key_expired gnupg_sigsum_key_missing gnupg_sigsum_key_revoked gnupg_sigsum_red gnupg_sigsum_sig_expired gnupg_sigsum_sys_error gnupg_sigsum_valid gnupg_validity_full gnupg_validity_marginal gnupg_validity_never gnupg_validity_ultimate gnupg_validity_undefined gnupg_validity_unknown gnupg_verify gopher_binary gopher_binhex gopher_directory gopher_document gopher_dosbinary gopher_http gopher_info gopher_parsedir gopher_unknown gopher_uuencoded goto grapheme_extr_count grapheme_extr_maxbytes grapheme_extr_maxchars grapheme_extract grapheme_stripos grapheme_stristr grapheme_strlen grapheme_strpos grapheme_strripos grapheme_strrpos grapheme_strstr grapheme_substr gregoriantojd grouping gupnp_context_get_host_ip gupnp_context_get_port gupnp_context_get_subscription_timeout gupnp_context_host_path gupnp_context_new gupnp_context_set_subscription_timeout gupnp_context_timeout_add gupnp_context_unhost_path gupnp_control_error_action_failed gupnp_control_error_invalid_action gupnp_control_error_invalid_args gupnp_control_error_out_of_sync gupnp_control_point_browse_start gupnp_control_point_browse_stop gupnp_control_point_callback_set gupnp_control_point_new gupnp_device_action_callback_set gupnp_device_info_get gupnp_device_info_get_service gupnp_root_device_get_available gupnp_root_device_get_relative_location gupnp_root_device_new gupnp_root_device_set_available gupnp_root_device_start gupnp_root_device_stop gupnp_service_action_get gupnp_service_action_return gupnp_service_action_return_error gupnp_service_action_set gupnp_service_freeze_notify gupnp_service_info_get gupnp_service_info_get_introspection gupnp_service_introspection_get_state_variable gupnp_service_notify gupnp_service_proxy_action_get gupnp_service_proxy_action_set gupnp_service_proxy_add_notify gupnp_service_proxy_callback_set gupnp_service_proxy_get_subscribed gupnp_service_proxy_remove_notify gupnp_service_proxy_send_action gupnp_service_proxy_set_subscribed gupnp_service_thaw_notify gupnp_signal_action_invoked gupnp_signal_device_proxy_available gupnp_signal_device_proxy_unavailable gupnp_signal_notify_failed gupnp_signal_service_proxy_available gupnp_signal_service_proxy_unavailable gupnp_signal_subscription_lost gupnp_type_boolean gupnp_type_double gupnp_type_float gupnp_type_int gupnp_type_long gupnp_type_string gzclose gzcompress gzdecode gzdeflate gzencode gzeof gzfile gzgetc gzgets gzgetss gzinflate gzopen gzpassthru gzputs gzread gzrewind gzseek gztell gzuncompress gzwrite hash hash_algos hash_copy hash_equals hash_file hash_final hash_hmac hash_hmac_file hash_init hash_pbkdf2 hash_update hash_update_file hash_update_stream header header_register_callback header_remove headers_list headers_sent hebrev hebrevc hex2bin hexdec highlight_file highlight_string html_entities html_entity_decode html_specialchars htmlentities htmlspecialchars htmlspecialchars_decode http_auth_any http_auth_basic http_auth_digest http_auth_gssneg http_auth_ntlm http_build_cookie http_build_query http_build_str http_build_url http_cache_etag http_cache_last_modified http_chunked_decode http_cookie_httponly http_cookie_parse_raw http_cookie_secure http_date http_deflate http_deflate_level_def + http_deflate_level_max http_deflate_level_min http_deflate_strategy_def http_deflate_strategy_filt http_deflate_strategy_fixed http_deflate_strategy_huff http_deflate_strategy_rle http_deflate_type_gzip http_deflate_type_raw http_deflate_type_zlib http_e_encoding http_e_header http_e_invalid_param http_e_malformed_headers http_e_message_type http_e_querystring http_e_request http_e_request_method http_e_request_pool http_e_response http_e_runtime http_e_socket http_e_url http_encoding_stream_flush_full http_encoding_stream_flush_none http_encoding_stream_flush_sync http_get http_get_request_body http_get_request_body_stream http_get_request_headers http_head http_inflate http_ipresolve_any http_ipresolve_v4 http_ipresolve_v6 http_match_etag http_match_modified http_match_request_header http_meth_acl http_meth_baseline_control http_meth_checkin http_meth_checkout http_meth_connect http_meth_copy http_meth_delete http_meth_get http_meth_head http_meth_label http_meth_lock http_meth_merge http_meth_mkactivity http_meth_mkcol http_meth_mkworkspace http_meth_move http_meth_options http_meth_post http_meth_propfind http_meth_proppatch http_meth_put http_meth_report http_meth_trace http_meth_uncheckout http_meth_unlock http_meth_update http_meth_version_control http_msg_none http_msg_request http_msg_response http_negotiate_charset http_negotiate_content_type http_negotiate_language http_params_allow_comma http_params_allow_failure http_params_default http_params_raise_error http_parse_cookie http_parse_headers http_parse_message http_parse_params http_persistent_handles_clean http_persistent_handles_count http_persistent_handles_ident http_post_data http_post_fields http_proxy_http http_proxy_socks4 http_proxy_socks5 http_put_data http_put_file http_put_stream http_querystring_type_array http_querystring_type_bool http_querystring_type_float http_querystring_type_int http_querystring_type_object http_querystring_type_string http_redirect http_redirect_found http_redirect_perm http_redirect_post http_redirect_proxy http_redirect_temp http_request http_request_body_encode http_request_method_exists http_request_method_name http_request_method_register http_request_method_unregister http_response_code http_send_content_disposition http_send_content_type http_send_data http_send_file http_send_last_modified http_send_status http_send_stream http_ssl_version_any http_ssl_version_sslv2 http_ssl_version_sslv3 http_ssl_version_tlsv1 http_support http_support_encodings http_support_magicmime http_support_requests http_support_sslrequests http_throttle http_url_join_path http_url_join_query http_url_replace http_url_strip_all http_url_strip_auth http_url_strip_fragment http_url_strip_pass http_url_strip_path http_url_strip_port http_url_strip_query http_url_strip_user http_version_1_0 http_version_1_1 http_version_any hypot ibase_add_user ibase_affected_rows ibase_backup ibase_bkp_convert ibase_bkp_ignore_checksums ibase_bkp_ignore_limbo ibase_bkp_metadata_only ibase_bkp_no_garbage_collect ibase_bkp_non_transportable ibase_bkp_old_descriptions ibase_blob_add ibase_blob_cancel ibase_blob_close ibase_blob_create ibase_blob_echo ibase_blob_get ibase_blob_import ibase_blob_info ibase_blob_open ibase_close ibase_commit ibase_commit_ret ibase_committed ibase_concurrency ibase_connect ibase_consistency ibase_db_info ibase_default ibase_delete_user ibase_drop_db ibase_errcode ibase_errmsg ibase_execute ibase_fetch_arrays ibase_fetch_assoc ibase_fetch_blobs ibase_fetch_object ibase_fetch_row ibase_field_info ibase_free_event_handler ibase_free_query ibase_free_result ibase_gen_id ibase_maintain_db ibase_modify_user ibase_name_result ibase_nowait ibase_num_fields ibase_num_params ibase_param_info ibase_pconnect ibase_prepare ibase_prp_access_mode ibase_prp_activate ibase_prp_am_readonly ibase_prp_am_readwrite ibase_prp_db_online ibase_prp_deny_new_attachments ibase_prp_deny_new_transactions ibase_prp_page_buffers ibase_prp_res ibase_prp_res_use_full ibase_prp_reserve_space ibase_prp_set_sql_dialect ibase_prp_shutdown_db ibase_prp_sweep_interval ibase_prp_wm_async ibase_prp_wm_sync ibase_prp_write_mode ibase_query ibase_read ibase_res_create ibase_res_deactivate_idx ibase_res_no_shadow ibase_res_no_validity ibase_res_one_at_a_time ibase_res_replace ibase_res_use_all_space ibase_restore ibase_rollback ibase_rollback_ret ibase_rpr_check_db ibase_rpr_full ibase_rpr_ignore_checksum ibase_rpr_kill_shadows ibase_rpr_mend_db ibase_rpr_sweep_db ibase_rpr_validate_db ibase_server_info ibase_service_attach ibase_service_detach ibase_set_event_handler ibase_sts_data_pages ibase_sts_db_log ibase_sts_hdr_pages ibase_sts_idx_pages ibase_sts_sys_relations ibase_svc_get_env ibase_svc_get_env_lock ibase_svc_get_env_msg ibase_svc_get_users ibase_svc_implementation ibase_svc_server_version ibase_svc_svr_db_info ibase_svc_user_dbpath ibase_trans ibase_unixtime ibase_wait ibase_wait_event ibase_write iconv iconv_get_encoding iconv_impl iconv_mime_decode iconv_mime_decode_continue_on_error iconv_mime_decode_headers iconv_mime_decode_strict iconv_mime_encode iconv_set_encoding iconv_strlen iconv_strpos iconv_strrpos iconv_substr iconv_version id3_best id3_get_frame_long_name id3_get_frame_short_name id3_get_genre_id id3_get_genre_list id3_get_genre_name id3_get_tag id3_get_version id3_remove_tag id3_set_tag id3_v1_0 id3_v1_1 id3_v2_1 id3_v2_2 id3_v2_3 id3_v2_4 idate idn_to_ascii idn_to_unicode idn_to_utf8 idna_allow_unassigned idna_check_bidi idna_check_contextj idna_default idna_error_bidi idna_error_contextj idna_error_disallowed idna_error_domain_name_too_long idna_error_empty_label idna_error_hyphen_3_4 idna_error_invalid_ace_label idna_error_label_has_dot idna_error_label_too_long idna_error_leading_combining_mark idna_error_leading_hyphen idna_error_punycode idna_error_trailing_hyphen idna_nontransitional_to_ascii idna_nontransitional_to_unicode idna_use_std3_rules if ifx_affected_rows ifx_blobinfile_mode ifx_byteasvarchar ifx_close ifx_connect ifx_copy_blob ifx_create_blob ifx_create_char ifx_do ifx_error ifx_errormsg ifx_fetch_row ifx_fieldproperties ifx_fieldtypes ifx_free_blob ifx_free_char ifx_free_result ifx_get_blob ifx_get_char ifx_getsqlca ifx_hold ifx_htmltbl_result ifx_lo_append ifx_lo_buffer ifx_lo_nobuffer ifx_lo_rdonly ifx_lo_rdwr ifx_lo_wronly ifx_nullformat ifx_num_fields ifx_num_rows ifx_pconnect ifx_prepare ifx_query ifx_scroll ifx_textasvarchar ifx_update_blob ifx_update_char ifxus_close_slob ifxus_create_slob ifxus_free_slob ifxus_open_slob ifxus_read_slob ifxus_seek_slob ifxus_tell_slob ifxus_write_slob ignore_user_abort iis_add_server iis_anonymous iis_basic iis_execute iis_get_dir_security iis_get_script_map iis_get_server_by_comment iis_get_server_by_path iis_get_server_rights iis_get_service_state iis_ntlm iis_paused iis_read iis_remove_server iis_running iis_script iis_set_app_settings iis_set_dir_security iis_set_script_map iis_set_server_rights iis_start_server iis_start_service iis_starting iis_stop_server iis_stop_service iis_stopped iis_write ill_badstk ill_coproc ill_illadr ill_illopc ill_illopn ill_illtrp ill_prvopc ill_prvreg image2wbmp image_type_to_extension image_type_to_mime_type imageaffine imageaffinematrixconcat imageaffinematrixget imagealphablending imageantialias imagearc imagechar imagecharup imagecolorallocate imagecolorallocatealpha imagecolorat imagecolorclosest imagecolorclosestalpha imagecolorclosesthwb imagecolordeallocate imagecolorexact imagecolorexactalpha imagecolormatch imagecolorresolve imagecolorresolvealpha imagecolorset imagecolorsforindex imagecolorstotal imagecolortransparent imageconvolution imagecopy imagecopymerge imagecopymergegray imagecopyresampled imagecopyresized imagecreate imagecreatefromgd imagecreatefromgd2 imagecreatefromgd2part imagecreatefromgif imagecreatefromjpeg imagecreatefrompng imagecreatefromstring imagecreatefromwbmp imagecreatefromwebp imagecreatefromxbm imagecreatefromxpm imagecreatetruecolor imagecrop imagecropauto imagedashedline imagedestroy imageellipse imagefill imagefilledarc imagefilledellipse imagefilledpolygon imagefilledrectangle imagefilltoborder imagefilter imageflip imagefontheight imagefontwidth imageftbbox imagefttext imagegammacorrect imagegd imagegd2 imagegif imagegrabscreen imagegrabwindow imageinterlace imageistruecolor imagejpeg imagelayereffect imageline imageloadfont imagepalettecopy imagepalettetotruecolor imagepng imagepolygon imagepsbbox imagepsencodefont imagepsextendfont imagepsfreefont imagepsloadfont imagepsslantfont imagepstext imagerectangle imagerotate imagesavealpha imagescale imagesetbrush imagesetinterpolation imagesetpixel imagesetstyle imagesetthickness imagesettile imagestring imagestringup imagesx imagesy imagetruecolortopalette imagettfbbox imagettftext imagetype_bmp imagetype_count imagetype_gif imagetype_ico imagetype_iff imagetype_jb2 imagetype_jp2 imagetype_jpc imagetype_jpeg imagetype_jpeg2000 imagetype_jpx imagetype_png imagetype_psd imagetype_swc imagetype_swf imagetype_tiff_ii imagetype_tiff_mm imagetype_unknown imagetype_wbmp imagetype_xbm imagetypes imagewbmp imagewebp imagexbm imap_8bit imap_alerts imap_append imap_base64 imap_binary imap_body imap_bodystruct imap_check imap_clearflag_full imap_close imap_closetimeout imap_create imap_createmailbox imap_delete imap_deletemailbox imap_errors imap_expunge imap_fetch_overview imap_fetchbody imap_fetchheader imap_fetchmime imap_fetchstructure imap_fetchtext imap_gc imap_gc_elt imap_gc_env imap_gc_texts imap_get_quota imap_get_quotaroot imap_getacl imap_getmailboxes imap_getsubscribed imap_header imap_headerinfo imap_headers imap_last_error imap_list imap_listmailbox imap_listscan imap_listsubscribed imap_lsub imap_mail imap_mail_compose imap_mail_copy imap_mail_move + imap_mailboxmsginfo imap_mime_header_decode imap_msgno imap_mutf7_to_utf8 imap_num_msg imap_num_recent imap_open imap_opentimeout imap_ping imap_qprint imap_readtimeout imap_rename imap_renamemailbox imap_reopen imap_rfc822_parse_adrlist imap_rfc822_parse_headers imap_rfc822_write_address imap_savebody imap_scan imap_scanmailbox imap_search imap_set_quota imap_setacl imap_setflag_full imap_sort imap_status imap_subscribe imap_thread imap_timeout imap_uid imap_undelete imap_unsubscribe imap_utf7_decode imap_utf7_encode imap_utf8 imap_utf8_to_mutf7 imap_writetimeout img_affine_rotate img_affine_scale img_affine_shear_horizontal img_affine_shear_vertical img_affine_translate img_arc_chord img_arc_edged img_arc_nofill img_arc_pie img_arc_rounded img_bell img_bessel img_bicubic img_bicubic_fixed img_bilinear_fixed img_blackman img_box img_bspline img_catmullrom img_color_brushed img_color_styled img_color_styledbrushed img_color_tiled img_color_transparent img_crop_black img_crop_default img_crop_sides img_crop_threshold img_crop_transparent img_crop_white img_effect_alphablend img_effect_normal img_effect_overlay img_effect_replace img_filter_brightness img_filter_colorize img_filter_contrast img_filter_edgedetect img_filter_emboss img_filter_gaussian_blur img_filter_grayscale img_filter_mean_removal img_filter_negate img_filter_pixelate img_filter_selective_blur img_filter_smooth img_flip_both img_flip_horizontal img_flip_vertical img_gaussian img_gd2_compressed img_gd2_raw img_generalized_cubic img_gif img_hamming img_hanning img_hermite img_jpeg img_jpg img_mitchell img_nearest_neighbour img_png img_power img_quadratic img_sinc img_triangle img_wbmp img_weighted4 img_xpm implements implode import_request_variables in_access in_all_events in_array in_attrib in_close in_close_nowrite in_close_write in_create in_delete in_delete_self in_dont_follow in_ignored in_isdir in_mask_add in_modify in_move in_move_self in_moved_from in_moved_to in_oneshot in_onlydir in_open in_q_overflow in_unmount include include_once inet_ntop inet_pton inf info_all info_configuration info_credits info_environment info_general info_license info_modules info_variables ingres_api_version ingres_assoc ingres_autocommit ingres_autocommit_state ingres_both ingres_charset ingres_close ingres_commit ingres_connect ingres_cursor ingres_cursor_readonly ingres_cursor_update ingres_date_dmy ingres_date_finnish ingres_date_german ingres_date_iso ingres_date_iso4 ingres_date_mdy ingres_date_multinational ingres_date_multinational4 ingres_date_ymd ingres_errno ingres_error ingres_errsqlstate ingres_escape_string ingres_execute ingres_ext_version ingres_fetch_array ingres_fetch_assoc ingres_fetch_object ingres_fetch_proc_return ingres_fetch_row ingres_field_length ingres_field_name ingres_field_nullable ingres_field_precision ingres_field_scale ingres_field_type ingres_free_result ingres_money_leading ingres_money_trailing ingres_next_error ingres_num ingres_num_fields ingres_num_rows ingres_pconnect ingres_prepare ingres_query ingres_result_seek ingres_rollback ingres_set_environment ingres_structure_btree ingres_structure_cbtree ingres_structure_chash ingres_structure_cheap ingres_structure_cisam ingres_structure_hash ingres_structure_heap ingres_structure_isam ingres_unbuffered_query ini_all ini_alter ini_get ini_get_all ini_perdir ini_restore ini_scanner_normal ini_scanner_raw ini_scanner_typed ini_set ini_system ini_user inotify_add_watch inotify_init inotify_queue_len inotify_read inotify_rm_watch input_cookie input_env input_get input_post input_request input_server input_session instanceof insteadof int int_curr_symbol int_frac_digits intdiv integer interface interface_exists intl_error_name intl_get_error_code intl_get_error_message intl_icu_data_version intl_icu_version intl_idna_variant_2003 intl_idna_variant_uts46 intl_is_failure intl_max_locale_len intval ion_clock_skew ion_corrupt_file ion_expired_file ion_license_corrupt ion_license_expired ion_license_header_invalid ion_license_not_found ion_license_property_invalid ion_license_server_invalid ion_no_permissions ion_unauth_append_prepend_file ion_unauth_included_file ion_unauth_including_file ion_untrusted_extension ioncube_check_license_properties ioncube_file_info ioncube_file_is_encoded ioncube_file_not_permissioned ioncube_file_properties ioncube_license_has_expired ioncube_license_matches_server ioncube_license_properties ioncube_licensed_servers ioncube_loader_iversion ioncube_loader_version ioncube_read_file ioncube_server_data ioncube_write_file ip2long ip_multicast_if ip_multicast_loop ip_multicast_ttl ipproto_ip ipproto_ipv6 iptcembed iptcparse ipv6_hoplimit ipv6_multicast_hops ipv6_multicast_if ipv6_multicast_loop ipv6_pktinfo ipv6_recvhoplimit ipv6_recvpktinfo ipv6_recvtclass ipv6_tclass ipv6_unicast_hops is_a is_array is_bool is_callable is_dir is_double is_executable is_file is_finite is_float is_infinite is_int is_integer is_link is_long is_nan is_null is_numeric is_object is_readable is_real is_resource is_scalar is_soap_fault is_string is_subclass_of is_tainted is_uploaded_file is_writable is_writeable isset iterator_apply iterator_count iterator_to_array jddayofweek jdmonthname jdtofrench jdtogregorian jdtojewish jdtojulian jdtounix jewishtojd join jpeg2wbmp json_bigint_as_string json_decode json_encode json_error_ctrl_char json_error_depth json_error_inf_or_nan json_error_none json_error_recursion json_error_state_mismatch json_error_syntax json_error_unsupported_type json_error_utf8 json_force_object json_hex_amp json_hex_apos json_hex_quot json_hex_tag json_last_error json_last_error_msg json_numeric_check json_object_as_array json_partial_output_on_error json_preserve_zero_fraction json_pretty_print json_unescaped_slashes json_unescaped_unicode judy_type judy_version juliantojd kadm5_attributes kadm5_chpass_principal kadm5_clearpolicy kadm5_create_principal kadm5_delete_principal kadm5_destroy kadm5_fail_auth_count kadm5_flush kadm5_get_policies kadm5_get_principal kadm5_get_principals kadm5_init_with_password kadm5_kvno kadm5_last_failed kadm5_last_pw_change kadm5_last_success kadm5_max_life kadm5_max_rlife kadm5_mod_name kadm5_mod_time kadm5_modify_principal kadm5_policy kadm5_princ_expire_time kadm5_principal kadm5_pw_expiration kadm5_randkey key key_exists krb5_kdb_disallow_all_tix krb5_kdb_disallow_dup_skey krb5_kdb_disallow_forwardable krb5_kdb_disallow_postdated krb5_kdb_disallow_proxiable krb5_kdb_disallow_renewable krb5_kdb_disallow_svr krb5_kdb_disallow_tgt_based krb5_kdb_new_princ krb5_kdb_pwchange_server krb5_kdb_requires_hw_auth krb5_kdb_requires_pre_auth krb5_kdb_requires_pwchange krb5_kdb_support_desmd5 krsort ksort latt_haschildren latt_hasnochildren latt_marked latt_noinferiors latt_noselect latt_referral latt_unmarked lc_all lc_collate lc_ctype lc_messages lc_monetary lc_numeric lc_time lcfirst lcg_value lchgrp lchown ldap_8859_to_t61 ldap_add ldap_bind ldap_close ldap_compare ldap_connect ldap_control_paged_result ldap_control_paged_result_response ldap_count_entries ldap_delete ldap_dn2ufn ldap_err2str ldap_errno ldap_error ldap_escape ldap_explode_dn ldap_first_attribute ldap_first_entry ldap_first_reference ldap_free_result ldap_get_attributes ldap_get_dn ldap_get_entries ldap_get_option ldap_get_values ldap_get_values_len ldap_list ldap_mod_add ldap_mod_del ldap_mod_replace ldap_modify ldap_modify_batch ldap_next_attribute ldap_next_entry ldap_next_reference ldap_parse_reference ldap_parse_result ldap_read ldap_rename ldap_sasl_bind ldap_search ldap_set_option ldap_set_rebind_proc ldap_sort ldap_start_tls ldap_t61_to_8859 ldap_unbind levenshtein libexslt_dotted_version libexslt_version libxml_clear_errors libxml_compact libxml_disable_entity_loader libxml_dotted_version libxml_dtdattr libxml_dtdload libxml_dtdvalid libxml_err_error libxml_err_fatal libxml_err_none libxml_err_warning libxml_get_errors libxml_get_last_error libxml_html_nodefdtd libxml_html_noimplied libxml_loaded_version libxml_noblanks libxml_nocdata libxml_noemptytag libxml_noent libxml_noerror libxml_nonet libxml_nowarning libxml_noxmldecl libxml_nsclean libxml_parsehuge libxml_pedantic libxml_schema_create libxml_set_external_entity_loader libxml_set_streams_context libxml_use_internal_errors libxml_version libxml_xinclude libxslt_dotted_version libxslt_version link linkinfo list locale_accept_from_http locale_canonicalize locale_compose locale_filter_matches locale_get_all_variants locale_get_default locale_get_display_language locale_get_display_name locale_get_display_region locale_get_display_script locale_get_display_variant locale_get_keywords locale_get_primary_language locale_get_region locale_get_script locale_lookup locale_parse locale_set_default localeconv localtime lock_ex lock_nb lock_sh lock_un log log10 log1p log_alert log_auth log_authpriv log_cons log_crit log_cron log_daemon log_debug log_emerg log_err log_info log_kern log_local0 log_local1 log_local2 log_local3 log_local4 log_local5 log_local6 log_local7 log_lpr log_mail log_ndelay log_news log_notice log_nowait log_odelay log_perror log_pid log_syslog log_user log_uucp log_warning long2ip lstat ltrim lzf_compress lzf_decompress lzf_optimized_for m_1_pi m_2_pi m_2_sqrtpi m_checkstatus m_completeauthorizations m_connect m_connectionerror m_deletetrans m_destroyconn m_destroyengine m_done m_e m_error m_euler m_fail m_getcell m_getcellbynum m_getcommadelimited m_getheader m_initconn m_initengine m_iscommadelimited m_ln10 m_ln2 m_lnpi m_log10e m_log2e m_maxconntimeout m_monitor m_numcolumns m_numrows m_parsecommadelimited m_pending m_pi m_pi_2 m_pi_4 m_responsekeys m_responseparam m_returnstatus m_setblocking m_setdropfile m_setip m_setssl m_setssl_cafile m_setssl_files m_settimeout m_sqrt1_2 m_sqrt2 + m_sqrt3 m_sqrtpi m_sslcert_gen_hash m_success m_transactionssent m_transinqueue m_transkeyval m_transnew m_transsend m_uwait m_validateidentifier m_verifyconnection m_verifysslcert magic_quotes_runtime mail mailparse_determine_best_xfer_encoding mailparse_extract_output mailparse_extract_return mailparse_extract_stream mailparse_msg_create mailparse_msg_extract_part mailparse_msg_extract_part_file mailparse_msg_extract_whole_part_file mailparse_msg_free mailparse_msg_get_part mailparse_msg_get_part_data mailparse_msg_get_structure mailparse_msg_parse mailparse_msg_parse_file mailparse_rfc822_parse_addresses mailparse_stream_encode mailparse_uudecode_all main max maxdb_affected_rows maxdb_application maxdb_appversion maxdb_assoc maxdb_assoc_lower maxdb_assoc_upper maxdb_autocommit maxdb_bind_param maxdb_bind_result maxdb_both maxdb_change_user maxdb_character_set_name maxdb_client_encoding maxdb_close maxdb_close_long_data maxdb_commit maxdb_compname maxdb_connect maxdb_connect_errno maxdb_connect_error maxdb_cursorprefix maxdb_data_seek maxdb_debug maxdb_disable_reads_from_master maxdb_disable_rpl_parse maxdb_dump_debug_info maxdb_embedded_connect maxdb_enable_reads_from_master maxdb_enable_rpl_parse maxdb_errno maxdb_error maxdb_escape_string maxdb_execute maxdb_fetch maxdb_fetch_array maxdb_fetch_assoc maxdb_fetch_field maxdb_fetch_field_direct maxdb_fetch_fields maxdb_fetch_lengths maxdb_fetch_object maxdb_fetch_row maxdb_field_count maxdb_field_seek maxdb_field_tell maxdb_free_result maxdb_get_client_info maxdb_get_client_version maxdb_get_host_info maxdb_get_metadata maxdb_get_proto_info maxdb_get_server_info maxdb_get_server_version maxdb_info maxdb_init maxdb_insert_id maxdb_isolationlevel maxdb_kill maxdb_master_query maxdb_more_results maxdb_multi_query maxdb_next_result maxdb_num maxdb_num_fields maxdb_num_rows maxdb_options maxdb_packetcount maxdb_param_count maxdb_ping maxdb_prepare maxdb_query maxdb_real_connect maxdb_real_escape_string maxdb_real_query maxdb_report maxdb_rollback maxdb_rpl_parse_enabled maxdb_rpl_probe maxdb_rpl_query_type maxdb_select_db maxdb_send_long_data maxdb_send_query maxdb_server_end maxdb_server_init maxdb_set_opt maxdb_sqlmode maxdb_sqlstate maxdb_ssl_set maxdb_stat maxdb_statementcachesize maxdb_stmt_affected_rows maxdb_stmt_bind_param maxdb_stmt_bind_result maxdb_stmt_close maxdb_stmt_close_long_data maxdb_stmt_data_seek maxdb_stmt_errno maxdb_stmt_error maxdb_stmt_execute maxdb_stmt_fetch maxdb_stmt_free_result maxdb_stmt_init maxdb_stmt_num_rows maxdb_stmt_param_count maxdb_stmt_prepare maxdb_stmt_reset maxdb_stmt_result_metadata maxdb_stmt_send_long_data maxdb_stmt_sqlstate maxdb_stmt_store_result maxdb_store_result maxdb_thread_id maxdb_thread_safe maxdb_timeout maxdb_unicode maxdb_use_result maxdb_warning_count mb_case_lower mb_case_title mb_case_upper mb_check_encoding mb_convert_case mb_convert_encoding mb_convert_kana mb_convert_variables mb_decode_mimeheader mb_decode_numericentity mb_detect_encoding mb_detect_order mb_encode_mimeheader mb_encode_numericentity mb_encoding_aliases mb_ereg mb_ereg_match mb_ereg_replace mb_ereg_replace_callback mb_ereg_search mb_ereg_search_getpos mb_ereg_search_getregs mb_ereg_search_init mb_ereg_search_pos mb_ereg_search_regs mb_ereg_search_setpos mb_eregi mb_eregi_replace mb_get_info mb_http_input mb_http_output mb_internal_encoding mb_language mb_list_encodings mb_output_handler mb_overload_mail mb_overload_regex mb_overload_string mb_parse_str mb_preferred_mime_name mb_regex_encoding mb_regex_set_options mb_send_mail mb_split mb_strcut mb_strimwidth mb_stripos mb_stristr mb_strlen mb_strpos mb_strrchr mb_strrichr mb_strripos mb_strrpos mb_strstr mb_strtolower mb_strtoupper mb_strwidth mb_substitute_character mb_substr mb_substr_count mbereg mbereg_match mbereg_replace mbereg_search mbereg_search_getpos mbereg_search_getregs mbereg_search_init mbereg_search_pos mbereg_search_regs mbereg_search_setpos mberegi mberegi_replace mbregex_encoding mbsplit mcast_block_source mcast_join_group mcast_join_source_group mcast_leave_group mcast_leave_source_group mcast_unblock_source mcrypt_3des mcrypt_arcfour mcrypt_arcfour_iv mcrypt_blowfish mcrypt_blowfish_compat mcrypt_cast_128 mcrypt_cast_256 mcrypt_cbc mcrypt_cfb mcrypt_create_iv mcrypt_crypt mcrypt_decrypt mcrypt_des mcrypt_dev_random mcrypt_dev_urandom mcrypt_ecb mcrypt_enc_get_algorithms_name mcrypt_enc_get_block_size mcrypt_enc_get_iv_size mcrypt_enc_get_key_size mcrypt_enc_get_modes_name mcrypt_enc_get_supported_key_sizes mcrypt_enc_is_block_algorithm mcrypt_enc_is_block_algorithm_mode mcrypt_enc_is_block_mode mcrypt_enc_self_test mcrypt_encrypt mcrypt_enigna mcrypt_generic mcrypt_generic_deinit mcrypt_generic_end mcrypt_generic_init mcrypt_get_block_size mcrypt_get_cipher_name mcrypt_get_iv_size mcrypt_get_key_size mcrypt_gost mcrypt_idea mcrypt_list_algorithms mcrypt_list_modes mcrypt_loki97 mcrypt_mars mcrypt_mode_cbc mcrypt_mode_cfb mcrypt_mode_ecb mcrypt_mode_nofb mcrypt_mode_ofb mcrypt_mode_stream mcrypt_module_close mcrypt_module_get_algo_block_size mcrypt_module_get_algo_key_size mcrypt_module_get_supported_key_sizes mcrypt_module_is_block_algorithm mcrypt_module_is_block_algorithm_mode mcrypt_module_is_block_mode mcrypt_module_open mcrypt_module_self_test mcrypt_ofb mcrypt_panama mcrypt_rand mcrypt_rc2 mcrypt_rc6 mcrypt_rijndael_128 mcrypt_rijndael_192 mcrypt_rijndael_256 mcrypt_safer128 mcrypt_safer64 mcrypt_saferplus mcrypt_serpent mcrypt_skipjack mcrypt_threeway mcrypt_tripledes mcrypt_twofish mcrypt_wake mcrypt_xtea md5 md5_file mdecrypt_generic memcache_add memcache_add_server memcache_append memcache_cas memcache_close memcache_compressed memcache_connect memcache_debug memcache_decrement memcache_delete memcache_flush memcache_get memcache_get_extended_stats memcache_get_server_status memcache_get_stats memcache_get_version memcache_have_session memcache_increment memcache_pconnect memcache_prepend memcache_replace memcache_set memcache_set_compress_threshold memcache_set_failure_callback memcache_set_server_params memory_get_peak_usage memory_get_usage memory_trace metaphone method_exists mhash mhash_adler32 mhash_count mhash_crc32 mhash_crc32b mhash_fnv132 mhash_fnv164 mhash_fnv1a32 mhash_fnv1a64 mhash_get_block_size mhash_get_hash_name mhash_gost mhash_haval128 mhash_haval160 mhash_haval192 mhash_haval224 mhash_haval256 mhash_joaat mhash_keygen_s2k mhash_md2 mhash_md4 mhash_md5 mhash_ripemd128 mhash_ripemd160 mhash_ripemd256 mhash_ripemd320 mhash_sha1 mhash_sha224 mhash_sha256 mhash_sha384 mhash_sha512 mhash_snefru256 mhash_tiger mhash_tiger128 mhash_tiger160 mhash_whirlpool microtime mime_content_type min ming_keypress ming_new ming_setcubicthreshold ming_setscale ming_setswfcompression ming_useconstants ming_useswfversion ming_zlib mk_e_unavailable mkdir mktime mon_1 mon_10 mon_11 mon_12 mon_2 mon_3 mon_4 mon_5 mon_6 mon_7 mon_8 mon_9 mon_decimal_point mon_grouping mon_thousands_sep money_format mongo_stream_notify_io_completed mongo_stream_notify_io_progress mongo_stream_notify_io_read mongo_stream_notify_io_write mongo_stream_notify_log_batchinsert mongo_stream_notify_log_cmd_delete mongo_stream_notify_log_cmd_insert mongo_stream_notify_log_cmd_update mongo_stream_notify_log_delete mongo_stream_notify_log_getmore mongo_stream_notify_log_insert mongo_stream_notify_log_killcursor mongo_stream_notify_log_query mongo_stream_notify_log_response_header mongo_stream_notify_log_update mongo_stream_notify_log_write_batch mongo_stream_notify_log_write_reply mongo_stream_notify_type_io_init mongo_stream_notify_type_log mongo_streams mongo_supports_auth_mechanism_gssapi mongo_supports_auth_mechanism_mongodb_cr mongo_supports_auth_mechanism_mongodb_x509 mongo_supports_auth_mechanism_plain mongo_supports_ssl mongo_supports_streams move_uploaded_file mqseries_back mqseries_begin mqseries_close mqseries_cmit mqseries_conn mqseries_connx mqseries_disc mqseries_get mqseries_inq mqseries_mqcc_failed mqseries_mqcc_ok mqseries_mqcc_unknown mqseries_mqcc_warning mqseries_open mqseries_put mqseries_put1 mqseries_set mqseries_strerror msession_connect msession_count msession_create msession_destroy msession_disconnect msession_find msession_get msession_get_array msession_get_data msession_inc msession_list msession_listvar msession_lock msession_plugin msession_randstr msession_set msession_set_array msession_set_data msession_timeout msession_uniq msession_unlock msg_ctrunc msg_dontroute msg_dontwait msg_eagain msg_enomsg msg_eof msg_eor msg_except msg_get_queue msg_ipc_nowait msg_noerror msg_oob msg_peek msg_queue_exists msg_receive msg_remove_queue msg_send msg_set_queue msg_stat_queue msg_trunc msg_waitall msgfmt_create msgfmt_format msgfmt_format_message msgfmt_get_error_code msgfmt_get_error_message msgfmt_get_locale msgfmt_get_pattern msgfmt_parse msgfmt_parse_message msgfmt_set_pattern msql msql_affected_rows msql_assoc msql_both msql_close msql_connect msql_create_db msql_createdb msql_data_seek msql_db_query msql_dbname msql_drop_db msql_error msql_fetch_array msql_fetch_field msql_fetch_object msql_fetch_row msql_field_flags msql_field_len msql_field_name msql_field_seek msql_field_table msql_field_type msql_fieldflags msql_fieldlen msql_fieldname msql_fieldtable msql_fieldtype msql_free_result msql_list_dbs msql_list_fields msql_list_tables msql_num msql_num_fields msql_num_rows msql_numfields msql_numrows msql_pconnect msql_query msql_regcase msql_result msql_select_db msql_tablename mssql_assoc mssql_bind mssql_both mssql_close mssql_connect mssql_data_seek mssql_execute mssql_fetch_array mssql_fetch_assoc mssql_fetch_batch mssql_fetch_field mssql_fetch_object mssql_fetch_row mssql_field_length mssql_field_name mssql_field_seek mssql_field_type mssql_free_result + mssql_free_statement mssql_get_last_message mssql_guid_string mssql_init mssql_min_error_severity mssql_min_message_severity mssql_next_result mssql_num mssql_num_fields mssql_num_rows mssql_pconnect mssql_query mssql_result mssql_rows_affected mssql_select_db mt_getrandmax mt_rand mt_srand mysql mysql_affected_rows mysql_assoc mysql_both mysql_client_compress mysql_client_encoding mysql_client_ignore_space mysql_client_interactive mysql_client_ssl mysql_close mysql_connect mysql_create_db mysql_data_seek mysql_db_name mysql_db_query mysql_dbname mysql_drop_db mysql_errno mysql_error mysql_escape_string mysql_fetch_array mysql_fetch_assoc mysql_fetch_field mysql_fetch_lengths mysql_fetch_object mysql_fetch_row mysql_field_flags mysql_field_len mysql_field_name mysql_field_seek mysql_field_table mysql_field_type mysql_fieldflags mysql_fieldlen mysql_fieldname mysql_fieldtable mysql_fieldtype mysql_free_result mysql_freeresult mysql_get_client_info mysql_get_host_info mysql_get_proto_info mysql_get_server_info mysql_info mysql_insert_id mysql_list_dbs mysql_list_fields mysql_list_processes mysql_list_tables mysql_listdbs mysql_listfields mysql_listtables mysql_num mysql_num_fields mysql_num_rows mysql_numfields mysql_numrows mysql_pconnect mysql_ping mysql_query mysql_real_escape_string mysql_result mysql_select_db mysql_selectdb mysql_set_charset mysql_stat mysql_table_name mysql_tablename mysql_thread_id mysql_unbuffered_query mysqli_affected_rows mysqli_assoc mysqli_async mysqli_auto_increment_flag mysqli_autocommit mysqli_begin_transaction mysqli_binary_flag mysqli_bind_param mysqli_bind_result mysqli_blob_flag mysqli_both mysqli_change_user mysqli_character_set_name mysqli_client_can_handle_expired_passwords mysqli_client_compress mysqli_client_encoding mysqli_client_found_rows mysqli_client_ignore_space mysqli_client_interactive mysqli_client_multi_queries mysqli_client_no_schema mysqli_client_ssl mysqli_close mysqli_commit mysqli_connect mysqli_connect_errno mysqli_connect_error mysqli_cursor_type_for_update mysqli_cursor_type_no_cursor mysqli_cursor_type_read_only mysqli_cursor_type_scrollable mysqli_data_seek mysqli_data_truncated mysqli_debug mysqli_debug_trace_enabled mysqli_dump_debug_info mysqli_embedded_server_end mysqli_embedded_server_start mysqli_enum_flag mysqli_errno mysqli_error mysqli_error_list mysqli_escape_string mysqli_execute mysqli_fetch mysqli_fetch_all mysqli_fetch_array mysqli_fetch_assoc mysqli_fetch_field mysqli_fetch_field_direct mysqli_fetch_fields mysqli_fetch_lengths mysqli_fetch_object mysqli_fetch_row mysqli_field_count mysqli_field_seek mysqli_field_tell mysqli_free_result mysqli_get_cache_stats mysqli_get_charset mysqli_get_client_info mysqli_get_client_stats mysqli_get_client_version mysqli_get_connection_stats mysqli_get_host_info mysqli_get_links_stats mysqli_get_metadata mysqli_get_proto_info mysqli_get_server_info mysqli_get_server_version mysqli_get_warnings mysqli_group_flag mysqli_info mysqli_init mysqli_init_command mysqli_insert_id mysqli_kill mysqli_more_results mysqli_multi_query mysqli_multiple_key_flag mysqli_need_data mysqli_next_result mysqli_no_data mysqli_no_default_value_flag mysqli_not_null_flag mysqli_num mysqli_num_fields mysqli_num_flag mysqli_num_rows mysqli_on_update_now_flag mysqli_opt_can_handle_expired_passwords mysqli_opt_connect_timeout mysqli_opt_int_and_float_native mysqli_opt_local_infile mysqli_opt_net_cmd_buffer_size mysqli_opt_net_read_buffer_size mysqli_opt_ssl_verify_server_cert mysqli_options mysqli_param_count mysqli_part_key_flag mysqli_ping mysqli_poll mysqli_prepare mysqli_pri_key_flag mysqli_query mysqli_read_default_file mysqli_read_default_group mysqli_real_connect mysqli_real_escape_string mysqli_real_query mysqli_reap_async_query mysqli_refresh mysqli_refresh_backup_log mysqli_refresh_grant mysqli_refresh_hosts mysqli_refresh_log mysqli_refresh_master mysqli_refresh_slave mysqli_refresh_status mysqli_refresh_tables mysqli_refresh_threads mysqli_release_savepoint mysqli_report mysqli_report_all mysqli_report_error mysqli_report_index mysqli_report_off mysqli_report_strict mysqli_rollback mysqli_savepoint mysqli_select_db mysqli_send_long_data mysqli_server_ps_out_params mysqli_server_public_key mysqli_server_query_no_good_index_used mysqli_server_query_no_index_used mysqli_server_query_was_slow mysqli_set_charset mysqli_set_charset_dir mysqli_set_charset_name mysqli_set_flag mysqli_set_local_infile_default mysqli_set_local_infile_handler mysqli_set_opt mysqli_sqlstate mysqli_ssl_set mysqli_stat mysqli_stmt_affected_rows mysqli_stmt_attr_cursor_type mysqli_stmt_attr_get mysqli_stmt_attr_prefetch_rows mysqli_stmt_attr_set mysqli_stmt_attr_update_max_length mysqli_stmt_bind_param mysqli_stmt_bind_result mysqli_stmt_close mysqli_stmt_data_seek mysqli_stmt_errno mysqli_stmt_error mysqli_stmt_error_list mysqli_stmt_execute mysqli_stmt_fetch mysqli_stmt_field_count mysqli_stmt_free_result mysqli_stmt_get_result mysqli_stmt_get_warnings mysqli_stmt_init mysqli_stmt_insert_id mysqli_stmt_more_results mysqli_stmt_next_result mysqli_stmt_num_rows mysqli_stmt_param_count mysqli_stmt_prepare mysqli_stmt_reset mysqli_stmt_result_metadata mysqli_stmt_send_long_data mysqli_stmt_sqlstate mysqli_stmt_store_result mysqli_store_result mysqli_store_result_copy_data mysqli_thread_id mysqli_thread_safe mysqli_timestamp_flag mysqli_trans_cor_and_chain mysqli_trans_cor_and_no_chain mysqli_trans_cor_no_release mysqli_trans_cor_release mysqli_trans_start_read_only mysqli_trans_start_read_write mysqli_trans_start_with_consistent_snapshot mysqli_type_bit mysqli_type_blob mysqli_type_char mysqli_type_date mysqli_type_datetime mysqli_type_decimal mysqli_type_double mysqli_type_enum mysqli_type_float mysqli_type_geometry mysqli_type_int24 mysqli_type_interval mysqli_type_long mysqli_type_long_blob mysqli_type_longlong mysqli_type_medium_blob mysqli_type_newdate mysqli_type_newdecimal mysqli_type_null mysqli_type_set mysqli_type_short mysqli_type_string mysqli_type_time mysqli_type_timestamp mysqli_type_tiny mysqli_type_tiny_blob mysqli_type_var_string mysqli_type_year mysqli_unique_key_flag mysqli_unsigned_flag mysqli_use_result mysqli_warning_count mysqli_zerofill_flag n_cs_precedes n_sep_by_space n_sign_posn namespace nan natcasesort natsort ncurses_addch ncurses_addchnstr ncurses_addchstr ncurses_addnstr ncurses_addstr ncurses_all_mouse_events ncurses_assume_default_colors ncurses_attroff ncurses_attron ncurses_attrset ncurses_baudrate ncurses_beep ncurses_bkgd ncurses_bkgdset ncurses_border ncurses_bottom_panel ncurses_button1_clicked ncurses_button1_double_clicked ncurses_button1_pressed ncurses_button1_released ncurses_button1_triple_clicked ncurses_button_alt ncurses_button_ctrl ncurses_button_shift ncurses_can_change_color ncurses_cbreak ncurses_clear ncurses_clrtobot ncurses_clrtoeol ncurses_color_black ncurses_color_blue ncurses_color_content ncurses_color_cyan ncurses_color_green ncurses_color_magenta ncurses_color_red ncurses_color_set ncurses_color_white ncurses_color_yellow ncurses_curs_set ncurses_def_prog_mode ncurses_def_shell_mode ncurses_define_key ncurses_del_panel ncurses_delay_output ncurses_delch ncurses_deleteln ncurses_delwin ncurses_doupdate ncurses_echo ncurses_echochar ncurses_end ncurses_erase ncurses_erasechar ncurses_filter ncurses_flash ncurses_flushinp ncurses_getch ncurses_getmaxyx ncurses_getmouse ncurses_getyx ncurses_halfdelay ncurses_has_colors ncurses_has_ic ncurses_has_il ncurses_has_key ncurses_hide_panel ncurses_hline ncurses_inch ncurses_init ncurses_init_color ncurses_init_pair ncurses_insch ncurses_insdelln ncurses_insertln ncurses_insstr ncurses_instr ncurses_isendwin ncurses_key_a1 ncurses_key_a3 ncurses_key_b2 ncurses_key_backspace ncurses_key_beg ncurses_key_btab ncurses_key_c1 ncurses_key_c3 ncurses_key_cancel ncurses_key_catab ncurses_key_clear ncurses_key_close ncurses_key_command ncurses_key_copy ncurses_key_create ncurses_key_ctab ncurses_key_dc ncurses_key_dl ncurses_key_down ncurses_key_eic ncurses_key_end ncurses_key_eol ncurses_key_eos ncurses_key_exit ncurses_key_f0 ncurses_key_find ncurses_key_help ncurses_key_home ncurses_key_ic ncurses_key_il ncurses_key_left ncurses_key_ll ncurses_key_mark ncurses_key_max ncurses_key_message ncurses_key_mouse ncurses_key_move ncurses_key_next ncurses_key_npage ncurses_key_open ncurses_key_options ncurses_key_ppage ncurses_key_previous ncurses_key_print ncurses_key_redo ncurses_key_reference ncurses_key_refresh ncurses_key_replace ncurses_key_reset ncurses_key_restart ncurses_key_resume ncurses_key_right ncurses_key_save ncurses_key_sbeg ncurses_key_scancel ncurses_key_scommand ncurses_key_scopy ncurses_key_screate ncurses_key_sdc ncurses_key_sdl ncurses_key_select ncurses_key_send ncurses_key_seol ncurses_key_sexit ncurses_key_sf ncurses_key_sfind ncurses_key_shelp ncurses_key_shome ncurses_key_sic ncurses_key_sleft ncurses_key_smessage ncurses_key_smove ncurses_key_snext ncurses_key_soptions ncurses_key_sprevious ncurses_key_sprint ncurses_key_sr ncurses_key_sredo ncurses_key_sreplace ncurses_key_sreset ncurses_key_sright ncurses_key_srsume ncurses_key_ssave ncurses_key_ssuspend ncurses_key_stab ncurses_key_undo ncurses_key_up ncurses_keyok ncurses_keypad ncurses_killchar ncurses_longname ncurses_meta ncurses_mouse_trafo ncurses_mouseinterval ncurses_mousemask ncurses_move ncurses_move_panel ncurses_mvaddch ncurses_mvaddchnstr ncurses_mvaddchstr ncurses_mvaddnstr ncurses_mvaddstr ncurses_mvcur ncurses_mvdelch ncurses_mvgetch ncurses_mvhline ncurses_mvinch ncurses_mvvline ncurses_mvwaddstr ncurses_napms ncurses_new_panel ncurses_newpad ncurses_newwin ncurses_nl ncurses_nocbreak ncurses_noecho ncurses_nonl ncurses_noqiflush ncurses_noraw ncurses_pair_content + ncurses_panel_above ncurses_panel_below ncurses_panel_window ncurses_pnoutrefresh ncurses_prefresh ncurses_putp ncurses_qiflush ncurses_raw ncurses_refresh ncurses_replace_panel ncurses_report_mouse_position ncurses_reset_prog_mode ncurses_reset_shell_mode ncurses_resetty ncurses_savetty ncurses_scr_dump ncurses_scr_init ncurses_scr_restore ncurses_scr_set ncurses_scrl ncurses_show_panel ncurses_slk_attr ncurses_slk_attroff ncurses_slk_attron ncurses_slk_attrset ncurses_slk_clear ncurses_slk_color ncurses_slk_init ncurses_slk_noutrefresh ncurses_slk_refresh ncurses_slk_restore ncurses_slk_set ncurses_slk_touch ncurses_standend ncurses_standout ncurses_start_color ncurses_termattrs ncurses_termname ncurses_timeout ncurses_top_panel ncurses_typeahead ncurses_ungetch ncurses_ungetmouse ncurses_update_panels ncurses_use_default_colors ncurses_use_env ncurses_use_extended_names ncurses_vidattr ncurses_vline ncurses_waddch ncurses_waddstr ncurses_wattroff ncurses_wattron ncurses_wattrset ncurses_wborder ncurses_wclear ncurses_wcolor_set ncurses_werase ncurses_wgetch ncurses_whline ncurses_wmouse_trafo ncurses_wmove ncurses_wnoutrefresh ncurses_wrefresh ncurses_wstandend ncurses_wstandout ncurses_wvline negative_sign new newt_anchor_bottom newt_anchor_left newt_anchor_right newt_anchor_top newt_arg_append newt_arg_last newt_bell newt_button newt_button_bar newt_centered_window newt_checkbox newt_checkbox_get_value newt_checkbox_set_flags newt_checkbox_set_value newt_checkbox_tree newt_checkbox_tree_add_item newt_checkbox_tree_find_item newt_checkbox_tree_get_current newt_checkbox_tree_get_entry_value newt_checkbox_tree_get_multi_selection newt_checkbox_tree_get_selection newt_checkbox_tree_multi newt_checkbox_tree_set_current newt_checkbox_tree_set_entry newt_checkbox_tree_set_entry_value newt_checkbox_tree_set_width newt_checkboxtree_collapsed newt_checkboxtree_expanded newt_checkboxtree_hide_box newt_checkboxtree_selected newt_checkboxtree_unselectable newt_checkboxtree_unselected newt_clear_key_buffer newt_cls newt_colorset_actbutton newt_colorset_actcheckbox newt_colorset_actlistbox newt_colorset_actsellistbox newt_colorset_acttextbox newt_colorset_border newt_colorset_button newt_colorset_checkbox newt_colorset_compactbutton newt_colorset_disentry newt_colorset_emptyscale newt_colorset_entry newt_colorset_fullscale newt_colorset_helpline newt_colorset_label newt_colorset_listbox newt_colorset_root newt_colorset_roottext newt_colorset_sellistbox newt_colorset_shadow newt_colorset_textbox newt_colorset_title newt_colorset_window newt_compact_button newt_component_add_callback newt_component_takes_focus newt_create_grid newt_cursor_off newt_cursor_on newt_delay newt_draw_form newt_draw_root_text newt_entry newt_entry_disabled newt_entry_get_value newt_entry_hidden newt_entry_returnexit newt_entry_scroll newt_entry_set newt_entry_set_filter newt_entry_set_flags newt_exit_component newt_exit_fdready newt_exit_hotkey newt_exit_timer newt_fd_except newt_fd_read newt_fd_write newt_finished newt_flag_border newt_flag_checkbox newt_flag_disabled newt_flag_hidden newt_flag_multiple newt_flag_nof12 newt_flag_password newt_flag_returnexit newt_flag_scroll newt_flag_selected newt_flag_showcursor newt_flag_wrap newt_flags_reset newt_flags_set newt_flags_toggle newt_form newt_form_add_component newt_form_add_components newt_form_add_hot_key newt_form_destroy newt_form_get_current newt_form_nof12 newt_form_run newt_form_set_background newt_form_set_height newt_form_set_size newt_form_set_timer newt_form_set_width newt_form_watch_fd newt_get_screen_size newt_grid_add_components_to_form newt_grid_basic_window newt_grid_component newt_grid_empty newt_grid_flag_growx newt_grid_flag_growy newt_grid_free newt_grid_get_size newt_grid_h_close_stacked newt_grid_h_stacked newt_grid_place newt_grid_set_field newt_grid_simple_window newt_grid_subgrid newt_grid_v_close_stacked newt_grid_v_stacked newt_grid_wrapped_window newt_grid_wrapped_window_at newt_init newt_key_bkspc newt_key_delete newt_key_down newt_key_end newt_key_enter newt_key_escape newt_key_extra_base newt_key_f1 newt_key_f10 newt_key_f11 newt_key_f12 newt_key_f2 newt_key_f3 newt_key_f4 newt_key_f5 newt_key_f6 newt_key_f7 newt_key_f8 newt_key_f9 newt_key_home newt_key_insert newt_key_left newt_key_pgdn newt_key_pgup newt_key_resize newt_key_return newt_key_right newt_key_suspend newt_key_tab newt_key_untab newt_key_up newt_label newt_label_set_text newt_listbox newt_listbox_append_entry newt_listbox_clear newt_listbox_clear_selection newt_listbox_delete_entry newt_listbox_get_current newt_listbox_get_selection newt_listbox_insert_entry newt_listbox_item_count newt_listbox_returnexit newt_listbox_select_item newt_listbox_set_current newt_listbox_set_current_by_key newt_listbox_set_data newt_listbox_set_entry newt_listbox_set_width newt_listitem newt_listitem_get_data newt_listitem_set newt_open_window newt_pop_help_line newt_pop_window newt_push_help_line newt_radio_get_current newt_radiobutton newt_redraw_help_line newt_reflow_text newt_refresh newt_resize_screen newt_resume newt_run_form newt_scale newt_scale_set newt_scrollbar_set newt_set_help_callback newt_set_suspend_callback newt_suspend newt_textbox newt_textbox_get_num_lines newt_textbox_reflowed newt_textbox_scroll newt_textbox_set_height newt_textbox_set_text newt_textbox_wrap newt_vertical_scrollbar newt_wait_for_key newt_win_choice newt_win_entries newt_win_menu newt_win_message newt_win_messagev newt_win_ternary next ngettext nil nl2br nl_langinfo noexpr norm_ignorecase norm_ignorekanatype norm_ignorekashida norm_ignorenonspace norm_ignoresymbols norm_ignorewidth normalizer_is_normalized normalizer_normalize nostr nthmac null number_format numfmt_create numfmt_format numfmt_format_currency numfmt_get_attribute numfmt_get_error_code numfmt_get_error_message numfmt_get_locale numfmt_get_pattern numfmt_get_symbol numfmt_get_text_attribute numfmt_parse numfmt_parse_currency numfmt_set_attribute numfmt_set_pattern numfmt_set_symbol numfmt_set_text_attribute o_append o_async o_creat o_excl o_ndelay o_noctty o_nonblock o_rdonly o_rdwr o_sync o_trunc o_wronly ob_clean ob_deflatehandler ob_end_clean ob_end_flush ob_etaghandler ob_flush ob_get_clean ob_get_contents ob_get_flush ob_get_length ob_get_level ob_get_status ob_gzhandler ob_iconv_handler ob_implicit_flush ob_inflatehandler ob_list_handlers ob_start ob_tidyhandler object oci_assoc oci_b_bfile oci_b_bin oci_b_blob oci_b_bol oci_b_cfilee oci_b_clob oci_b_cursor oci_b_int oci_b_nty oci_b_num oci_b_rowid oci_bind_array_by_name oci_bind_by_name oci_both oci_cancel oci_client_version oci_close oci_commit oci_commit_on_success oci_connect oci_cred_ext oci_d_file oci_d_lob oci_d_rowid oci_default oci_define_by_name oci_describe_only oci_dtype_file oci_dtype_lob oci_dtype_rowid oci_error oci_exact_fetch oci_execute oci_fetch oci_fetch_all oci_fetch_array oci_fetch_assoc oci_fetch_object oci_fetch_row oci_fetchstatement_by_column oci_fetchstatement_by_row oci_field_is_null oci_field_name oci_field_precision oci_field_scale oci_field_size oci_field_type oci_field_type_raw oci_free_descriptor oci_free_statement oci_get_implicit_resultset oci_internal_debug oci_lob_buffer_free oci_lob_copy oci_lob_is_equal oci_new_collection oci_new_connect oci_new_cursor oci_new_descriptor oci_no_auto_commit oci_num oci_num_fields oci_num_rows oci_parse oci_password_change oci_pconnect oci_result oci_return_lobs oci_return_nulls oci_rollback oci_seek_cur oci_seek_end oci_seek_set oci_server_version oci_set_action oci_set_client_identifier oci_set_client_info oci_set_edition oci_set_module_name oci_set_prefetch oci_statement_type oci_sysdate oci_sysdba oci_sysoper oci_temp_blob oci_temp_clob ocibindbyname ocicolumnisnull ocicolumnname ocicolumnsize ocicolumntype ocicommit ocidefinebyname ocierror ociexecute ocifetch ocifetchinto ocifetchstatement ocifreestatement ocilogoff ocilogon ocinewcursor ocinewdescriptor ocinlogon ocinumcols ociparse ociplogon ociresult ocirollback ocirowcount ociserverversion ocistatementtype octdec odbc_autocommit odbc_binmode odbc_binmode_convert odbc_binmode_passthru odbc_binmode_return odbc_close odbc_close_all odbc_columnprivileges odbc_columns odbc_commit odbc_connect odbc_cursor odbc_data_source odbc_do odbc_error odbc_errormsg odbc_exec odbc_execute odbc_fetch_array odbc_fetch_into odbc_fetch_object odbc_fetch_row odbc_field_len odbc_field_name odbc_field_num odbc_field_precision odbc_field_scale odbc_field_type odbc_foreignkeys odbc_free_result odbc_gettypeinfo odbc_longreadlen odbc_next_result odbc_num_fields odbc_num_rows odbc_pconnect odbc_prepare odbc_primarykeys odbc_procedurecolumns odbc_procedures odbc_result odbc_result_all odbc_rollback odbc_setoption odbc_specialcolumns odbc_statistics odbc_tableprivileges odbc_tables odbc_type oggvorbis_pcm_s16_be oggvorbis_pcm_s16_le oggvorbis_pcm_s8 oggvorbis_pcm_u16_be oggvorbis_pcm_u16_le oggvorbis_pcm_u8 old_function op_anonymous op_debug op_expunge op_halfopen op_prototype op_readonly op_secure op_shortcache op_silent opcache_compile_file opcache_get_configuration opcache_get_status opcache_invalidate opcache_is_script_cached opcache_reset openal_buffer_create openal_buffer_data openal_buffer_destroy openal_buffer_get openal_buffer_loadwav openal_context_create openal_context_current openal_context_destroy openal_context_process openal_context_suspend openal_device_close openal_device_open openal_listener_get openal_listener_set openal_source_create openal_source_destroy openal_source_get openal_source_pause openal_source_play openal_source_rewind openal_source_set openal_source_stop openal_stream opendir openlog openssl_algo_dss1 openssl_algo_md4 openssl_algo_md5 openssl_algo_rmd160 openssl_algo_sha1 + openssl_algo_sha224 openssl_algo_sha256 openssl_algo_sha384 openssl_algo_sha512 openssl_cipher_3des openssl_cipher_aes_128_cbc openssl_cipher_aes_192_cbc openssl_cipher_aes_256_cbc openssl_cipher_des openssl_cipher_iv_length openssl_cipher_rc2_128 openssl_cipher_rc2_40 openssl_cipher_rc2_64 openssl_csr_export openssl_csr_export_to_file openssl_csr_get_public_key openssl_csr_get_subject openssl_csr_new openssl_csr_sign openssl_decrypt openssl_default_stream_ciphers openssl_dh_compute_key openssl_digest openssl_encrypt openssl_error_string openssl_free_key openssl_get_cert_locations openssl_get_cipher_methods openssl_get_md_methods openssl_get_privatekey openssl_get_publickey openssl_keytype_dh openssl_keytype_dsa openssl_keytype_ec openssl_keytype_rsa openssl_no_padding openssl_open openssl_pbkdf2 openssl_pkcs12_export openssl_pkcs12_export_to_file openssl_pkcs12_read openssl_pkcs1_oaep_padding openssl_pkcs1_padding openssl_pkcs7_decrypt openssl_pkcs7_encrypt openssl_pkcs7_sign openssl_pkcs7_verify openssl_pkey_export openssl_pkey_export_to_file openssl_pkey_free openssl_pkey_get_details openssl_pkey_get_private openssl_pkey_get_public openssl_pkey_new openssl_private_decrypt openssl_private_encrypt openssl_public_decrypt openssl_public_encrypt openssl_random_pseudo_bytes openssl_raw_data openssl_seal openssl_sign openssl_spki_export openssl_spki_export_challenge openssl_spki_new openssl_spki_verify openssl_sslv23_padding openssl_tlsext_server_name openssl_verify openssl_version_number openssl_version_text openssl_x509_check_private_key openssl_x509_checkpurpose openssl_x509_export openssl_x509_export_to_file openssl_x509_fingerprint openssl_x509_free openssl_x509_parse openssl_x509_read openssl_zero_padding or ord output_add_rewrite_var output_reset_rewrite_vars override_function p_cs_precedes p_sep_by_space p_sign_posn pack parent parse_ini_file parse_ini_string parse_str parse_url parsekit_compile_file parsekit_compile_string parsekit_extended_value parsekit_func_arginfo parsekit_is_const parsekit_is_tmp_var parsekit_is_unused parsekit_is_var parsekit_quiet parsekit_result_const parsekit_result_ea_type parsekit_result_jmp_addr parsekit_result_oparray parsekit_result_opline parsekit_result_var parsekit_simple parsekit_usage_unknown parsekit_zend_add parsekit_zend_add_array_element parsekit_zend_add_char parsekit_zend_add_interface parsekit_zend_add_string parsekit_zend_add_var parsekit_zend_assign parsekit_zend_assign_add parsekit_zend_assign_bw_and parsekit_zend_assign_bw_or parsekit_zend_assign_bw_xor parsekit_zend_assign_concat parsekit_zend_assign_dim parsekit_zend_assign_div parsekit_zend_assign_mod parsekit_zend_assign_mul parsekit_zend_assign_obj parsekit_zend_assign_ref parsekit_zend_assign_sl parsekit_zend_assign_sr parsekit_zend_assign_sub parsekit_zend_begin_silence parsekit_zend_bool parsekit_zend_bool_not parsekit_zend_bool_xor parsekit_zend_brk parsekit_zend_bw_and parsekit_zend_bw_not parsekit_zend_bw_or parsekit_zend_bw_xor parsekit_zend_case parsekit_zend_cast parsekit_zend_catch parsekit_zend_clone parsekit_zend_concat parsekit_zend_cont parsekit_zend_declare_class parsekit_zend_declare_function parsekit_zend_declare_inherited_class parsekit_zend_div parsekit_zend_do_fcall parsekit_zend_do_fcall_by_name parsekit_zend_echo parsekit_zend_end_silence parsekit_zend_eval_code parsekit_zend_exit parsekit_zend_ext_fcall_begin parsekit_zend_ext_fcall_end parsekit_zend_ext_nop parsekit_zend_ext_stmt parsekit_zend_fe_fetch parsekit_zend_fe_reset parsekit_zend_fetch_class parsekit_zend_fetch_constant parsekit_zend_fetch_dim_func_arg parsekit_zend_fetch_dim_is parsekit_zend_fetch_dim_r parsekit_zend_fetch_dim_rw parsekit_zend_fetch_dim_tmp_var parsekit_zend_fetch_dim_unset parsekit_zend_fetch_dim_w parsekit_zend_fetch_func_arg parsekit_zend_fetch_is parsekit_zend_fetch_obj_func_arg parsekit_zend_fetch_obj_is parsekit_zend_fetch_obj_r parsekit_zend_fetch_obj_rw parsekit_zend_fetch_obj_unset parsekit_zend_fetch_obj_w parsekit_zend_fetch_r parsekit_zend_fetch_rw parsekit_zend_fetch_unset parsekit_zend_fetch_w parsekit_zend_free parsekit_zend_handle_exception parsekit_zend_import_class parsekit_zend_import_const parsekit_zend_import_function parsekit_zend_include_or_eval parsekit_zend_init_array parsekit_zend_init_ctor_call parsekit_zend_init_fcall_by_name parsekit_zend_init_method_call parsekit_zend_init_static_method_call parsekit_zend_init_string parsekit_zend_instanceof parsekit_zend_internal_class parsekit_zend_internal_function parsekit_zend_is_equal parsekit_zend_is_identical parsekit_zend_is_not_equal parsekit_zend_is_not_identical parsekit_zend_is_smaller parsekit_zend_is_smaller_or_equal parsekit_zend_isset_isempty parsekit_zend_isset_isempty_dim_obj parsekit_zend_isset_isempty_prop_obj parsekit_zend_isset_isempty_var parsekit_zend_jmp parsekit_zend_jmp_no_ctor parsekit_zend_jmpnz parsekit_zend_jmpnz_ex parsekit_zend_jmpz parsekit_zend_jmpz_ex parsekit_zend_jmpznz parsekit_zend_mod parsekit_zend_mul parsekit_zend_new parsekit_zend_nop parsekit_zend_op_data parsekit_zend_overloaded_function parsekit_zend_overloaded_function_temporary parsekit_zend_post_dec parsekit_zend_post_dec_obj parsekit_zend_post_inc parsekit_zend_post_inc_obj parsekit_zend_pre_dec parsekit_zend_pre_dec_obj parsekit_zend_pre_inc parsekit_zend_pre_inc_obj parsekit_zend_print parsekit_zend_qm_assign parsekit_zend_raise_abstract_error parsekit_zend_recv parsekit_zend_recv_init parsekit_zend_return parsekit_zend_send_ref parsekit_zend_send_val parsekit_zend_send_var parsekit_zend_send_var_no_ref parsekit_zend_sl parsekit_zend_sr parsekit_zend_sub parsekit_zend_switch_free parsekit_zend_throw parsekit_zend_ticks parsekit_zend_unset_dim_obj parsekit_zend_unset_var parsekit_zend_user_class parsekit_zend_user_function parsekit_zend_verify_abstract_class passthru password_bcrypt password_bcrypt_default_cost password_default password_get_info password_hash password_needs_rehash password_verify path_separator pathinfo pathinfo_basename pathinfo_dirname pathinfo_extension pathinfo_filename pclose pcntl_alarm pcntl_errno pcntl_exec pcntl_fork pcntl_get_last_error pcntl_getpriority pcntl_setpriority pcntl_signal pcntl_signal_dispatch pcntl_sigprocmask pcntl_sigtimedwait pcntl_sigwaitinfo pcntl_strerror pcntl_wait pcntl_waitpid pcntl_wexitstatus pcntl_wifexited pcntl_wifsignaled pcntl_wifstopped pcntl_wstopsig pcntl_wtermsig pcre_version pdf_activate_item pdf_add_annotation pdf_add_bookmark pdf_add_launchlink pdf_add_locallink pdf_add_nameddest pdf_add_note pdf_add_outline pdf_add_pdflink pdf_add_table_cell pdf_add_textflow pdf_add_thumbnail pdf_add_weblink pdf_arc pdf_arcn pdf_attach_file pdf_begin_document pdf_begin_font pdf_begin_glyph pdf_begin_item pdf_begin_layer pdf_begin_page pdf_begin_page_ext pdf_begin_pattern pdf_begin_template pdf_begin_template_ext pdf_circle pdf_clip pdf_close pdf_close_image pdf_close_pdi pdf_close_pdi_page pdf_closepath pdf_closepath_fill_stroke pdf_closepath_stroke pdf_concat pdf_continue_text pdf_create_3dview pdf_create_action pdf_create_annotation pdf_create_bookmark pdf_create_field pdf_create_fieldgroup pdf_create_gstate pdf_create_pvf pdf_create_textflow pdf_curveto pdf_define_layer pdf_delete pdf_delete_pvf pdf_delete_table pdf_delete_textflow pdf_encoding_set_char pdf_end_document pdf_end_font pdf_end_glyph pdf_end_item pdf_end_layer pdf_end_page pdf_end_page_ext pdf_end_pattern pdf_end_template pdf_endpath pdf_fill pdf_fill_imageblock pdf_fill_pdfblock pdf_fill_stroke pdf_fill_textblock pdf_findfont pdf_fit_image pdf_fit_pdi_page pdf_fit_table pdf_fit_textflow pdf_fit_textline pdf_get_apiname pdf_get_buffer pdf_get_errmsg pdf_get_errnum pdf_get_font pdf_get_fontname pdf_get_fontsize pdf_get_image_height pdf_get_image_width pdf_get_majorversion pdf_get_minorversion pdf_get_parameter pdf_get_pdi_parameter pdf_get_pdi_value pdf_get_value pdf_info_font pdf_info_matchbox pdf_info_table pdf_info_textflow pdf_info_textline pdf_initgraphics pdf_lineto pdf_load_3ddata pdf_load_font pdf_load_iccprofile pdf_load_image pdf_makespotcolor pdf_moveto pdf_new pdf_open_ccitt pdf_open_file pdf_open_gif pdf_open_image pdf_open_image_file pdf_open_jpeg pdf_open_memory_image pdf_open_pdi pdf_open_pdi_document pdf_open_pdi_page pdf_open_tiff pdf_pcos_get_number pdf_pcos_get_stream pdf_pcos_get_string pdf_place_image pdf_place_pdi_page pdf_process_pdi pdf_rect pdf_restore pdf_resume_page pdf_rotate pdf_save pdf_scale pdf_set_border_color pdf_set_border_dash pdf_set_border_style pdf_set_char_spacing pdf_set_duration pdf_set_gstate pdf_set_horiz_scaling pdf_set_info pdf_set_info_author pdf_set_info_creator pdf_set_info_keywords pdf_set_info_subject pdf_set_info_title pdf_set_layer_dependency pdf_set_leading pdf_set_parameter pdf_set_text_matrix pdf_set_text_pos pdf_set_text_rendering pdf_set_text_rise pdf_set_value pdf_set_word_spacing pdf_setcolor pdf_setdash pdf_setdashpattern pdf_setflat pdf_setfont pdf_setgray pdf_setgray_fill pdf_setgray_stroke pdf_setlinecap pdf_setlinejoin pdf_setlinewidth pdf_setmatrix pdf_setmiterlimit pdf_setpolydash pdf_setrgbcolor pdf_setrgbcolor_fill pdf_setrgbcolor_stroke pdf_shading pdf_shading_pattern pdf_shfill pdf_show pdf_show_boxed pdf_show_xy pdf_skew pdf_stringwidth pdf_stroke pdf_suspend_page pdf_translate pdf_utf16_to_utf8 pdf_utf32_to_utf16 pdf_utf8_to_utf16 pdo_drivers pear_extension_dir pear_install_dir pfsockopen pg_affected_rows pg_cancel_query pg_client_encoding pg_clientencoding pg_close pg_cmdtuples pg_connect pg_connect_poll pg_connection_busy pg_connection_reset pg_connection_status pg_consume_input pg_convert pg_copy_from pg_copy_to pg_dbname pg_delete pg_end_copy pg_errormessage pg_escape_bytea pg_escape_identifier pg_escape_literal pg_escape_string pg_exec + pg_execute pg_fetch_all pg_fetch_all_columns pg_fetch_array pg_fetch_assoc pg_fetch_object pg_fetch_result pg_fetch_row pg_field_is_null pg_field_name pg_field_num pg_field_prtlen pg_field_size pg_field_table pg_field_type pg_field_type_oid pg_fieldisnull pg_fieldname pg_fieldnum pg_fieldprtlen pg_fieldsize pg_fieldtype pg_flush pg_free_result pg_freeresult pg_get_notify pg_get_pid pg_get_result pg_getlastoid pg_host pg_insert pg_last_error pg_last_notice pg_last_oid pg_lo_close pg_lo_create pg_lo_export pg_lo_import pg_lo_open pg_lo_read pg_lo_read_all pg_lo_seek pg_lo_tell pg_lo_truncate pg_lo_unlink pg_lo_write pg_loclose pg_locreate pg_loexport pg_loimport pg_loopen pg_loread pg_loreadall pg_lounlink pg_lowrite pg_meta_data pg_num_fields pg_num_rows pg_numfields pg_numrows pg_options pg_parameter_status pg_pconnect pg_ping pg_port pg_prepare pg_put_line pg_query pg_query_params pg_result pg_result_error pg_result_error_field pg_result_seek pg_result_status pg_select pg_send_execute pg_send_prepare pg_send_query pg_send_query_params pg_set_client_encoding pg_set_error_verbosity pg_setclientencoding pg_socket pg_trace pg_transaction_status pg_tty pg_unescape_bytea pg_untrace pg_update pg_version pgsql_assoc pgsql_bad_response pgsql_both pgsql_command_ok pgsql_connect_async pgsql_connect_force_new pgsql_connection_auth_ok pgsql_connection_awaiting_response pgsql_connection_bad pgsql_connection_made pgsql_connection_ok pgsql_connection_setenv pgsql_connection_started pgsql_conv_force_null pgsql_conv_ignore_default pgsql_conv_ignore_not_null pgsql_copy_in pgsql_copy_out pgsql_diag_context pgsql_diag_internal_position pgsql_diag_internal_query pgsql_diag_message_detail pgsql_diag_message_hint pgsql_diag_message_primary pgsql_diag_severity pgsql_diag_source_file pgsql_diag_source_function pgsql_diag_source_line pgsql_diag_sqlstate pgsql_diag_statement_position pgsql_dml_async pgsql_dml_escape pgsql_dml_exec pgsql_dml_no_conv pgsql_dml_string pgsql_empty_query pgsql_errors_default pgsql_errors_terse pgsql_errors_verbose pgsql_fatal_error pgsql_libpq_version pgsql_libpq_version_str pgsql_nonfatal_error pgsql_num pgsql_polling_active pgsql_polling_failed pgsql_polling_ok pgsql_polling_reading pgsql_polling_writing pgsql_seek_cur pgsql_seek_end pgsql_seek_set pgsql_status_long pgsql_status_string pgsql_transaction_active pgsql_transaction_idle pgsql_transaction_inerror pgsql_transaction_intrans pgsql_transaction_unknown pgsql_tuples_ok php_binary php_binary_read php_bindir php_check_syntax php_config_file_path php_config_file_scan_dir php_datadir php_debug php_egg_logo_guid php_eol php_extension_dir php_extra_version php_ini_loaded_file php_ini_scanned_files php_int_max php_int_size php_libdir php_localstatedir php_logo_guid php_major_version php_mandir php_maxpathlen php_minor_version php_normal_read php_os php_output_handler_clean php_output_handler_cleanable php_output_handler_cont php_output_handler_disabled php_output_handler_end php_output_handler_final php_output_handler_flush php_output_handler_flushable php_output_handler_removable php_output_handler_start php_output_handler_started php_output_handler_stdflags php_output_handler_write php_prefix php_query_rfc1738 php_query_rfc3986 php_real_logo_guid php_release_version php_round_half_down php_round_half_even php_round_half_odd php_round_half_up php_sapi php_sapi_name php_session_active php_session_disabled php_session_none php_shlib_suffix php_strip_whitespace php_svn_auth_param_ignore_ssl_verify_errors php_sysconfdir php_uname php_url_fragment php_url_host php_url_pass php_url_path php_url_port php_url_query php_url_scheme php_url_user php_version php_version_id php_windows_nt_domain_controller php_windows_nt_server php_windows_nt_workstation php_windows_version_build php_windows_version_major php_windows_version_minor php_windows_version_platform php_windows_version_producttype php_windows_version_sp_major php_windows_version_sp_minor php_windows_version_suitemask php_zts phpcredits phpinfo phpversion pi pkcs7_binary pkcs7_detached pkcs7_noattr pkcs7_nocerts pkcs7_nochain pkcs7_nointern pkcs7_nosigs pkcs7_noverify pkcs7_text pm_str png2wbmp png_all_filters png_filter_avg png_filter_none png_filter_paeth png_filter_sub png_filter_up png_no_filter poll_err poll_hup poll_in poll_msg poll_out poll_pri popen pos positive_sign posix_access posix_ctermid posix_errno posix_f_ok posix_get_last_error posix_getcwd posix_getegid posix_geteuid posix_getgid posix_getgrgid posix_getgrnam posix_getgroups posix_getlogin posix_getpgid posix_getpgrp posix_getpid posix_getppid posix_getpwnam posix_getpwuid posix_getrlimit posix_getsid posix_getuid posix_initgroups posix_isatty posix_kill posix_mkfifo posix_mknod posix_r_ok posix_s_ifblk posix_s_ifchr posix_s_ififo posix_s_ifreg posix_s_ifsock posix_setegid posix_seteuid posix_setgid posix_setpgid posix_setsid posix_setuid posix_strerror posix_times posix_ttyname posix_uname posix_w_ok posix_x_ok pow preg_backtrack_limit_error preg_bad_utf8_error preg_bad_utf8_offset_error preg_filter preg_grep preg_grep_invert preg_internal_error preg_last_error preg_match preg_match_all preg_no_error preg_offset_capture preg_pattern_order preg_quote preg_recursion_limit_error preg_replace preg_replace_callback preg_set_order preg_split preg_split_delim_capture preg_split_no_empty preg_split_offset_capture prev print print_r printf private proc_close proc_get_status proc_nice proc_open proc_terminate prof_trace property_exists protected ps_add_bookmark ps_add_launchlink ps_add_locallink ps_add_note ps_add_pdflink ps_add_weblink ps_arc ps_arcn ps_begin_page ps_begin_pattern ps_begin_template ps_circle ps_clip ps_close ps_close_image ps_closepath ps_closepath_stroke ps_continue_text ps_curveto ps_delete ps_end_page ps_end_pattern ps_end_template ps_fill ps_fill_stroke ps_findfont ps_get_buffer ps_get_parameter ps_get_value ps_hyphenate ps_include_file ps_linecap_butt ps_linecap_round ps_linecap_squared ps_linejoin_bevel ps_linejoin_miter ps_linejoin_round ps_lineto ps_makespotcolor ps_moveto ps_new ps_open_file ps_open_image ps_open_image_file ps_open_memory_image ps_place_image ps_rect ps_restore ps_rotate ps_save ps_scale ps_set_border_color ps_set_border_dash ps_set_border_style ps_set_info ps_set_parameter ps_set_text_pos ps_set_value ps_setcolor ps_setdash ps_setflat ps_setfont ps_setgray ps_setlinecap ps_setlinejoin ps_setlinewidth ps_setmiterlimit ps_setoverprintmode ps_setpolydash ps_shading ps_shading_pattern ps_shfill ps_show ps_show2 ps_show_boxed ps_show_xy ps_show_xy2 ps_string_geometry ps_stringwidth ps_stroke ps_symbol ps_symbol_name ps_symbol_width ps_translate psfs_err_fatal psfs_feed_me psfs_flag_flush_close psfs_flag_flush_inc psfs_flag_normal psfs_pass_on pspell_add_to_personal pspell_add_to_session pspell_bad_spellers pspell_check pspell_clear_session pspell_config_create pspell_config_data_dir pspell_config_dict_dir pspell_config_ignore pspell_config_mode pspell_config_personal pspell_config_repl pspell_config_runtogether pspell_config_save_repl pspell_fast pspell_new pspell_new_config pspell_new_personal pspell_normal pspell_run_together pspell_save_wordlist pspell_store_replacement pspell_suggest pthreads_allow_headers pthreads_inherit_all pthreads_inherit_classes pthreads_inherit_comments pthreads_inherit_constants pthreads_inherit_functions pthreads_inherit_includes pthreads_inherit_ini pthreads_inherit_none public putenv px_close px_create_fp px_date2string px_delete px_delete_record px_field_alpha px_field_autoinc px_field_bcd px_field_blob px_field_bytes px_field_currency px_field_date px_field_fmtmemoblob px_field_graphic px_field_logical px_field_long px_field_memoblob px_field_number px_field_ole px_field_short px_field_time px_field_timestamp px_file_inc_sec_index px_file_inc_sec_index_g px_file_index_db px_file_non_inc_sec_index px_file_non_inc_sec_index_g px_file_non_index_db px_file_prim_index px_file_sec_index px_file_sec_index_g px_get_field px_get_info px_get_parameter px_get_record px_get_schema px_get_value px_insert_record px_keytolower px_keytoupper px_new px_numfields px_numrecords px_open_fp px_put_record px_retrieve_record px_set_blob_file px_set_parameter px_set_tablename px_set_targetencoding px_set_value px_timestamp2string px_update_record quoted_printable_decode quoted_printable_encode quotemeta rad2deg radius_access_accept radius_access_challenge radius_access_reject radius_access_request radius_accounting_off radius_accounting_on radius_accounting_request radius_accounting_response radius_acct_authentic radius_acct_delay_time radius_acct_input_octets radius_acct_input_packets radius_acct_link_count radius_acct_multi_session_id radius_acct_open radius_acct_output_octets radius_acct_output_packets radius_acct_session_id radius_acct_session_time radius_acct_status_type radius_acct_terminate_cause radius_add_server radius_administrative radius_adsl_cap radius_adsl_dmt radius_arap radius_async radius_auth_local radius_auth_open radius_auth_radius radius_auth_remote radius_authenticate_only radius_cable radius_callback_framed radius_callback_id radius_callback_login radius_callback_nas_prompt radius_callback_number radius_called_station_id radius_calling_station_id radius_chap_challenge radius_chap_password radius_class radius_close radius_coa_ack radius_coa_nak radius_coa_request radius_comp_ipxhdr radius_comp_none radius_comp_stac_lzs radius_comp_vj radius_config radius_connect_info radius_create_request radius_cvt_addr radius_cvt_int radius_cvt_string radius_demangle radius_demangle_mppe_key radius_disconnect_ack radius_disconnect_nak radius_disconnect_request radius_ethernet radius_filter_id radius_framed radius_framed_appletalk_link radius_framed_appletalk_network radius_framed_appletalk_zone + radius_framed_compression radius_framed_ip_address radius_framed_ip_netmask radius_framed_ipx_network radius_framed_mtu radius_framed_protocol radius_framed_route radius_framed_routing radius_g_3_fax radius_gandalf radius_get_attr radius_get_tagged_attr_data radius_get_tagged_attr_tag radius_get_vendor_attr radius_hdlc_clear_channel radius_idle_timeout radius_idsl radius_isdn_async_v110 radius_isdn_async_v120 radius_isdn_sync radius_login radius_login_ip_host radius_login_lat_group radius_login_lat_node radius_login_lat_port radius_login_lat_service radius_login_service radius_login_tcp_port radius_microsoft_ms_acct_auth_type radius_microsoft_ms_acct_eap_type radius_microsoft_ms_arap_challenge radius_microsoft_ms_arap_password_change_reason radius_microsoft_ms_bap_usage radius_microsoft_ms_chap2_pw radius_microsoft_ms_chap2_response radius_microsoft_ms_chap2_success radius_microsoft_ms_chap_challenge radius_microsoft_ms_chap_domain radius_microsoft_ms_chap_error radius_microsoft_ms_chap_lm_enc_pw radius_microsoft_ms_chap_mppe_keys radius_microsoft_ms_chap_nt_enc_pw radius_microsoft_ms_chap_pw_1 radius_microsoft_ms_chap_pw_2 radius_microsoft_ms_chap_response radius_microsoft_ms_filter radius_microsoft_ms_link_drop_time_limit radius_microsoft_ms_link_utilization_threshold radius_microsoft_ms_mppe_encryption_policy radius_microsoft_ms_mppe_encryption_types radius_microsoft_ms_mppe_recv_key radius_microsoft_ms_mppe_send_key radius_microsoft_ms_new_arap_password radius_microsoft_ms_old_arap_password radius_microsoft_ms_primary_dns_server radius_microsoft_ms_primary_nbns_server radius_microsoft_ms_ras_vendor radius_microsoft_ms_ras_version radius_microsoft_ms_secondary_dns_server radius_microsoft_ms_secondary_nbns_server radius_mppe_key_len radius_nas_identifier radius_nas_ip_address radius_nas_port radius_nas_port_type radius_nas_prompt radius_option_salt radius_option_tagged radius_outbound radius_piafs radius_port_limit radius_ppp radius_proxy_state radius_put_addr radius_put_attr radius_put_int radius_put_string radius_put_vendor_addr radius_put_vendor_attr radius_put_vendor_int radius_put_vendor_string radius_reply_message radius_request_authenticator radius_salt_encrypt_attr radius_sdsl radius_send_request radius_server_secret radius_service_type radius_session_timeout radius_slip radius_start radius_state radius_stop radius_strerror radius_sync radius_term_admin_reboot radius_term_admin_reset radius_term_callback radius_term_host_request radius_term_idle_timeout radius_term_lost_carrier radius_term_lost_service radius_term_nas_error radius_term_nas_reboot radius_term_nas_request radius_term_port_error radius_term_port_preempted radius_term_port_suspended radius_term_port_unneeded radius_term_service_unavailable radius_term_session_timeout radius_term_user_error radius_term_user_request radius_termination_action radius_user_name radius_user_password radius_vendor_microsoft radius_vendor_specific radius_virtual radius_wireless_ieee_802_11 radius_wireless_other radius_x_25 radius_x_75 radius_xdsl radius_xylogics radixchar rand range rar_host_beos rar_host_msdos rar_host_os2 rar_host_unix rar_host_win32 rar_wrapper_cache_stats rawurldecode rawurlencode read_exif_data readdir readfile readgzfile readline readline_add_history readline_callback_handler_install readline_callback_handler_remove readline_callback_read_char readline_clear_history readline_completion_function readline_info readline_list_history readline_on_new_line readline_read_history readline_redisplay readline_write_history readlink real realpath realpath_cache_get realpath_cache_size register_shutdown_function register_tick_function rename rename_function require require_once reset resource resourcebundle_count resourcebundle_create resourcebundle_get resourcebundle_get_error_code resourcebundle_get_error_message resourcebundle_locales restore_error_handler restore_exception_handler restore_include_path return rewind rewinddir rmdir round rpm_close rpm_get_tag rpm_is_valid rpm_open rpm_version rpmreader_arch rpmreader_archivesize rpmreader_basenames rpmreader_buildarchs rpmreader_buildhost rpmreader_buildtime rpmreader_cachectime rpmreader_cachepkgmtime rpmreader_cachepkgpath rpmreader_cachepkgsize rpmreader_changelogname rpmreader_changelogtext rpmreader_changelogtime rpmreader_classdict rpmreader_conflictflags rpmreader_conflictname rpmreader_conflictversion rpmreader_cookie rpmreader_copyright rpmreader_dependsdict rpmreader_description rpmreader_dirindexes rpmreader_dirnames rpmreader_distribution rpmreader_disturl rpmreader_epoch rpmreader_excludearch rpmreader_excludeos rpmreader_exclusivearch rpmreader_exclusiveos rpmreader_fileclass rpmreader_filecolors rpmreader_filecontexts rpmreader_filedependsn rpmreader_filedependsx rpmreader_filedevices rpmreader_fileflags rpmreader_filegroupname rpmreader_fileinodes rpmreader_filelangs rpmreader_filelinktos rpmreader_filemd5s rpmreader_filemodes rpmreader_filemtimes rpmreader_filerdevs rpmreader_filesizes rpmreader_filestates rpmreader_fileusername rpmreader_fileverifyflags rpmreader_fscontexts rpmreader_gif rpmreader_group rpmreader_icon rpmreader_installcolor rpmreader_installtid rpmreader_installtime rpmreader_instprefixes rpmreader_license rpmreader_maximum rpmreader_minimum rpmreader_name rpmreader_obsoleteflags rpmreader_obsoletename rpmreader_obsoletes rpmreader_obsoleteversion rpmreader_oldfilenames rpmreader_optflags rpmreader_os rpmreader_packager rpmreader_patch rpmreader_patchesflags rpmreader_patchesname rpmreader_patchesversion rpmreader_payloadcompressor rpmreader_payloadflags rpmreader_payloadformat rpmreader_platform rpmreader_policies rpmreader_postin rpmreader_postinprog rpmreader_postun rpmreader_postunprog rpmreader_prefixes rpmreader_prein rpmreader_preinprog rpmreader_preun rpmreader_preunprog rpmreader_provideflags rpmreader_providename rpmreader_provides rpmreader_provideversion rpmreader_recontexts rpmreader_release rpmreader_removetid rpmreader_requireflags rpmreader_requirename rpmreader_requireversion rpmreader_rhnplatform rpmreader_rpmversion rpmreader_serial rpmreader_size rpmreader_source rpmreader_sourcepkgid rpmreader_sourcerpm rpmreader_summary rpmreader_triggerflags rpmreader_triggerindex rpmreader_triggername rpmreader_triggerscriptprog rpmreader_triggerscripts rpmreader_triggerversion rpmreader_url rpmreader_vendor rpmreader_verifyscript rpmreader_verifyscriptprog rpmreader_version rpmreader_xpm rsort rtrim s_all s_executor s_files s_include s_internal s_irgrp s_iroth s_irusr s_irwxg s_irwxo s_irwxu s_iwgrp s_iwoth s_iwusr s_ixgrp s_ixoth s_ixusr s_mail s_memory s_misc s_session s_sql s_vars sa_all sa_messages sa_recent sa_uidnext sa_uidvalidity sa_unseen scandir scandir_sort_ascending scandir_sort_descending scandir_sort_none se_free se_noprefetch se_uid seek_cur seek_end seek_set segv_accerr segv_maperr sem_acquire sem_get sem_release sem_remove serialize session_abort session_cache_expire session_cache_limiter session_commit session_decode session_destroy session_encode session_get_cookie_params session_id session_is_registered session_module_name session_name session_pgsql_add_error session_pgsql_get_error session_pgsql_get_field session_pgsql_reset session_pgsql_set_field session_pgsql_status session_regenerate_id session_register session_register_shutdown session_reset session_save_path session_set_cookie_params session_set_save_handler session_start session_status session_unregister session_unset session_write_close set_error_handler set_exception_handler set_file_buffer set_include_path set_magic_quotes_runtime set_socket_blocking set_time_limit setcookie setlocale setproctitle setrawcookie setthreadtitle settype sha1 sha1_file shell_exec shm_attach shm_detach shm_get_var shm_has_var shm_put_var shm_remove shm_remove_var shmop_close shmop_delete shmop_open shmop_read shmop_size shmop_write show_source shuffle si_asyncio si_kernel si_msggq si_noinfo si_queue si_sigio si_timer si_tkill si_user sid sig_block sig_dfl sig_err sig_ign sig_setmask sig_unblock sigabrt sigalrm sigbaby sigbus sigchld sigcld sigcont sigfpe sighup sigill sigint sigio sigiot sigkill signeurlpaiement sigpipe sigpoll sigprof sigpwr sigquit sigsegv sigstkflt sigstop sigsys sigterm sigtrap sigtstp sigttin sigttou sigurg sigusr1 sigusr2 sigvtalrm sigwinch sigxcpu sigxfsz similar_text simplexml_import_dom simplexml_load_file simplexml_load_string sin sinh sizeof sleep snmp2_get snmp2_getnext snmp2_real_walk snmp2_set snmp2_walk snmp3_get snmp3_getnext snmp3_real_walk snmp3_set snmp3_walk snmp_bit_str snmp_counter snmp_counter64 snmp_get_quick_print snmp_get_valueretrieval snmp_integer snmp_ipaddress snmp_null snmp_object_id snmp_octet_str snmp_oid_output_full snmp_oid_output_module snmp_oid_output_none snmp_oid_output_numeric snmp_oid_output_suffix snmp_oid_output_ucd snmp_opaque snmp_read_mib snmp_set_enum_print snmp_set_oid_numeric_print snmp_set_oid_output_format snmp_set_quick_print snmp_set_valueretrieval snmp_timeticks snmp_uinteger snmp_unsigned snmp_value_library snmp_value_object snmp_value_plain snmpget snmpgetnext snmprealwalk snmpset snmpwalk snmpwalkoid so_bindtodevice so_broadcast so_debug so_dontroute so_error so_free so_keepalive so_linger so_noserver so_oobinline so_rcvbuf so_rcvlowat so_rcvtimeo so_reuseaddr so_reuseport so_sndbuf so_sndlowat so_sndtimeo so_type soap_1_1 soap_1_2 soap_actor_next soap_actor_none soap_actor_unlimatereceiver soap_authentication_basic soap_authentication_digest soap_compression_accept soap_compression_deflate soap_compression_gzip soap_document soap_enc_array soap_enc_object soap_encoded soap_functions_all soap_literal soap_persistence_request soap_persistence_session soap_rpc soap_single_element_arrays soap_ssl_method_sslv2 soap_ssl_method_sslv23 + soap_ssl_method_sslv3 soap_ssl_method_tls soap_use_xsi_array_type soap_wait_one_way_calls sock_dgram sock_raw sock_rdm sock_seqpacket sock_stream socket_accept socket_addrinuse socket_bind socket_clear_error socket_close socket_cmsg_space socket_connect socket_create socket_create_listen socket_create_pair socket_e2big socket_eacces socket_eaddrinuse socket_eaddrnotavail socket_eadv socket_eafnosupport socket_eagain socket_ealready socket_ebade socket_ebadf socket_ebadfd socket_ebadmsg socket_ebadr socket_ebadrqc socket_ebadslt socket_ebusy socket_echrng socket_ecomm socket_econnaborted socket_econnrefused socket_econnreset socket_edestaddrreq socket_ediscon socket_edquot socket_eduot socket_eexist socket_efault socket_ehostdown socket_ehostunreach socket_eidrm socket_einprogress socket_eintr socket_einval socket_eio socket_eisconn socket_eisdir socket_eisnam socket_el2hlt socket_el2nsync socket_el3hlt socket_el3rst socket_elnrng socket_eloop socket_emediumtype socket_emfile socket_emlink socket_emsgsize socket_emultihop socket_enametoolong socket_enetdown socket_enetreset socket_enetunreach socket_enfile socket_enoano socket_enobufs socket_enocsi socket_enodata socket_enodev socket_enoent socket_enolck socket_enolink socket_enomedium socket_enomem socket_enomsg socket_enonet socket_enoprotoopt socket_enospc socket_enosr socket_enostr socket_enosys socket_enotblk socket_enotconn socket_enotdir socket_enotempty socket_enotsock socket_enotty socket_enotuniq socket_enxio socket_eopnotsupp socket_eperm socket_epfnosupport socket_epipe socket_eproclim socket_eproto socket_eprotonosupport socket_eprotoopt socket_eprototype socket_eremchg socket_eremote socket_eremoteio socket_erestart socket_erofs socket_eshutdown socket_esocktnosupport socket_espipe socket_esrmnt socket_estale socket_estrpipe socket_etime socket_etimedout socket_etoomanyrefs socket_etoomyrefs socket_eunatch socket_eusers socket_ewouldblock socket_exdev socket_exfull socket_get_option socket_get_status socket_getopt socket_getpeername socket_getsockname socket_host_not_found socket_import_stream socket_last_error socket_listen socket_no_address socket_no_data socket_no_recovery socket_notinitialised socket_read socket_recv socket_recvfrom socket_recvmsg socket_select socket_send socket_sendmsg socket_sendto socket_set_block socket_set_blocking socket_set_nonblock socket_set_option socket_set_timeout socket_setopt socket_shutdown socket_strerror socket_sysnotready socket_try_again socket_vernotsupported socket_write sol_socket sol_tcp sol_udp somaxconn sort sort_asc sort_desc sort_flag_case sort_locale_string sort_natural sort_numeric sort_regular sort_string sortarrival sortcc sortdate sortfrom sortsize sortsubject sortto soundex spl_autoload spl_autoload_call spl_autoload_extensions spl_autoload_functions spl_autoload_register spl_autoload_unregister spl_classes spl_object_hash split spliti sprintf sql_best_rowid sql_bigint sql_binary sql_bit sql_char sql_concur_lock sql_concur_read_only sql_concur_rowver sql_concur_values sql_concurrency sql_cur_use_driver sql_cur_use_if_needed sql_cur_use_odbc sql_cursor_dynamic sql_cursor_forward_only sql_cursor_keyset_driven sql_cursor_static sql_cursor_type sql_date sql_decimal sql_double sql_ensure sql_fetch_first sql_fetch_next sql_float sql_index_all sql_index_unique sql_integer sql_keyset_size sql_longvarbinary sql_longvarchar sql_no_nulls sql_nullable sql_numeric sql_odbc_cursors sql_quick sql_real sql_regcase sql_rowver sql_scope_currow sql_scope_session sql_scope_transaction sql_smallint sql_time sql_timestamp sql_tinyint sql_type_date sql_type_time sql_type_timestamp sql_varbinary sql_varchar sql_wchar sql_wlongvarchar sql_wvarchar sqlbit sqlchar sqlflt4 sqlflt8 sqlint1 sqlint2 sqlint4 sqlite3_assoc sqlite3_blob sqlite3_both sqlite3_float sqlite3_integer sqlite3_null sqlite3_num sqlite3_open_create sqlite3_open_readonly sqlite3_open_readwrite sqlite3_text sqlite_abort sqlite_array_query sqlite_assoc sqlite_auth sqlite_both sqlite_busy sqlite_busy_timeout sqlite_cantopen sqlite_changes sqlite_close sqlite_column sqlite_constraint sqlite_corrupt sqlite_create_aggregate sqlite_create_function sqlite_current sqlite_done sqlite_empty sqlite_error sqlite_error_string sqlite_escape_string sqlite_exec sqlite_factory sqlite_fetch_all sqlite_fetch_array sqlite_fetch_column_types sqlite_fetch_object sqlite_fetch_single sqlite_fetch_string sqlite_field_name sqlite_format sqlite_full sqlite_has_more sqlite_has_prev sqlite_internal sqlite_interrupt sqlite_ioerr sqlite_key sqlite_last_error sqlite_last_insert_rowid sqlite_libencoding sqlite_libversion sqlite_locked sqlite_mismatch sqlite_misuse sqlite_next sqlite_nolfs sqlite_nomem sqlite_notadb sqlite_notfound sqlite_num sqlite_num_fields sqlite_num_rows sqlite_ok sqlite_open sqlite_perm sqlite_popen sqlite_prev sqlite_protocol sqlite_query sqlite_readonly sqlite_rewind sqlite_row sqlite_schema sqlite_seek sqlite_single_query sqlite_toobig sqlite_udf_decode_binary sqlite_udf_encode_binary sqlite_unbuffered_query sqlite_valid sqlsrv_begin_transaction sqlsrv_cancel sqlsrv_client_info sqlsrv_close sqlsrv_commit sqlsrv_configure sqlsrv_connect sqlsrv_cursor_buffered sqlsrv_cursor_dynamic sqlsrv_cursor_forward sqlsrv_cursor_keyset sqlsrv_cursor_static sqlsrv_enc_binary sqlsrv_enc_char sqlsrv_err_all sqlsrv_err_errors sqlsrv_err_warnings sqlsrv_errors sqlsrv_execute sqlsrv_fetch sqlsrv_fetch_array sqlsrv_fetch_assoc sqlsrv_fetch_both sqlsrv_fetch_numeric sqlsrv_fetch_object sqlsrv_field_metadata sqlsrv_free_stmt sqlsrv_get_config sqlsrv_get_field sqlsrv_has_rows sqlsrv_log_severity_all sqlsrv_log_severity_error sqlsrv_log_severity_notice sqlsrv_log_severity_warning sqlsrv_log_system_all sqlsrv_log_system_conn sqlsrv_log_system_init sqlsrv_log_system_off sqlsrv_log_system_stmt sqlsrv_log_system_util sqlsrv_next_result sqlsrv_nullable_no sqlsrv_nullable_unknown sqlsrv_nullable_yes sqlsrv_num_fields sqlsrv_num_rows sqlsrv_param_in sqlsrv_param_inout sqlsrv_param_out sqlsrv_phptype_datetime sqlsrv_phptype_float sqlsrv_phptype_int sqlsrv_phptype_null sqlsrv_phptype_stream sqlsrv_phptype_string sqlsrv_prepare sqlsrv_query sqlsrv_rollback sqlsrv_rows_affected sqlsrv_scroll_absolute sqlsrv_scroll_first sqlsrv_scroll_last sqlsrv_scroll_next sqlsrv_scroll_prior sqlsrv_scroll_relative sqlsrv_send_stream_data sqlsrv_server_info sqlsrv_sqltype_bigint sqlsrv_sqltype_binary sqlsrv_sqltype_bit sqlsrv_sqltype_char sqlsrv_sqltype_date sqlsrv_sqltype_datetime sqlsrv_sqltype_datetime2 sqlsrv_sqltype_datetimeoffset sqlsrv_sqltype_decimal sqlsrv_sqltype_float sqlsrv_sqltype_image sqlsrv_sqltype_int sqlsrv_sqltype_money sqlsrv_sqltype_nchar sqlsrv_sqltype_ntext sqlsrv_sqltype_numeric sqlsrv_sqltype_nvarchar sqlsrv_sqltype_real sqlsrv_sqltype_smalldatetime sqlsrv_sqltype_smallint sqlsrv_sqltype_smallmoney sqlsrv_sqltype_text sqlsrv_sqltype_time sqlsrv_sqltype_timestamp sqlsrv_sqltype_tinyint sqlsrv_sqltype_udt sqlsrv_sqltype_uniqueidentifier sqlsrv_sqltype_varbinary sqlsrv_sqltype_varchar sqlsrv_sqltype_xml sqlsrv_txn_read_committed sqlsrv_txn_read_serializable sqlsrv_txn_read_uncommitted sqlsrv_txn_repeatable_read sqlsrv_txn_serializable sqlsrv_txn_snapshot sqlt_afc sqlt_avc sqlt_bdouble sqlt_bfilee sqlt_bfloat sqlt_bin sqlt_blob sqlt_bol sqlt_cfilee sqlt_chr sqlt_clob sqlt_flt sqlt_int sqlt_lbi sqlt_lng sqlt_lvc sqlt_nty sqlt_num sqlt_odt sqlt_rdd sqlt_rset sqlt_str sqlt_uin sqlt_vcs sqltext sqlvarchar sqrt srand sscanf ssdeep_fuzzy_compare ssdeep_fuzzy_hash ssdeep_fuzzy_hash_filename ssh2_auth_agent ssh2_auth_hostbased_file ssh2_auth_none ssh2_auth_password ssh2_auth_pubkey_file ssh2_connect ssh2_default_term_height ssh2_default_term_unit ssh2_default_term_width ssh2_default_terminal ssh2_exec ssh2_fetch_stream ssh2_fingerprint ssh2_fingerprint_hex ssh2_fingerprint_md5 ssh2_fingerprint_raw ssh2_fingerprint_sha1 ssh2_methods_negotiated ssh2_publickey_add ssh2_publickey_init ssh2_publickey_list ssh2_publickey_remove ssh2_scp_recv ssh2_scp_send ssh2_sftp ssh2_sftp_chmod ssh2_sftp_lstat ssh2_sftp_mkdir ssh2_sftp_readlink ssh2_sftp_realpath ssh2_sftp_rename ssh2_sftp_rmdir ssh2_sftp_stat ssh2_sftp_symlink ssh2_sftp_unlink ssh2_shell ssh2_stream_stderr ssh2_stream_stdio ssh2_term_unit_chars ssh2_term_unit_pixels ssh2_tunnel st_set st_silent st_uid stat statement_trace static stats_absolute_deviation stats_cdf_beta stats_cdf_binomial stats_cdf_cauchy stats_cdf_chisquare stats_cdf_exponential stats_cdf_f stats_cdf_gamma stats_cdf_laplace stats_cdf_logistic stats_cdf_negative_binomial stats_cdf_noncentral_chisquare stats_cdf_noncentral_f stats_cdf_poisson stats_cdf_t stats_cdf_uniform stats_cdf_weibull stats_covariance stats_den_uniform stats_dens_beta stats_dens_cauchy stats_dens_chisquare stats_dens_exponential stats_dens_f stats_dens_gamma stats_dens_laplace stats_dens_logistic stats_dens_negative_binomial stats_dens_normal stats_dens_pmf_binomial stats_dens_pmf_hypergeometric stats_dens_pmf_poisson stats_dens_t stats_dens_weibull stats_harmonic_mean stats_kurtosis stats_rand_gen_beta stats_rand_gen_chisquare stats_rand_gen_exponential stats_rand_gen_f stats_rand_gen_funiform stats_rand_gen_gamma stats_rand_gen_ibinomial stats_rand_gen_ibinomial_negative stats_rand_gen_int stats_rand_gen_ipoisson stats_rand_gen_iuniform stats_rand_gen_noncenral_chisquare stats_rand_gen_noncentral_f stats_rand_gen_noncentral_t stats_rand_gen_normal stats_rand_gen_t stats_rand_get_seeds stats_rand_phrase_to_seeds stats_rand_ranf stats_rand_setall stats_skew stats_standard_deviation stats_stat_binomial_coef stats_stat_correlation stats_stat_gennch stats_stat_independent_t stats_stat_innerproduct stats_stat_noncentral_t stats_stat_paired_t stats_stat_percentile stats_stat_powersum stats_variance stdclass str_getcsv + str_ireplace str_pad str_pad_both str_pad_left str_pad_right str_repeat str_replace str_rot13 str_shuffle str_split str_word_count strcasecmp strchr strcmp strcoll strcspn stream_bucket_append stream_bucket_make_writeable stream_bucket_new stream_bucket_prepend stream_buffer_full stream_buffer_line stream_buffer_none stream_cast_as_stream stream_cast_for_select stream_client_async_connect stream_client_connect stream_client_persistent stream_context_create stream_context_get_default stream_context_get_options stream_context_get_params stream_context_set_default stream_context_set_option stream_context_set_params stream_copy_to_stream stream_crypto_method_any_client stream_crypto_method_any_server stream_crypto_method_sslv23_client stream_crypto_method_sslv23_server stream_crypto_method_sslv2_client stream_crypto_method_sslv2_server stream_crypto_method_sslv3_client stream_crypto_method_sslv3_server stream_crypto_method_tls_client stream_crypto_method_tls_server stream_crypto_method_tlsv1_0_client stream_crypto_method_tlsv1_0_server stream_crypto_method_tlsv1_1_client stream_crypto_method_tlsv1_1_server stream_crypto_method_tlsv1_2_client stream_crypto_method_tlsv1_2_server stream_encoding stream_enforce_safe_mode stream_filter_all stream_filter_append stream_filter_prepend stream_filter_read stream_filter_register stream_filter_remove stream_filter_write stream_get_contents stream_get_filters stream_get_line stream_get_meta_data stream_get_transports stream_get_wrappers stream_ignore_url stream_ipproto_icmp stream_ipproto_ip stream_ipproto_raw stream_ipproto_tcp stream_ipproto_udp stream_is_local stream_is_url stream_meta_access stream_meta_group stream_meta_group_name stream_meta_owner stream_meta_owner_name stream_meta_touch stream_mkdir_recursive stream_must_seek stream_notification_callback stream_notify_auth_required stream_notify_auth_result stream_notify_completed stream_notify_connect stream_notify_failure stream_notify_file_size_is stream_notify_mime_type_is stream_notify_progress stream_notify_redirected stream_notify_resolve stream_notify_severity_err stream_notify_severity_info stream_notify_severity_warn stream_oob stream_option_blocking stream_option_read_buffer stream_option_read_timeout stream_option_write_buffer stream_peek stream_pf_inet stream_pf_inet6 stream_pf_unix stream_register_wrapper stream_report_errors stream_resolve_include_path stream_select stream_server_bind stream_server_listen stream_set_blocking stream_set_chunk_size stream_set_read_buffer stream_set_timeout stream_set_write_buffer stream_shut_rd stream_shut_rdwr stream_shut_wr stream_sock_dgram stream_sock_raw stream_sock_rdm stream_sock_seqpacket stream_sock_stream stream_socket_accept stream_socket_client stream_socket_enable_crypto stream_socket_get_name stream_socket_pair stream_socket_recvfrom stream_socket_sendto stream_socket_server stream_socket_shutdown stream_supports_lock stream_url_stat_link stream_url_stat_quiet stream_use_path stream_wrapper_register stream_wrapper_restore stream_wrapper_unregister strftime string strip_tags stripcslashes stripos stripslashes stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpbrk strpos strptime strrchr strrev strripos strrpos strspn strstr strtok strtolower strtotime strtoupper strtr strval substr substr_compare substr_count substr_replace suhosin_patch suhosin_patch_version summary_trace sunfuncs_ret_double sunfuncs_ret_string sunfuncs_ret_timestamp svn_add svn_auth_get_parameter svn_auth_param_config svn_auth_param_config_dir svn_auth_param_default_password svn_auth_param_default_username svn_auth_param_dont_store_passwords svn_auth_param_no_auth_cache svn_auth_param_non_interactive svn_auth_param_server_group svn_auth_param_ssl_server_cert_info svn_auth_param_ssl_server_failures svn_auth_set_parameter svn_blame svn_cat svn_checkout svn_cleanup svn_client_version svn_commit svn_delete svn_diff svn_export svn_fs_abort_txn svn_fs_apply_text svn_fs_begin_txn2 svn_fs_change_node_prop svn_fs_check_path svn_fs_config_fs_type svn_fs_contents_changed svn_fs_copy svn_fs_delete svn_fs_dir_entries svn_fs_file_contents svn_fs_file_length svn_fs_is_dir svn_fs_is_file svn_fs_make_dir svn_fs_make_file svn_fs_node_created_rev svn_fs_node_prop svn_fs_props_changed svn_fs_revision_prop svn_fs_revision_root svn_fs_txn_root svn_fs_type_bdb svn_fs_type_fsfs svn_fs_youngest_rev svn_import svn_log svn_ls svn_mkdir svn_node_dir svn_node_file svn_node_none svn_node_unknown svn_prop_revision_author svn_prop_revision_date svn_prop_revision_log svn_prop_revision_orig_date svn_repos_create svn_repos_fs svn_repos_fs_begin_txn_for_commit svn_repos_fs_commit_txn svn_repos_hotcopy svn_repos_open svn_repos_recover svn_revert svn_revision_head svn_status svn_update svn_wc_status_added svn_wc_status_conflicted svn_wc_status_deleted svn_wc_status_external svn_wc_status_ignored svn_wc_status_incomplete svn_wc_status_merged svn_wc_status_missing svn_wc_status_modified svn_wc_status_none svn_wc_status_normal svn_wc_status_obstructed svn_wc_status_replaced svn_wc_status_unversioned swfaction_data swfaction_enterframe swfaction_keydown swfaction_keyup swfaction_mousedown swfaction_mousemove swfaction_mouseup swfaction_onload swfaction_unload swfbutton_down swfbutton_dragout swfbutton_dragover swfbutton_hit swfbutton_mousedown swfbutton_mouseout swfbutton_mouseover swfbutton_mouseup swfbutton_mouseupoutside swfbutton_over swfbutton_up swffill_clipped_bitmap swffill_linear_gradient swffill_radial_gradient swffill_tiled_bitmap swftextfield_align_center swftextfield_align_justify swftextfield_align_left swftextfield_align_right swftextfield_drawbox swftextfield_haslength swftextfield_html swftextfield_multiline swftextfield_noedit swftextfield_noselect swftextfield_password swftextfield_wordwrap switch sybase_affected_rows sybase_close sybase_connect sybase_data_seek sybase_deadlock_retry_count sybase_fetch_array sybase_fetch_assoc sybase_fetch_field sybase_fetch_object sybase_fetch_row sybase_field_seek sybase_free_result sybase_get_last_message sybase_min_client_severity sybase_min_error_severity sybase_min_message_severity sybase_min_server_severity sybase_num_fields sybase_num_rows sybase_pconnect sybase_query sybase_result sybase_select_db sybase_set_message_handler sybase_unbuffered_query symlink sys_get_temp_dir sys_getloadavg syslog system t_abstract t_and_equal t_array t_array_cast t_as t_bad_character t_bool_cast t_boolean_and t_boolean_or t_break t_callable t_case t_catch t_character t_class t_class_c t_clone t_close_tag t_comment t_concat_equal t_const t_constant_encapsed_string t_continue t_curly_open t_dec t_declare t_default t_dir t_div_equal t_dnumber t_do t_doc_comment t_dollar_open_curly_braces t_double_arrow t_double_cast t_double_colon t_echo t_ellipsis t_else t_elseif t_empty t_encapsed_and_whitespace t_end_heredoc t_enddeclare t_endfor t_endforeach t_endif t_endswitch t_endwhile t_eval t_exit t_extends t_file t_final t_finally t_fmt t_fmt_ampm t_for t_foreach t_func_c t_function t_global t_goto t_halt_compiler t_if t_implements t_inc t_include t_include_once t_inline_html t_instanceof t_insteadof t_int_cast t_interface t_is_equal t_is_greater_or_equal t_is_identical t_is_not_equal t_is_not_identical t_is_smaller_or_equal t_isset t_line t_list t_lnumber t_logical_and t_logical_or t_logical_xor t_method_c t_minus_equal t_mod_equal t_mul_equal t_namespace t_new t_ns_c t_ns_separator t_num_string t_object_cast t_object_operator t_open_tag t_open_tag_with_echo t_or_equal t_paamayim_nekudotayim t_plus_equal t_pow t_pow_equal t_print t_private t_protected t_public t_require t_require_once t_return t_sl t_sl_equal t_sr t_sr_equal t_start_heredoc t_static t_string t_string_cast t_string_varname t_switch t_throw t_trait t_trait_c t_try t_unset t_unset_cast t_use t_var t_variable t_while t_whitespace t_xor_equal t_yield taint tan tanh tcp_nodelay tcpwrap_check tempnam textdomain thousands_sep thousep throw tidy_access_count tidy_clean_repair tidy_config_count tidy_diagnose tidy_error_count tidy_get_body tidy_get_config tidy_get_error_buffer tidy_get_head tidy_get_html tidy_get_html_ver tidy_get_output tidy_get_release tidy_get_root tidy_get_status tidy_getopt tidy_is_xhtml tidy_is_xml tidy_load_config tidy_nodetype_asp tidy_nodetype_cdata tidy_nodetype_comment tidy_nodetype_doctype tidy_nodetype_end tidy_nodetype_jste tidy_nodetype_php tidy_nodetype_procins tidy_nodetype_root tidy_nodetype_section tidy_nodetype_start tidy_nodetype_startend tidy_nodetype_text tidy_nodetype_xmldecl tidy_parse_file tidy_parse_string tidy_repair_file tidy_repair_string tidy_reset_config tidy_save_config tidy_set_encoding tidy_setopt tidy_tag_a tidy_tag_abbr tidy_tag_acronym tidy_tag_address tidy_tag_align tidy_tag_applet tidy_tag_area tidy_tag_b tidy_tag_base tidy_tag_basefont tidy_tag_bdo tidy_tag_bgsound tidy_tag_big tidy_tag_blink tidy_tag_blockquote tidy_tag_body tidy_tag_br tidy_tag_button tidy_tag_caption tidy_tag_center tidy_tag_cite tidy_tag_code tidy_tag_col tidy_tag_colgroup tidy_tag_comment tidy_tag_dd tidy_tag_del tidy_tag_dfn tidy_tag_dir tidy_tag_div tidy_tag_dl tidy_tag_dt tidy_tag_em tidy_tag_embed tidy_tag_fieldset tidy_tag_font tidy_tag_form tidy_tag_frame tidy_tag_frameset tidy_tag_h1 tidy_tag_h2 tidy_tag_h3 tidy_tag_h4 tidy_tag_h5 tidy_tag_h6 tidy_tag_head tidy_tag_hr tidy_tag_html tidy_tag_i tidy_tag_iframe tidy_tag_ilayer tidy_tag_img tidy_tag_input tidy_tag_ins tidy_tag_isindex tidy_tag_kbd tidy_tag_keygen tidy_tag_label tidy_tag_layer tidy_tag_legend tidy_tag_li tidy_tag_link tidy_tag_listing tidy_tag_map tidy_tag_marquee tidy_tag_menu tidy_tag_meta tidy_tag_multicol tidy_tag_nobr tidy_tag_noembed tidy_tag_noframes tidy_tag_nolayer tidy_tag_nosave tidy_tag_noscript tidy_tag_object tidy_tag_ol + tidy_tag_optgroup tidy_tag_option tidy_tag_p tidy_tag_param tidy_tag_plaintext tidy_tag_pre tidy_tag_q tidy_tag_rb tidy_tag_rbc tidy_tag_rp tidy_tag_rt tidy_tag_rtc tidy_tag_ruby tidy_tag_s tidy_tag_samp tidy_tag_script tidy_tag_select tidy_tag_server tidy_tag_servlet tidy_tag_small tidy_tag_spacer tidy_tag_span tidy_tag_strike tidy_tag_strong tidy_tag_style tidy_tag_sub tidy_tag_sup tidy_tag_table tidy_tag_tbody tidy_tag_td tidy_tag_textarea tidy_tag_tfoot tidy_tag_th tidy_tag_thead tidy_tag_title tidy_tag_tr tidy_tag_tt tidy_tag_u tidy_tag_ul tidy_tag_unknown tidy_tag_var tidy_tag_wbr tidy_tag_xmp tidy_warning_count time time_nanosleep time_sleep_until timezone_abbreviations_list timezone_identifiers_list timezone_location_get timezone_name_from_abbr timezone_name_get timezone_offset_get timezone_open timezone_transitions_get timezone_version_get timing_trace tmpfile token_get_all token_name touch trader_acos trader_ad trader_add trader_adosc trader_adx trader_adxr trader_apo trader_aroon trader_aroonosc trader_asin trader_atan trader_atr trader_avgprice trader_bbands trader_beta trader_bop trader_cci trader_cdl2crows trader_cdl3blackcrows trader_cdl3inside trader_cdl3linestrike trader_cdl3outside trader_cdl3starsinsouth trader_cdl3whitesoldiers trader_cdlabandonedbaby trader_cdladvanceblock trader_cdlbelthold trader_cdlbreakaway trader_cdlclosingmarubozu trader_cdlconcealbabyswall trader_cdlcounterattack trader_cdldarkcloudcover trader_cdldoji trader_cdldojistar trader_cdldragonflydoji trader_cdlengulfing trader_cdleveningdojistar trader_cdleveningstar trader_cdlgapsidesidewhite trader_cdlgravestonedoji trader_cdlhammer trader_cdlhangingman trader_cdlharami trader_cdlharamicross trader_cdlhighwave trader_cdlhikkake trader_cdlhikkakemod trader_cdlhomingpigeon trader_cdlidentical3crows trader_cdlinneck trader_cdlinvertedhammer trader_cdlkicking trader_cdlkickingbylength trader_cdlladderbottom trader_cdllongleggeddoji trader_cdllongline trader_cdlmarubozu trader_cdlmatchinglow trader_cdlmathold trader_cdlmorningdojistar trader_cdlmorningstar trader_cdlonneck trader_cdlpiercing trader_cdlrickshawman trader_cdlrisefall3methods trader_cdlseparatinglines trader_cdlshootingstar trader_cdlshortline trader_cdlspinningtop trader_cdlstalledpattern trader_cdlsticksandwich trader_cdltakuri trader_cdltasukigap trader_cdlthrusting trader_cdltristar trader_cdlunique3river trader_cdlupsidegap2crows trader_cdlxsidegap3methods trader_ceil trader_cmo trader_compatibility_default trader_compatibility_metastock trader_correl trader_cos trader_cosh trader_dema trader_div trader_dx trader_ema trader_err_alloc_err trader_err_bad_object trader_err_bad_param trader_err_func_not_found trader_err_group_not_found trader_err_input_not_all_initialize trader_err_internal_error trader_err_invalid_handle trader_err_invalid_list_type trader_err_invalid_param_function trader_err_invalid_param_holder trader_err_invalid_param_holder_type trader_err_lib_not_initialize trader_err_not_supported trader_err_out_of_range_end_index trader_err_out_of_range_start_index trader_err_output_not_all_initialize trader_err_success trader_err_unknown_error trader_errno trader_exp trader_floor trader_func_unst_adx trader_func_unst_adxr trader_func_unst_all trader_func_unst_atr trader_func_unst_cmo trader_func_unst_dx trader_func_unst_ema trader_func_unst_ht_dcperiod trader_func_unst_ht_dcphase trader_func_unst_ht_phasor trader_func_unst_ht_sine trader_func_unst_ht_trendline trader_func_unst_ht_trendmode trader_func_unst_kama trader_func_unst_mama trader_func_unst_mfi trader_func_unst_minus_di trader_func_unst_minus_dm trader_func_unst_natr trader_func_unst_none trader_func_unst_plus_di trader_func_unst_plus_dm trader_func_unst_rsi trader_func_unst_stochrsi trader_func_unst_t3 trader_get_compat trader_get_unstable_period trader_ht_dcperiod trader_ht_dcphase trader_ht_phasor trader_ht_sine trader_ht_trendline trader_ht_trendmode trader_kama trader_linearreg trader_linearreg_angle trader_linearreg_intercept trader_linearreg_slope trader_ln trader_log10 trader_ma trader_ma_type_dema trader_ma_type_ema trader_ma_type_kama trader_ma_type_mama trader_ma_type_sma trader_ma_type_t3 trader_ma_type_tema trader_ma_type_trima trader_ma_type_wma trader_macd trader_macdext trader_macdfix trader_mama trader_mavp trader_max trader_maxindex trader_medprice trader_mfi trader_midpoint trader_midprice trader_min trader_minindex trader_minmax trader_minmaxindex trader_minus_di trader_minus_dm trader_mom trader_mult trader_natr trader_obv trader_plus_di trader_plus_dm trader_ppo trader_real_max trader_real_min trader_roc trader_rocp trader_rocr trader_rocr100 trader_rsi trader_sar trader_sarext trader_set_compat trader_set_unstable_period trader_sin trader_sinh trader_sma trader_sqrt trader_stddev trader_stoch trader_stochf trader_stochrsi trader_sub trader_sum trader_t3 trader_tan trader_tanh trader_tema trader_trange trader_trima trader_trix trader_tsf trader_typprice trader_ultosc trader_var trader_wclprice trader_willr trader_wma trait trait_exists tran_commit_class_commit_instance tran_commit_class_uncommit_instance tran_rep_class_commit_instance tran_rep_class_rep_instance tran_rep_class_uncommit_instance tran_serializable transliterator_create transliterator_create_from_rules transliterator_create_inverse transliterator_get_error_code transliterator_get_error_message transliterator_list_ids transliterator_transliterate trap_brkpt trap_trace trigger_error trim true try typeapplication typeaudio typeimage typemessage typemodel typemultipart typeother typetext typevideo u_ambiguous_alias_warning u_bad_variable_definition u_brk_assign_error u_brk_error_limit u_brk_error_start u_brk_hex_digits_expected u_brk_init_error u_brk_internal_error u_brk_malformed_rule_tag u_brk_mismatched_paren u_brk_new_line_in_quoted_string u_brk_rule_empty_set u_brk_rule_syntax u_brk_semicolon_expected u_brk_unclosed_set u_brk_undefined_variable u_brk_unrecognized_option u_brk_variable_redfinition u_buffer_overflow_error u_ce_not_found_error u_collator_version_mismatch u_different_uca_version u_enum_out_of_sync_error u_error_limit u_error_warning_limit u_error_warning_start u_file_access_error u_fmt_parse_error_limit u_fmt_parse_error_start u_idna_ace_prefix_error u_idna_check_bidi_error u_idna_domain_name_too_long_error u_idna_error_limit u_idna_error_start u_idna_label_too_long_error u_idna_prohibited_error u_idna_std3_ascii_rules_error u_idna_unassigned_error u_idna_verification_error u_idna_zero_length_label_error u_illegal_argument_error u_illegal_char_found u_illegal_char_in_segment u_illegal_character u_illegal_escape_sequence u_illegal_pad_position u_index_outofbounds_error u_internal_program_error u_internal_transliterator_error u_invalid_char_found u_invalid_format_error u_invalid_function u_invalid_id u_invalid_property_pattern u_invalid_rbt_syntax u_invalid_state_error u_invalid_table_file u_invalid_table_format u_invariant_conversion_error u_malformed_exponential_pattern u_malformed_pragma u_malformed_rule u_malformed_set u_malformed_symbol_reference u_malformed_unicode_escape u_malformed_variable_definition u_malformed_variable_reference u_memory_allocation_error u_message_parse_error u_mismatched_segment_delimiters u_misplaced_anchor_start u_misplaced_compound_filter u_misplaced_cursor_offset u_misplaced_quantifier u_missing_operator u_missing_resource_error u_missing_segment_close u_multiple_ante_contexts u_multiple_compound_filters u_multiple_cursors u_multiple_decimal_separators u_multiple_decimal_seperators u_multiple_exponential_symbols u_multiple_pad_specifiers u_multiple_percent_symbols u_multiple_permill_symbols u_multiple_post_contexts u_no_space_available u_no_write_permission u_parse_error u_parse_error_limit u_parse_error_start u_pattern_syntax_error u_primary_too_long_error u_regex_bad_escape_sequence u_regex_bad_interval u_regex_error_limit u_regex_error_start u_regex_internal_error u_regex_invalid_back_ref u_regex_invalid_flag u_regex_invalid_state u_regex_look_behind_limit u_regex_max_lt_min u_regex_mismatched_paren u_regex_number_too_big u_regex_property_syntax u_regex_rule_syntax u_regex_set_contains_string u_regex_unimplemented u_resource_type_mismatch u_rule_mask_error u_safeclone_allocated_warning u_sort_key_too_short_warning u_standard_error_limit u_state_old_warning u_state_too_old_error u_string_not_terminated_warning u_stringprep_check_bidi_error u_stringprep_prohibited_error u_stringprep_unassigned_error u_too_many_aliases_error u_trailing_backslash u_truncated_char_found u_unclosed_segment u_undefined_segment_reference u_undefined_variable u_unexpected_token u_unmatched_braces u_unquoted_special u_unsupported_attribute u_unsupported_error u_unsupported_escape_sequence u_unsupported_property u_unterminated_quote u_useless_collator_error u_using_default_warning u_using_fallback_warning u_variable_range_exhausted u_variable_range_overlap u_zero_error uasort ucfirst ucwords udm_add_search_limit udm_alloc_agent udm_alloc_agent_array udm_api_version udm_cat_list udm_cat_path udm_check_charset udm_clear_search_limits udm_crc32 udm_errno udm_error udm_find udm_free_agent udm_free_ispell_data udm_free_res udm_get_doc_count udm_get_res_field udm_get_res_param udm_hash32 udm_load_ispell_data udm_set_agent_param uksort uloc_actual_locale uloc_valid_locale umask uniqid unixtojd unknown_type unlink unpack unregister_tick_function unserialize unset untaint upload_err_cant_write upload_err_extension upload_err_form_size upload_err_ini_size upload_err_no_file upload_err_no_tmp_dir upload_err_ok upload_err_partial urldecode urlencode use use_soap_error_handler user_error usleep usort utf8_decode utf8_encode var var_dump var_export varcmp_eq varcmp_gt varcmp_lt varcmp_null variant_abs + variant_add variant_and variant_cast variant_cat variant_cmp variant_date_from_timestamp variant_date_to_timestamp variant_div variant_eqv variant_fix variant_get_type variant_idiv variant_imp variant_int variant_mod variant_mul variant_neg variant_not variant_or variant_pow variant_round variant_set variant_set_type variant_sub variant_xor version_compare vfprintf virtual vpopmail_add_alias_domain vpopmail_add_alias_domain_ex vpopmail_add_domain vpopmail_add_domain_ex vpopmail_add_user vpopmail_alias_add vpopmail_alias_del vpopmail_alias_del_domain vpopmail_alias_get vpopmail_alias_get_all vpopmail_auth_user vpopmail_del_domain vpopmail_del_domain_ex vpopmail_del_user vpopmail_error vpopmail_passwd vpopmail_set_user_quota vprintf vsprintf vt_array vt_bool vt_bstr vt_byref vt_cy vt_date vt_decimal vt_dispatch vt_empty vt_error vt_i1 vt_i2 vt_i4 vt_int vt_null vt_r4 vt_r8 vt_ui1 vt_ui2 vt_ui4 vt_uint vt_unknown vt_variant wddx_add_vars wddx_deserialize wddx_packet_end wddx_packet_start wddx_serialize_value wddx_serialize_vars while win32_above_normal_priority_class win32_below_normal_priority_class win32_continue_service win32_create_service win32_delete_service win32_error_access_denied win32_error_circular_dependency win32_error_database_does_not_exist win32_error_dependent_services_running win32_error_duplicate_service_name win32_error_failed_service_controller_connect win32_error_insufficient_buffer win32_error_invalid_data win32_error_invalid_handle win32_error_invalid_level win32_error_invalid_name win32_error_invalid_parameter win32_error_invalid_service_account win32_error_invalid_service_control win32_error_path_not_found win32_error_service_already_running win32_error_service_cannot_accept_ctrl win32_error_service_database_locked win32_error_service_dependency_deleted win32_error_service_dependency_fail win32_error_service_disabled win32_error_service_does_not_exist win32_error_service_exists win32_error_service_logon_failed win32_error_service_marked_for_delete win32_error_service_no_thread win32_error_service_not_active win32_error_service_request_timeout win32_error_shutdown_in_progress win32_get_last_control_message win32_high_priority_class win32_idle_priority_class win32_no_error win32_normal_priority_class win32_pause_service win32_ps_list_procs win32_ps_stat_mem win32_ps_stat_proc win32_query_service_status win32_realtime_priority_class win32_service_accept_pause_continue win32_service_accept_preshutdown win32_service_accept_shutdown win32_service_accept_stop win32_service_auto_start win32_service_continue_pending win32_service_control_continue win32_service_control_interrogate win32_service_control_pause win32_service_control_preshutdown win32_service_control_shutdown win32_service_control_stop win32_service_demand_start win32_service_disabled win32_service_error_ignore win32_service_error_normal win32_service_interactive_process win32_service_pause_pending win32_service_paused win32_service_running win32_service_runs_in_system_process win32_service_start_pending win32_service_stop_pending win32_service_stopped win32_service_win32_own_process win32_service_win32_own_process_interactive win32_set_service_status win32_start_service win32_start_service_ctrl_dispatcher win32_stop_service wincache_fcache_fileinfo wincache_fcache_meminfo wincache_lock wincache_ocache_fileinfo wincache_ocache_meminfo wincache_refresh_if_changed wincache_rplist_fileinfo wincache_rplist_meminfo wincache_scache_info wincache_scache_meminfo wincache_ucache_add wincache_ucache_cas wincache_ucache_clear wincache_ucache_dec wincache_ucache_delete wincache_ucache_exists wincache_ucache_get wincache_ucache_inc wincache_ucache_info wincache_ucache_meminfo wincache_ucache_set wincache_unlock wnohang wordwrap wsdl_cache_both wsdl_cache_disk wsdl_cache_memory wsdl_cache_none wuntraced x509_purpose_any x509_purpose_crl_sign x509_purpose_ns_ssl_server x509_purpose_smime_encrypt x509_purpose_smime_sign x509_purpose_ssl_client x509_purpose_ssl_server xattr_create xattr_dontfollow xattr_get xattr_list xattr_remove xattr_replace xattr_root xattr_set xattr_supported xdiff_file_bdiff xdiff_file_bdiff_size xdiff_file_bpatch xdiff_file_diff xdiff_file_diff_binary xdiff_file_merge3 xdiff_file_patch xdiff_file_patch_binary xdiff_file_rabdiff xdiff_patch_normal xdiff_patch_reverse xdiff_string_bdiff xdiff_string_bdiff_size xdiff_string_bpatch xdiff_string_diff xdiff_string_diff_binary xdiff_string_merge3 xdiff_string_patch xdiff_string_patch_binary xdiff_string_rabdiff xhprof_disable xhprof_enable xhprof_sample_disable xhprof_sample_enable xml_attribute_cdata xml_attribute_decl_node xml_attribute_entity xml_attribute_enumeration xml_attribute_id xml_attribute_idref xml_attribute_idrefs xml_attribute_nmtoken xml_attribute_nmtokens xml_attribute_node xml_attribute_notation xml_cdata_section_node xml_comment_node xml_document_frag_node xml_document_node xml_document_type_node xml_dtd_node xml_element_decl_node xml_element_node xml_entity_decl_node xml_entity_node xml_entity_ref_node xml_error_async_entity xml_error_attribute_external_entity_ref xml_error_bad_char_ref xml_error_binary_entity_ref xml_error_duplicate_attribute xml_error_external_entity_handling xml_error_incorrect_encoding xml_error_invalid_token xml_error_junk_after_doc_element xml_error_misplaced_xml_pi xml_error_no_elements xml_error_no_memory xml_error_none xml_error_param_entity_ref xml_error_partial_char xml_error_recursive_entity_ref xml_error_string xml_error_syntax xml_error_tag_mismatch xml_error_unclosed_cdata_section xml_error_unclosed_token xml_error_undefined_entity xml_error_unknown_encoding xml_get_current_byte_index xml_get_current_column_number xml_get_current_line_number xml_get_error_code xml_html_document_node xml_local_namespace xml_namespace_decl_node xml_notation_node xml_option_case_folding xml_option_skip_tagstart xml_option_skip_white xml_option_target_encoding xml_parse xml_parse_into_struct xml_parser_create xml_parser_create_ns xml_parser_free xml_parser_get_option xml_parser_set_option xml_pi_node xml_sax_impl xml_set_character_data_handler xml_set_default_handler xml_set_element_handler xml_set_end_namespace_decl_handler xml_set_external_entity_ref_handler xml_set_notation_decl_handler xml_set_object xml_set_processing_instruction_handler xml_set_start_namespace_decl_handler xml_set_unparsed_entity_decl_handler xml_text_node xmlrpc_decode xmlrpc_decode_request xmlrpc_encode xmlrpc_encode_request xmlrpc_get_type xmlrpc_is_fault xmlrpc_parse_method_descriptions xmlrpc_server_add_introspection_data xmlrpc_server_call_method xmlrpc_server_create xmlrpc_server_destroy xmlrpc_server_register_introspection_callback xmlrpc_server_register_method xmlrpc_set_type xmlwriter_end_attribute xmlwriter_end_cdata xmlwriter_end_comment xmlwriter_end_document xmlwriter_end_dtd xmlwriter_end_dtd_attlist xmlwriter_end_dtd_element xmlwriter_end_dtd_entity xmlwriter_end_element xmlwriter_end_pi xmlwriter_flush xmlwriter_full_end_element xmlwriter_open_memory xmlwriter_open_uri xmlwriter_output_memory xmlwriter_set_indent xmlwriter_set_indent_string xmlwriter_start_attribute xmlwriter_start_attribute_ns xmlwriter_start_cdata xmlwriter_start_comment xmlwriter_start_document xmlwriter_start_dtd xmlwriter_start_dtd_attlist xmlwriter_start_dtd_element xmlwriter_start_dtd_entity xmlwriter_start_element xmlwriter_start_element_ns xmlwriter_start_pi xmlwriter_text xmlwriter_write_attribute xmlwriter_write_attribute_ns xmlwriter_write_cdata xmlwriter_write_comment xmlwriter_write_dtd xmlwriter_write_dtd_attlist xmlwriter_write_dtd_element xmlwriter_write_dtd_entity xmlwriter_write_element xmlwriter_write_element_ns xmlwriter_write_pi xmlwriter_write_raw xor xsd_1999_namespace xsd_1999_timeinstant xsd_anytype xsd_anyuri xsd_anyxml xsd_base64binary xsd_boolean xsd_byte xsd_date xsd_datetime xsd_decimal xsd_double xsd_duration xsd_entities xsd_entity xsd_float xsd_gday xsd_gmonth xsd_gmonthday xsd_gyear xsd_gyearmonth xsd_hexbinary xsd_id xsd_idref xsd_idrefs xsd_int xsd_integer xsd_language xsd_long xsd_name xsd_namespace xsd_ncname xsd_negativeinteger xsd_nmtoken xsd_nmtokens xsd_nonnegativeinteger xsd_nonpositiveinteger xsd_normalizedstring xsd_notation xsd_positiveinteger xsd_qname xsd_short xsd_string xsd_time xsd_token xsd_unsignedbyte xsd_unsignedint xsd_unsignedlong xsd_unsignedshort xsl_clone_always xsl_clone_auto xsl_clone_never xsl_secpref_create_directory xsl_secpref_default xsl_secpref_none xsl_secpref_read_file xsl_secpref_read_network xsl_secpref_write_file xsl_secpref_write_network yaml_any_break yaml_any_encoding yaml_any_scalar_style yaml_bool_tag yaml_cr_break yaml_crln_break yaml_double_quoted_scalar_style yaml_emit yaml_emit_file yaml_float_tag yaml_folded_scalar_style yaml_int_tag yaml_literal_scalar_style yaml_ln_break yaml_map_tag yaml_null_tag yaml_parse yaml_parse_file yaml_parse_url yaml_php_tag yaml_plain_scalar_style yaml_seq_tag yaml_single_quoted_scalar_style yaml_str_tag yaml_timestamp_tag yaml_utf16be_encoding yaml_utf16le_encoding yaml_utf8_encoding yesexpr yesstr yield zend_debug_build zend_logo_guid zend_multibyte zend_thread_id zend_thread_safe zend_version zip_close zip_entry_close zip_entry_compressedsize zip_entry_compressionmethod zip_entry_filesize zip_entry_name zip_entry_open zip_entry_read zip_open zip_read zlib_decode zlib_encode zlib_encoding_deflate zlib_encoding_gzip zlib_encoding_raw zlib_get_coding_type $error = == FontDirectory StandardEncoding UserObjects abs add aload anchorsearch and arc arcn arcto array ashow astore atan awidthshow begin bind bitshift bytesavailable cachestatus ceiling charpath clear cleardictstack cleartomark clip clippath closefile closepath concat concatmatrix copy copypage cos count countdictstack countexecstack counttomark currentcmykcolor currentcolorspace currentdash currentdict currentfile currentflat currentfont currentgray currenthsbcolor currentlinecap currentlinejoin currentlinewidth currentmatrix currentmiterlimit currentpagedevice currentpoint currentrgbcolor currentscreen currenttransfer cvi cvlit cvn cvr cvrs cvs cvx def defaultmatrix definefont dict dictstack div dtransform dup echo end eoclip eofill eq erasepage errordict exch exec execstack executeonly executive exit exp false file fill findfont flattenpath floor flush flushfile for forall ge get getinterval grestore grestoreall gsave gt idetmatrix idiv idtransform if ifelse image imagemask index initclip initgraphics initmatrix inustroke invertmatrix itransform known kshow le length lineto ln load log loop lt makefont mark matrix maxlength mod moveto mul ne neg newpath noaccess nor not null nulldevice or pathbbox pathforall pop print prompt pstack put putinterval quit rand rcheck rcurveto read readhexstring readline readonly readstring rectstroke repeat resetfile restore reversepath rlineto rmoveto roll rotate round rrand run save scale scalefont search setblackgeneration setcachedevice setcachelimit setcharwidth setcolorscreen setcolortransfer setdash setflat setfont setgray sethsbcolor setlinecap setlinejoin setlinewidth setmatrix setmiterlimit setpagedevice setrgbcolor setscreen settransfer setvmthreshold show showpage sin sqrt srand stack start status statusdict stop stopped store string stringwidth stroke strokepath sub systemdict token token transform translate true truncate type ueofill undefineresource userdict usertime version vmstatus wcheck where widthshow write writehexstring writestring xcheck xor From 091082c31ca52e0053b6af8aef73fcc224a2eddc Mon Sep 17 00:00:00 2001 From: Don HO Date: Sat, 22 Aug 2015 19:27:10 +0200 Subject: [PATCH 57/85] [REMOVE] Remove unpopular file extensions --- PowerEditor/src/langs.model.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PowerEditor/src/langs.model.xml b/PowerEditor/src/langs.model.xml index a0688cd31..9e5aefacf 100644 --- a/PowerEditor/src/langs.model.xml +++ b/PowerEditor/src/langs.model.xml @@ -96,7 +96,7 @@ !doctype a abbr accept accept-charset accesskey acronym action address align alink alt applet archive area article aside audio axis b background base basefont bdi bdo bgsound bgcolor big blink blockquote body border br button canvas caption cellpadding cellspacing center char charoff charset checkbox checked cite class classid clear code codebase codetype col colgroup color cols colspan command compact content contenteditable contextmenu coords data datafld dataformatas datalist datapagesize datasrc datetime dd declare defer del details dfn dialog dir disabled div dl draggable dropzone dt element em embed enctype event face fieldset figcaption figure file font footer for form frame frameborder frameset h1 h2 h3 h4 h5 h6 head header height hgroup hidden hr href hreflang hspace html http-equiv i id iframe image img input ins isindex ismap kbd keygen label lang language leftmargin legend li link listing longdesc main map marginheight marginwidth mark marquee maxlength media menu menuitem meta meter multicol method multiple name nav nobr noembed noframes nohref noresize noscript noshade nowrap object ol onabort onautocomplete onautocompleteerror onafterprint onbeforeonload onbeforeprint onblur oncancel oncanplay oncanplaythrough onchange onclick onclose oncontextmenu oncuechange ondblclick ondrag ondragend ondragenter ondragleave ondragover ondragstart ondrop ondurationchange onemptied onended onerror onfocus onhashchange oninput oninvalid onkeydown onkeypress onkeyup onload onloadeddata onloadedmetadata onloadstart onmessage onmousedown onmouseenter onmouseleave onmousemove onmouseout onmouseover onmouseup onmousewheel onoffline ononline onpagehide onpageshow onpause onplay onplaying onpointercancel onpointerdown onpointerenter onpointerleave onpointerlockchange onpointerlockerror onpointermove onpointerout onpointerover onpointerup onpopstate onprogress onratechange onreadystatechange onredo onreset onresize onscroll onseeked onseeking onselect onshow onsort onselect onstalled onstorage onsubmit onsuspend ontimeupdate ontoggle onundo onunload onvolumechange onwaiting optgroup option output p param picture plaintext password placeholder pre profile progress prompt public q radio readonly rel reset rev rows rowspan rp rt rtc ruby rules s samp scheme scope script section select shadow selected shape size small source spacer span spellcheck src standby start strike strong style sub submit summary sup svg svg:svg tabindex table target tbody td template text textarea tfoot th thead time title topmargin tr track tt type u ul usemap valign value valuetype var version video vlink vspace wbr xmp width xml xmlns - + code components custommessages dirs files icons ini installdelete langoptions languages messages registry run setup types tasks uninstalldelete uninstallrun _istool @@ -233,7 +233,7 @@ std ieee work standard textio std_logic_1164 std_logic_arith std_logic_misc std_logic_signed std_logic_textio std_logic_unsigned numeric_bit numeric_std math_complex math_real vital_primitives vital_timing boolean bit character severity_level integer real time delay_length natural positive string bit_vector file_open_kind file_open_status line text side width std_ulogic std_ulogic_vector std_logic std_logic_vector X01 X01Z UX01 UX01Z unsigned signed - + From dc4897c8f293d769b2d9e7d168dd47fb9c9d2d05 Mon Sep 17 00:00:00 2001 From: Don HO Date: Tue, 25 Aug 2015 14:39:11 +0200 Subject: [PATCH 58/85] [BUG_FIXED] Fix the crash by using wide card to open files on cmdline. By using string instead of char * in the constructor std::string::string() make a call: string (const string& str, size_t pos, size_t len = npos); instead of: string (const char* s, size_t n); --- PowerEditor/src/NppIO.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/PowerEditor/src/NppIO.cpp b/PowerEditor/src/NppIO.cpp index 8fa42ca38..0147ad138 100644 --- a/PowerEditor/src/NppIO.cpp +++ b/PowerEditor/src/NppIO.cpp @@ -262,7 +262,11 @@ BufferID Notepad_plus::doOpen(const generic_string& fileName, bool isRecursive, size_t pos = substring - fileName.c_str(); patterns.push_back(substring + 1); - generic_string dir(fileName, pos + 1); + generic_string dir(fileName.c_str(), pos + 1); // use char * to evoke: + // string (const char* s, size_t n); + // and avoid to call (if pass string) : + // string (const string& str, size_t pos, size_t len = npos); + getMatchedFileNames(dir.c_str(), patterns, fileNames, isRecursive, false); } else From 6db831fcd0d85ced5d6141606a3713202859e4df Mon Sep 17 00:00:00 2001 From: Don Ho Date: Tue, 25 Aug 2015 09:31:41 +0200 Subject: [PATCH 59/85] [ADD] Add assert. --- PowerEditor/src/WinControls/DockingWnd/DockingDlgInterface.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingDlgInterface.h b/PowerEditor/src/WinControls/DockingWnd/DockingDlgInterface.h index 74cb8f33b..ff1922067 100644 --- a/PowerEditor/src/WinControls/DockingWnd/DockingDlgInterface.h +++ b/PowerEditor/src/WinControls/DockingWnd/DockingDlgInterface.h @@ -68,7 +68,10 @@ public: ::GetWindowText(_hSelf, temp, MAX_PATH); _pluginName = temp; // user information + assert(data->hClient != nullptr); data->hClient = _hSelf; + + assert(data->pszName != nullptr); data->pszName = (TCHAR *)_pluginName.c_str(); // supported features by plugin From d7ca1eaaf682fcb2c81305e4fa87ee6e0a327521 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Fri, 28 Aug 2015 01:05:36 +0200 Subject: [PATCH 60/85] Fix the problem of display refresh missing in exit (closes #800) Solution: release lock updating before killing main handle. --- .gitignore | 3 +- PowerEditor/src/NppBigSwitch.cpp | 65 +++++++++++++++----------------- 2 files changed, 33 insertions(+), 35 deletions(-) diff --git a/.gitignore b/.gitignore index e67e12489..9123cfe35 100644 --- a/.gitignore +++ b/.gitignore @@ -117,4 +117,5 @@ PowerEditor/bin/NppShell_06.dll PowerEditor/bin/SourceCodePro-Bold.ttf PowerEditor/bin/SourceCodePro-BoldIt.ttf PowerEditor/bin/SourceCodePro-It.ttf -PowerEditor/bin/SourceCodePro-Regular.ttf \ No newline at end of file +PowerEditor/bin/SourceCodePro-Regular.ttf +*.zip \ No newline at end of file diff --git a/PowerEditor/src/NppBigSwitch.cpp b/PowerEditor/src/NppBigSwitch.cpp index 459a7e310..f6c70b874 100644 --- a/PowerEditor/src/NppBigSwitch.cpp +++ b/PowerEditor/src/NppBigSwitch.cpp @@ -104,7 +104,7 @@ LRESULT Notepad_plus_Window::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPA } catch (std::exception ex) { - ::MessageBoxA(_notepad_plus_plus_core._pPublicInterface->getHSelf(), ex.what(), "Exception On WM_CREATE", MB_OK); + ::MessageBoxA(hwnd, ex.what(), "Exception On WM_CREATE", MB_OK); exit(-1); } break; @@ -607,7 +607,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa { if (lstrlen(fileStr) >= int(wParam)) { - ::MessageBox(_pPublicInterface->getHSelf(), TEXT("Allocated buffer size is not enough to copy the string."), TEXT("NPPM error"), MB_OK); + ::MessageBox(hwnd, TEXT("Allocated buffer size is not enough to copy the string."), TEXT("NPPM error"), MB_OK); return FALSE; } } @@ -628,7 +628,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa { if (lstrlen(str) >= int(wParam)) //buffer too small { - ::MessageBox(_pPublicInterface->getHSelf(), TEXT("Allocated buffer size is not enough to copy the string."), TEXT("NPPM_GETCURRENTWORD error"), MB_OK); + ::MessageBox(hwnd, TEXT("Allocated buffer size is not enough to copy the string."), TEXT("NPPM_GETCURRENTWORD error"), MB_OK); return FALSE; } else //buffer large enough, perform safe copy @@ -656,7 +656,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa { if (lstrlen(str) >= int(wParam)) { - ::MessageBox(_pPublicInterface->getHSelf(), TEXT("Allocated buffer size is not enough to copy the string."), TEXT("NPPM_GETNPPDIRECTORY error"), MB_OK); + ::MessageBox(hwnd, TEXT("Allocated buffer size is not enough to copy the string."), TEXT("NPPM_GETNPPDIRECTORY error"), MB_OK); return FALSE; } } @@ -793,7 +793,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa pNppParam->_isTaskListRBUTTONUP_Active = true; short zDelta = (short) HIWORD(wParam); - return ::SendMessage(_pPublicInterface->getHSelf(), WM_COMMAND, zDelta>0?IDC_PREV_DOC:IDC_NEXT_DOC, 0); + return ::SendMessage(hwnd, WM_COMMAND, zDelta>0?IDC_PREV_DOC:IDC_NEXT_DOC, 0); } return TRUE; } @@ -950,7 +950,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa nmhdr.hwndFrom = (whichView == MAIN_VIEW)?_mainDocTab.getHSelf():_subDocTab.getHSelf(); nmhdr.idFrom = ::GetDlgCtrlID(nmhdr.hwndFrom); - ::SendMessage(_pPublicInterface->getHSelf(), WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr); + ::SendMessage(hwnd, WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr); } return TRUE; } @@ -1080,7 +1080,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa case NPPM_CREATESCINTILLAHANDLE: { - return (LRESULT)_scintillaCtrls4Plugins.createSintilla((lParam == NULL?_pPublicInterface->getHSelf():(HWND)lParam)); + return (LRESULT)_scintillaCtrls4Plugins.createSintilla((lParam == NULL?hwnd:(HWND)lParam)); } case NPPM_INTERNAL_GETSCINTEDTVIEW: @@ -1186,7 +1186,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa case NPPM_INTERNAL_CMDLIST_MODIFIED: { //changeMenuShortcut(lParam, (const TCHAR *)wParam); - ::DrawMenuBar(_pPublicInterface->getHSelf()); + ::DrawMenuBar(hwnd); return TRUE; } @@ -1303,7 +1303,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa ::GetCursorPos(&p); ContextMenu scintillaContextmenu; std::vector& tmp = pNppParam->getContextMenuItems(); - scintillaContextmenu.create(_pPublicInterface->getHSelf(), tmp, _mainMenuHandle); + scintillaContextmenu.create(hwnd, tmp, _mainMenuHandle); scintillaContextmenu.display(p); return TRUE; } @@ -1498,7 +1498,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa // Notify plugins of update to styles xml SCNotification scnN; scnN.nmhdr.code = NPPN_WORDSTYLESUPDATED; - scnN.nmhdr.hwndFrom = _pPublicInterface->getHSelf(); + scnN.nmhdr.hwndFrom = hwnd; scnN.nmhdr.idFrom = (uptr_t) _pEditView->getCurrentBufferID(); _pluginsManager.notify(&scnN); return TRUE; @@ -1509,13 +1509,13 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa { if (_pPublicInterface->isPrelaunch()) { - SendMessage(_pPublicInterface->getHSelf(), WM_SYSCOMMAND, SC_MINIMIZE, 0); + SendMessage(hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0); } else { SCNotification scnN; scnN.nmhdr.code = NPPN_BEFORESHUTDOWN; - scnN.nmhdr.hwndFrom = _pPublicInterface->getHSelf(); + scnN.nmhdr.hwndFrom = hwnd; scnN.nmhdr.idFrom = 0; _pluginsManager.notify(&scnN); @@ -1528,7 +1528,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa if (isSnapshotMode) { - ::LockWindowUpdate(_pPublicInterface->getHSelf()); + ::LockWindowUpdate(hwnd); MainFileManager->backupCurrentBuffer(); } @@ -1597,7 +1597,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa if (!isOK) { _nativeLangSpeaker.messageBox("SettingsOnCloudError", - _pPublicInterface->getHSelf(), + hwnd, TEXT("It seems the path of settings on cloud is set on a read only drive,\ror on a folder needed privilege right for writting access.\rYour settings on cloud will be canceled. Please reset a coherent value via Preference dialog."), TEXT("Settings on Cloud"), MB_OK | MB_APPLMODAL); @@ -1605,15 +1605,12 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa } } - if (not isSnapshotMode) - ::LockWindowUpdate(_pPublicInterface->getHSelf()); + if (isSnapshotMode) + ::LockWindowUpdate(NULL); //Sends WM_DESTROY, Notepad++ will end if (Message == WM_CLOSE) ::DestroyWindow(hwnd); - - if (not isSnapshotMode) - ::LockWindowUpdate(NULL); } return TRUE; } @@ -1639,7 +1636,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa if ((nppgui._isMinimizedToTray || _pPublicInterface->isPrelaunch()) && (wParam == SC_MINIMIZE)) { if (nullptr == _pTrayIco) - _pTrayIco = new trayIconControler(_pPublicInterface->getHSelf(), IDI_M30ICON, IDC_MINIMIZED_TRAY, ::LoadIcon(_pPublicInterface->getHinst(), MAKEINTRESOURCE(IDI_M30ICON)), TEXT("")); + _pTrayIco = new trayIconControler(hwnd, IDI_M30ICON, IDC_MINIMIZED_TRAY, ::LoadIcon(_pPublicInterface->getHinst(), MAKEINTRESOURCE(IDI_M30ICON)), TEXT("")); _pTrayIco->doTrayIcon(ADD); ::ShowWindow(hwnd, SW_HIDE); @@ -1660,7 +1657,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa case WM_LBUTTONDBLCLK: { - ::SendMessage(_pPublicInterface->getHSelf(), WM_COMMAND, IDM_FILE_NEW, 0); + ::SendMessage(hwnd, WM_COMMAND, IDM_FILE_NEW, 0); return TRUE; } @@ -1672,10 +1669,10 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa case WM_LBUTTONUP : { _pEditView->getFocus(); - ::ShowWindow(_pPublicInterface->getHSelf(), SW_SHOW); + ::ShowWindow(hwnd, SW_SHOW); if (!_pPublicInterface->isPrelaunch()) _pTrayIco->doTrayIcon(REMOVE); - ::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, 0, 0); + ::SendMessage(hwnd, WM_SIZE, 0, 0); return TRUE; } @@ -1694,9 +1691,9 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa HMENU hTrayIconMenu; // shortcut menu hmenu = ::LoadMenu(_pPublicInterface->getHinst(), MAKEINTRESOURCE(IDR_SYSTRAYPOPUP_MENU)); hTrayIconMenu = ::GetSubMenu(hmenu, 0); - SetForegroundWindow(_pPublicInterface->getHSelf()); - TrackPopupMenu(hTrayIconMenu, TPM_LEFTALIGN, p.x, p.y, 0, _pPublicInterface->getHSelf(), NULL); - PostMessage(_pPublicInterface->getHSelf(), WM_NULL, 0, 0); + SetForegroundWindow(hwnd); + TrackPopupMenu(hTrayIconMenu, TPM_LEFTALIGN, p.x, p.y, 0, hwnd, NULL); + PostMessage(hwnd, WM_NULL, 0, 0); DestroyMenu(hmenu); return TRUE; } @@ -1846,7 +1843,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa if (hide == oldVal) return oldVal; DocTabView::setHideTabBarStatus(hide); - ::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, 0, 0); + ::SendMessage(hwnd, WM_SIZE, 0, 0); NppGUI & nppGUI = (NppGUI &)((NppParameters::getInstance())->getNppGUI()); if (hide) @@ -1879,23 +1876,23 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa case NPPM_HIDEMENU: { bool hide = (lParam == TRUE); - bool isHidden = ::GetMenu(_pPublicInterface->getHSelf()) == NULL; + bool isHidden = ::GetMenu(hwnd) == NULL; if (hide == isHidden) return isHidden; NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); nppGUI._menuBarShow = !hide; if (nppGUI._menuBarShow) - ::SetMenu(_pPublicInterface->getHSelf(), _mainMenuHandle); + ::SetMenu(hwnd, _mainMenuHandle); else - ::SetMenu(_pPublicInterface->getHSelf(), NULL); + ::SetMenu(hwnd, NULL); return isHidden; } case NPPM_ISMENUHIDDEN: { - return (::GetMenu(_pPublicInterface->getHSelf()) == NULL); + return (::GetMenu(hwnd) == NULL); } case NPPM_HIDESTATUSBAR: @@ -1911,7 +1908,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa nppGUI._statusBarShow = show; _statusBar.display(nppGUI._statusBarShow); - ::SendMessage(_pPublicInterface->getHSelf(), WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); + ::SendMessage(hwnd, WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); return oldVal; } @@ -2104,7 +2101,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa { NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); if (!nppgui._menuBarShow && !wParam && !_sysMenuEntering) - ::SetMenu(_pPublicInterface->getHSelf(), _mainMenuHandle); + ::SetMenu(hwnd, _mainMenuHandle); return TRUE; } @@ -2113,7 +2110,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa { NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); if (!nppgui._menuBarShow && !wParam && !_sysMenuEntering) - ::SetMenu(_pPublicInterface->getHSelf(), NULL); + ::SetMenu(hwnd, NULL); _sysMenuEntering = false; return FALSE; } From 4fc06e2bc196da8f1d2ee056e422d80d3744c2c2 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Sat, 29 Aug 2015 21:49:49 +0200 Subject: [PATCH 61/85] Fix plugin shortcut configuration lost problem by using option -noPlugin. (closes #589) Solution: save shortcut.xml only if shortcuts have been modified. --- PowerEditor/bin/change.log | 16 ++--- PowerEditor/src/Parameters.cpp | 4 +- PowerEditor/src/Parameters.h | 5 +- .../src/WinControls/Grid/ShortcutMapper.cpp | 62 ++++++++++++++----- 4 files changed, 57 insertions(+), 30 deletions(-) diff --git a/PowerEditor/bin/change.log b/PowerEditor/bin/change.log index b72a7e0a9..a3ae22093 100644 --- a/PowerEditor/bin/change.log +++ b/PowerEditor/bin/change.log @@ -1,15 +1,9 @@ -Notepad++ v6.8.2 bug-fixes: +Notepad++ v6.8.3 bug-fixes: + +1. Fix the crash by using wild card (*) to open files on command line. +2. Fix the problem of display refresh missing on exit. +3. Fix plugin shortcut configuration lost problem by using option -noPlugin. -1. Remove Source Code Pro font du to the different issues. -2. Add back "Notepad++ Community (Forum)" menu item. -3. Fix a visual glitch on starup and on exit. -4. Fix "Open in/Move to new instance" issue (to memorize the language and the position). -5. Fix Preferences dialog loses focus issue while enabling document list panel. -6. Fix the narrow columns problem in Ascii Insert Panel under a high DPI. -7. Fix the list items' squeezed height problem in function list panel and project panel under a high DPI. -8. Fix panel caption squeezed display under a high DPI. -9. Fixed buffer overrun when opening a recent file. -10. Make toolbar refresh properly while switching over small/big icons. Included plugins: diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp index 92ea9dd4d..b212cfaf6 100644 --- a/PowerEditor/src/Parameters.cpp +++ b/PowerEditor/src/Parameters.cpp @@ -2934,7 +2934,9 @@ void NppParameters::writeSession(const Session & session, const TCHAR *fileName) void NppParameters::writeShortcuts() { - if (!_pXmlShortcutDoc) + if (not _isAnyShortcutModified) return; + + if (not _pXmlShortcutDoc) { //do the treatment _pXmlShortcutDoc = new TiXmlDocument(_shortcutsPath); diff --git a/PowerEditor/src/Parameters.h b/PowerEditor/src/Parameters.h index 852f27f21..6aedb10e5 100644 --- a/PowerEditor/src/Parameters.h +++ b/PowerEditor/src/Parameters.h @@ -1626,7 +1626,10 @@ private: WNDPROC _enableThemeDialogTextureFuncAddr; bool _isLocal; - +public: + void setShortcutDirty() { _isAnyShortcutModified = true; }; +private: + bool _isAnyShortcutModified = false; std::vector _shortcuts; //main menu shortuts. Static size std::vector _customizedShortcuts; //altered main menu shortcuts. Indices static. Needed when saving alterations std::vector _macros; //macro shortcuts, dynamic size, defined on loading macros and adding/deleting them diff --git a/PowerEditor/src/WinControls/Grid/ShortcutMapper.cpp b/PowerEditor/src/WinControls/Grid/ShortcutMapper.cpp index e446fee9f..f32f7c1ac 100644 --- a/PowerEditor/src/WinControls/Grid/ShortcutMapper.cpp +++ b/PowerEditor/src/WinControls/Grid/ShortcutMapper.cpp @@ -230,59 +230,78 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM NppParameters *nppParam = NppParameters::getInstance(); int row = _babygrid.getSelectedRow(); - switch(_currentState) { - case STATE_MENU: { + switch(_currentState) + { + case STATE_MENU: + { //Get CommandShortcut corresponding to row vector & shortcuts = nppParam->getUserShortcuts(); CommandShortcut csc = shortcuts[row - 1], prevcsc = shortcuts[row - 1]; csc.init(_hInst, _hSelf); - if (csc.doDialog() != -1 && prevcsc != csc) { //shortcut was altered + if (csc.doDialog() != -1 && prevcsc != csc) + { + //shortcut was altered nppParam->addUserModifiedIndex(row-1); shortcuts[row - 1] = csc; _babygrid.setText(row, 2, csc.toString().c_str()); //Notify current Accelerator class to update everything nppParam->getAccelerator()->updateShortcuts(); - + nppParam->setShortcutDirty(); } - break; } - case STATE_MACRO: { + break; + } + + case STATE_MACRO: + { //Get MacroShortcut corresponding to row vector & shortcuts = nppParam->getMacroList(); MacroShortcut msc = shortcuts[row - 1], prevmsc = shortcuts[row - 1]; msc.init(_hInst, _hSelf); - if (msc.doDialog() != -1 && prevmsc != msc) { //shortcut was altered + if (msc.doDialog() != -1 && prevmsc != msc) + { + //shortcut was altered shortcuts[row - 1] = msc; _babygrid.setText(row, 1, msc.getName()); _babygrid.setText(row, 2, msc.toString().c_str()); //Notify current Accelerator class to update everything nppParam->getAccelerator()->updateShortcuts(); - + nppParam->setShortcutDirty(); } - break; } - case STATE_USER: { + break; + } + + case STATE_USER: + { //Get UserCommand corresponding to row vector & shortcuts = nppParam->getUserCommandList(); UserCommand ucmd = shortcuts[row - 1], prevucmd = shortcuts[row - 1]; ucmd.init(_hInst, _hSelf); prevucmd = ucmd; - if (ucmd.doDialog() != -1 && prevucmd != ucmd) { //shortcut was altered + if (ucmd.doDialog() != -1 && prevucmd != ucmd) + { + //shortcut was altered shortcuts[row - 1] = ucmd; _babygrid.setText(row, 1, ucmd.getName()); _babygrid.setText(row, 2, ucmd.toString().c_str()); //Notify current Accelerator class to update everything nppParam->getAccelerator()->updateShortcuts(); - + nppParam->setShortcutDirty(); } - break; } - case STATE_PLUGIN: { + break; + } + + case STATE_PLUGIN: + { //Get PluginCmdShortcut corresponding to row vector & shortcuts = nppParam->getPluginCommandList(); PluginCmdShortcut pcsc = shortcuts[row - 1], prevpcsc = shortcuts[row - 1]; pcsc.init(_hInst, _hSelf); prevpcsc = pcsc; - if (pcsc.doDialog() != -1 && prevpcsc != pcsc) { //shortcut was altered + if (pcsc.doDialog() != -1 && prevpcsc != pcsc) + { + //shortcut was altered nppParam->addPluginModifiedIndex(row-1); shortcuts[row - 1] = pcsc; _babygrid.setText(row, 2, pcsc.toString().c_str()); @@ -297,9 +316,13 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM shortcut._key = pcsc.getKeyCombo()._key; ::SendMessage(_hParent, NPPM_INTERNAL_PLUGINSHORTCUTMOTIFIED, cmdID, (LPARAM)&shortcut); + nppParam->setShortcutDirty(); } - break; } - case STATE_SCINTILLA: { + break; + } + + case STATE_SCINTILLA: + { //Get ScintillaKeyMap corresponding to row vector & shortcuts = nppParam->getScintillaKeyList(); ScintillaKeyMap skm = shortcuts[row - 1], prevskm = shortcuts[row-1]; @@ -313,12 +336,14 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM //Notify current Accelerator class to update key nppParam->getScintillaAccelerator()->updateKeys(); + nppParam->setShortcutDirty(); } break; } } return TRUE; } + case IDM_BABYGRID_DELETE : { NppParameters *nppParam = NppParameters::getInstance(); @@ -341,6 +366,7 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM { return FALSE; //this is bad } + case STATE_MACRO: { vector & theMacros = nppParam->getMacroList(); @@ -362,6 +388,7 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM } break; } + case STATE_USER: { vector & theUserCmds = nppParam->getUserCommandList(); @@ -387,6 +414,7 @@ INT_PTR CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM // updateShortcuts() will update all menu item - the menu items will be shifted nppParam->getAccelerator()->updateShortcuts(); + nppParam->setShortcutDirty(); // All menu items are shifted up. So we delete the last item ::RemoveMenu(hMenu, posBase + nbElem, MF_BYPOSITION); From 429dfb0ab8c144e715a38dbf4f23aed75abb09d7 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Sun, 30 Aug 2015 02:54:30 +0200 Subject: [PATCH 62/85] Fix Norwegian localization bad display and wrong encoding. (closes #561) Fix Norwegian localization. Fix Nynorsk localization's minor problem. Update english_customizable.xml. --- PowerEditor/bin/change.log | 1 + .../nativeLang/english_customizable.xml | 235 +++++++++++------- .../installer/nativeLang/norwegian.xml | 7 +- PowerEditor/installer/nativeLang/nynorsk.xml | 2 +- 4 files changed, 148 insertions(+), 97 deletions(-) diff --git a/PowerEditor/bin/change.log b/PowerEditor/bin/change.log index a3ae22093..603e9dd97 100644 --- a/PowerEditor/bin/change.log +++ b/PowerEditor/bin/change.log @@ -3,6 +3,7 @@ Notepad++ v6.8.3 bug-fixes: 1. Fix the crash by using wild card (*) to open files on command line. 2. Fix the problem of display refresh missing on exit. 3. Fix plugin shortcut configuration lost problem by using option -noPlugin. +4. Fix Norwegian localization bad display and wrong encoding. diff --git a/PowerEditor/installer/nativeLang/english_customizable.xml b/PowerEditor/installer/nativeLang/english_customizable.xml index 39c21e6c2..966b86302 100644 --- a/PowerEditor/installer/nativeLang/english_customizable.xml +++ b/PowerEditor/installer/nativeLang/english_customizable.xml @@ -1,6 +1,6 @@ - +
@@ -19,7 +19,7 @@ - + @@ -95,7 +95,7 @@ - + @@ -103,6 +103,14 @@ + + + + + + + + @@ -142,9 +150,7 @@ - - - + @@ -156,10 +162,10 @@ - - + + - + @@ -167,8 +173,6 @@ - - @@ -197,6 +201,7 @@ + @@ -252,17 +257,31 @@ + + + + + + + + + + + + + - + + - + + - @@ -302,9 +321,9 @@ - + - +
@@ -323,20 +342,17 @@ - - - @@ -344,13 +360,26 @@ - + - + + + + + + + + + + + + + + @@ -380,7 +409,7 @@ - + @@ -401,7 +430,7 @@ - + @@ -412,37 +441,39 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -450,13 +481,13 @@ - - + + - - + + @@ -464,7 +495,7 @@ - + @@ -483,7 +514,7 @@ - + @@ -523,51 +554,50 @@ - - - + + + - + - + - + - + - + - + - + - + - @@ -591,12 +621,12 @@ - - + + @@ -622,13 +652,15 @@ + - - + + @@ -638,10 +670,10 @@ - - - - + + + + @@ -697,7 +729,7 @@ - + @@ -713,6 +745,12 @@ + + + + + + @@ -726,6 +764,7 @@ + @@ -754,10 +793,16 @@ + + + + + + + - @@ -775,7 +820,8 @@ - + + @@ -824,28 +870,29 @@ + - + - - - + + + - - - - + + + + - + - - - + + + diff --git a/PowerEditor/installer/nativeLang/norwegian.xml b/PowerEditor/installer/nativeLang/norwegian.xml index d688ef481..facc9ddda 100644 --- a/PowerEditor/installer/nativeLang/norwegian.xml +++ b/PowerEditor/installer/nativeLang/norwegian.xml @@ -1,6 +1,8 @@ - + +
@@ -234,6 +236,7 @@ + @@ -524,7 +527,7 @@ - + diff --git a/PowerEditor/installer/nativeLang/nynorsk.xml b/PowerEditor/installer/nativeLang/nynorsk.xml index 4bd0df24b..210047ef6 100644 --- a/PowerEditor/installer/nativeLang/nynorsk.xml +++ b/PowerEditor/installer/nativeLang/nynorsk.xml @@ -1,6 +1,6 @@ - + From d8acff80d01e9da581482d9de4c1f825eb29e9a2 Mon Sep 17 00:00:00 2001 From: Christian Grasser Date: Sun, 23 Aug 2015 14:29:16 +0200 Subject: [PATCH 63/85] Add final and override for c++ 11 in fuctionList (closes #790) , see: - http://en.cppreference.com/w/cpp/language/final - http://en.cppreference.com/w/cpp/language/override --- PowerEditor/src/functionList.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/PowerEditor/src/functionList.xml b/PowerEditor/src/functionList.xml index 8f5057d9d..30e564e86 100644 --- a/PowerEditor/src/functionList.xml +++ b/PowerEditor/src/functionList.xml @@ -121,7 +121,7 @@ http://notepad-plus-plus.org/features/function-list.html @@ -131,7 +131,7 @@ http://notepad-plus-plus.org/features/function-list.html + mainExpr="^[\t ]*((static|const|virtual)[\s]+)?([\w]+([\s]+[\w]+)?([\s]+|(\*|\*\*|&)[\s]+|[\s]+(\*|\*\*|&)|[\s]+(\*|\*\*|&)[\s]+))?([\w_]+[\s]*::)?(?!(if|while|for|switch))[\w_~]+[\s]*\([^\)\(]*\)([\s]*const[\s]*)?([\s]*(final|override|final[\s]*override|override[\s]*final)[\s]*)?[\n\s]*\{"> From bd6d650e8a22c467c49f9eea436b47b1f47f06a8 Mon Sep 17 00:00:00 2001 From: Rikk Date: Mon, 17 Aug 2015 23:29:21 -0300 Subject: [PATCH 64/85] Fix functionList display problem under high DPI (closes #739, fixes #733) - Fix: when search field is not empty, Function List's background color does not follow Npp theme. - Fix: close button and textual search box now scale in high-dpi. - Fix: icons' image not centered in icons' rectangle. - Fix: when double-clicking the panel's toolbar, it briefly displayed a dialog to customize icons, but we can't use it there. Known issues: - I couldn't made toolbar icon images scale properly in high-dpi; I imagine they need to be in a ImageList, something I don't know how to use. - TreeView icons should also be scaled, and I've done it, but they displayed strange gray background, so I decided to leave it as is now. - It would be better to wrap icons when they don't fit in panel's width, but I don't know how to refresh the toolbar properly. --- .../WinControls/DockingWnd/DockingCont.cpp | 11 ++-- .../src/WinControls/DockingWnd/DockingCont.h | 2 + .../FunctionList/functionListPanel.cpp | 57 +++++++++++-------- .../FunctionList/functionListPanel.h | 2 + 4 files changed, 44 insertions(+), 28 deletions(-) diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp b/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp index aad3e4bdc..6daed4692 100644 --- a/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp +++ b/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp @@ -91,6 +91,9 @@ DockingCont::DockingCont() _captionGapDynamic = NppParameters::getInstance()->_dpiManager.scaleY(_captionGapDynamic); _closeButtonPosLeftDynamic = NppParameters::getInstance()->_dpiManager.scaleX(_closeButtonPosLeftDynamic); _closeButtonPosTopDynamic = NppParameters::getInstance()->_dpiManager.scaleY(_closeButtonPosTopDynamic); + + _closeButtonWidth = NppParameters::getInstance()->_dpiManager.scaleX(12); // bitmap image is 12x12 + _closeButtonHeight = NppParameters::getInstance()->_dpiManager.scaleY(12); } DockingCont::~DockingCont() @@ -569,9 +572,9 @@ void DockingCont::drawCaptionItem(DRAWITEMSTRUCT *pDrawItemStruct) // select correct bitmap if ((_isMouseOver == TRUE) && (_isMouseDown == TRUE)) - hBmpCur = ::LoadBitmap(_hInst, MAKEINTRESOURCE(IDB_CLOSE_DOWN)); + hBmpCur = (HBITMAP)::LoadImage(_hInst, MAKEINTRESOURCE(IDB_CLOSE_DOWN), IMAGE_BITMAP, _closeButtonWidth, _closeButtonHeight, 0); else - hBmpCur = ::LoadBitmap(_hInst, MAKEINTRESOURCE(IDB_CLOSE_UP)); + hBmpCur = (HBITMAP)::LoadImage(_hInst, MAKEINTRESOURCE(IDB_CLOSE_UP), IMAGE_BITMAP, _closeButtonWidth, _closeButtonHeight, 0); // blit bitmap into the destination ::GetObject(hBmpCur, sizeof(bmp), &bmp); @@ -608,7 +611,7 @@ eMousePos DockingCont::isInRect(HWND hwnd, int x, int y) { ret = posCaption; } - else if ((x > rc.right - (12 + _closeButtonPosLeftDynamic)) && (x < (rc.right - _closeButtonPosLeftDynamic)) && + else if ((x > rc.right - (_closeButtonWidth + _closeButtonPosLeftDynamic)) && (x < (rc.right - _closeButtonPosLeftDynamic)) && (y >(rc.top + _closeButtonPosTopDynamic)) && (y < (rc.bottom - _closeButtonPosTopDynamic))) { ret = posClose; @@ -621,7 +624,7 @@ eMousePos DockingCont::isInRect(HWND hwnd, int x, int y) ret = posCaption; } else if ((x > rc.left + _closeButtonPosLeftDynamic) && (x < rc.right - _closeButtonPosLeftDynamic) && - (y >(rc.top + _closeButtonPosTopDynamic)) && (y < (rc.top + (12 + _closeButtonPosLeftDynamic)))) + (y >(rc.top + _closeButtonPosTopDynamic)) && (y < (rc.top + (_closeButtonHeight + _closeButtonPosLeftDynamic)))) { ret = posClose; } diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingCont.h b/PowerEditor/src/WinControls/DockingWnd/DockingCont.h index 7f6008d68..4dc091700 100644 --- a/PowerEditor/src/WinControls/DockingWnd/DockingCont.h +++ b/PowerEditor/src/WinControls/DockingWnd/DockingCont.h @@ -236,6 +236,8 @@ private: int _captionGapDynamic = CAPTION_GAP; int _closeButtonPosLeftDynamic = CLOSEBTN_POS_LEFT; int _closeButtonPosTopDynamic = CLOSEBTN_POS_TOP; + int _closeButtonWidth; + int _closeButtonHeight; // data of added windows std::vector _vTbData; diff --git a/PowerEditor/src/WinControls/FunctionList/functionListPanel.cpp b/PowerEditor/src/WinControls/FunctionList/functionListPanel.cpp index c889bf422..063b24800 100644 --- a/PowerEditor/src/WinControls/FunctionList/functionListPanel.cpp +++ b/PowerEditor/src/WinControls/FunctionList/functionListPanel.cpp @@ -565,11 +565,19 @@ INT_PTR CALLBACK FunctionListPanel::run_dlgProc(UINT message, WPARAM wParam, LPA case WM_INITDIALOG : { - int editWidth = 100; - int editHeight = 20; + int editWidth = NppParameters::getInstance()->_dpiManager.scaleX(100); + int editWidthSep = NppParameters::getInstance()->_dpiManager.scaleX(105); //editWidth + 5 + int editHeight = NppParameters::getInstance()->_dpiManager.scaleY(20); + int iconSizeX = NppParameters::getInstance()->_dpiManager.scaleX(16); + int iconSizeY = NppParameters::getInstance()->_dpiManager.scaleY(16); // Create toolbar menu //int style = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS |TBSTYLE_FLAT | CCS_TOP | BTNS_AUTOSIZE | CCS_NOPARENTALIGN | CCS_NORESIZE | CCS_NODIVIDER; - int style = WS_CHILD | WS_VISIBLE | CCS_ADJUSTABLE | TBSTYLE_AUTOSIZE | TBSTYLE_FLAT | TBSTYLE_LIST | TBSTYLE_TRANSPARENT | BTNS_AUTOSIZE | BTNS_SEP | TBSTYLE_TOOLTIPS; + + // CCS_ADJUSTABLE -- we have no customization, thus it caused double-clicking the toolbar to open and close instantly the dialog to select icons. + // TBSTYLE_LIST -- "TBSTYLE_FLAT repaints its portion of the parent window after activating the tool bar (CHILDACTIVATE message), TBSTYLE_LIST does _NOT_ do this (and is reasonably annoying...)." (comment at https://msdn.microsoft.com/en-us/library/windows/desktop/bb760439.aspx) + // TBSTYLE_WRAPABLE -- requires refreshing toolbar somewhere else, apparently. + + int style = WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_TRANSPARENT | BTNS_AUTOSIZE | TBSTYLE_TOOLTIPS; _hToolbarMenu = CreateWindowEx(0,TOOLBARCLASSNAME,NULL, style, 0,0,0,0,_hSelf,(HMENU)0, _hInst, NULL); @@ -586,14 +594,14 @@ INT_PTR CALLBACK FunctionListPanel::run_dlgProc(UINT message, WPARAM wParam, LPA // Place holder of search text field tbButtons[0].idCommand = 0; - tbButtons[0].iBitmap = editWidth + 10; + tbButtons[0].iBitmap = editWidthSep; tbButtons[0].fsState = TBSTATE_ENABLED; - tbButtons[0].fsStyle = BTNS_SEP; + tbButtons[0].fsStyle = BTNS_SEP; //This is just a separator (blank space) tbButtons[0].iString = 0; tbButtons[1].idCommand = IDC_SORTBUTTON_FUNCLIST; tbButtons[1].iBitmap = 0; - tbButtons[1].fsState = TBSTATE_ENABLED; + tbButtons[1].fsState = TBSTATE_ENABLED; tbButtons[1].fsStyle = BTNS_CHECK | BTNS_AUTOSIZE; tbButtons[1].iString = (INT_PTR)TEXT(""); @@ -604,8 +612,8 @@ INT_PTR CALLBACK FunctionListPanel::run_dlgProc(UINT message, WPARAM wParam, LPA tbButtons[2].iString = (INT_PTR)TEXT(""); ::SendMessage(_hToolbarMenu, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); - ::SendMessage(_hToolbarMenu, TB_SETBUTTONSIZE , (WPARAM)0, (LPARAM)MAKELONG (16, 16)); - ::SendMessage(_hToolbarMenu, TB_ADDBUTTONS, (WPARAM)sizeof(tbButtons) / sizeof(TBBUTTON), (LPARAM)&tbButtons); + ::SendMessage(_hToolbarMenu, TB_ADDBUTTONS, (WPARAM)sizeof(tbButtons) / sizeof(TBBUTTON), (LPARAM)&tbButtons); + ::SendMessage(_hToolbarMenu, TB_SETBUTTONSIZE, 0, MAKELPARAM(iconSizeX, iconSizeY)); //TB_SETBUTTONSIZE should be called after adding buttons. ::SendMessage(_hToolbarMenu, TB_AUTOSIZE, 0, 0); ShowWindow(_hToolbarMenu, SW_SHOW); @@ -615,13 +623,12 @@ INT_PTR CALLBACK FunctionListPanel::run_dlgProc(UINT message, WPARAM wParam, LPA _sortTipStr = pNativeSpeaker->getAttrNameStr(_sortTipStr.c_str(), FL_FUCTIONLISTROOTNODE, FL_SORTLOCALNODENAME); _reloadTipStr = pNativeSpeaker->getAttrNameStr(_reloadTipStr.c_str(), FL_FUCTIONLISTROOTNODE, FL_RELOADLOCALNODENAME); - _hSearchEdit = CreateWindowEx(0L, L"Edit", NULL, + _hSearchEdit = CreateWindowEx(0, L"Edit", NULL, WS_CHILD | WS_BORDER | WS_VISIBLE | ES_AUTOVSCROLL, 2, 2, editWidth, editHeight, _hToolbarMenu, (HMENU) IDC_SEARCHFIELD_FUNCLIST, _hInst, 0 ); HFONT hf = (HFONT)::GetStockObject(DEFAULT_GUI_FONT); - if (hf) ::SendMessage(_hSearchEdit, WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE, 0)); @@ -676,28 +683,30 @@ INT_PTR CALLBACK FunctionListPanel::run_dlgProc(UINT message, WPARAM wParam, LPA } return TRUE; - case WM_SIZE: - { - int width = LOWORD(lParam); - int height = HIWORD(lParam); - RECT toolbarMenuRect; - ::GetClientRect(_hToolbarMenu, &toolbarMenuRect); + case WM_SIZE: + { + int width = LOWORD(lParam); + int height = HIWORD(lParam); + int extraValue = NppParameters::getInstance()->_dpiManager.scaleX(4); - ::MoveWindow(_hToolbarMenu, 0, 0, width, toolbarMenuRect.bottom, TRUE); + RECT toolbarMenuRect; + ::GetClientRect(_hToolbarMenu, &toolbarMenuRect); + + ::MoveWindow(_hToolbarMenu, 0, 0, width, toolbarMenuRect.bottom, TRUE); HWND hwnd = _treeView.getHSelf(); if (hwnd) - ::MoveWindow(hwnd, 0, toolbarMenuRect.bottom + 2, width, height - toolbarMenuRect.bottom - 2, TRUE); + ::MoveWindow(hwnd, 0, toolbarMenuRect.bottom + extraValue, width, height - toolbarMenuRect.bottom - extraValue, TRUE); HWND hwnd_aux = _treeViewSearchResult.getHSelf(); if (hwnd_aux) - ::MoveWindow(hwnd_aux, 0, toolbarMenuRect.bottom + 2, width, height - toolbarMenuRect.bottom - 2, TRUE); + ::MoveWindow(hwnd_aux, 0, toolbarMenuRect.bottom + extraValue, width, height - toolbarMenuRect.bottom - extraValue, TRUE); - break; - } + break; + } - default : - return DockingDlgInterface::run_dlgProc(message, wParam, lParam); - } + default : + return DockingDlgInterface::run_dlgProc(message, wParam, lParam); + } return DockingDlgInterface::run_dlgProc(message, wParam, lParam); } diff --git a/PowerEditor/src/WinControls/FunctionList/functionListPanel.h b/PowerEditor/src/WinControls/FunctionList/functionListPanel.h index 0d696d338..7d9d70efa 100644 --- a/PowerEditor/src/WinControls/FunctionList/functionListPanel.h +++ b/PowerEditor/src/WinControls/FunctionList/functionListPanel.h @@ -104,9 +104,11 @@ public: virtual void setBackgroundColor(COLORREF bgColour) { TreeView_SetBkColor(_treeView.getHSelf(), bgColour); + TreeView_SetBkColor(_treeViewSearchResult.getHSelf(), bgColour); }; virtual void setForegroundColor(COLORREF fgColour) { TreeView_SetTextColor(_treeView.getHSelf(), fgColour); + TreeView_SetTextColor(_treeViewSearchResult.getHSelf(), fgColour); }; void setParent(HWND parent2set){ From 8e9fe97500a483df8b61aa476f40562b5357764d Mon Sep 17 00:00:00 2001 From: squarefractal Date: Wed, 2 Sep 2015 08:39:15 +0530 Subject: [PATCH 65/85] Update shell/bash keywords (closes #839) Add a few more commonly available commands, and remove a few deprecated/rarely used commands. --- PowerEditor/src/langs.model.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PowerEditor/src/langs.model.xml b/PowerEditor/src/langs.model.xml index 9e5aefacf..0997243b8 100644 --- a/PowerEditor/src/langs.model.xml +++ b/PowerEditor/src/langs.model.xml @@ -31,7 +31,7 @@ - 7z adduser alias apt-get ar asa autoconf automake awk banner base64 basename bash bc bdiff blkid break bsdcpio bsdtar bunzip2 bzcmp bzdiff bzegrep bzfgrep bzgrep bzip2 bzip2recover bzless bzmore c++ cal calendar case cat cc cd cfdisk chattr chgrp chmod chown chroot chvt cksum clang clang++ clear cmp col column comm compgen compress continue convert cp cpio crontab crypt csplit ctags curl cut date dc dd deallocvt declare deluser depmod deroff df dialog diff diff3 dig dircmp dirname disown do done dpkg du echo ed egrep elif else env esac eval ex exec exit expand export expr false fc fdisk ffmpeg fgrep fi file find flex flock fmt fold for fsck function functions fuser fusermount g++ gawk gcc gdb getconf getopt getopts git gpg gpgsplit gpgv grep gres groff groups gunzip gzexe hash hd head help hexdump hg history httpd iconv id if ifconfig ifdown ifquery ifup in insmod integer inxi ip jobs join kill killall killall5 lc ld ldd let lex line ln local logname look ls lsattr lsb_release lscpu lshw lsusb lzcmp lzegrep lzfgrep lzgrep lzless lzma lzmainfo lzmore m4 mail mailx make man mkdir mkfifo mkswap mktemp modinfo modprobe mogrify more mount msgfmt mt mv nameif nasm nc ndisasm netcat newgrp nl nm nohup ntps objdump od openssl pack pacman passwd paste patch pathchk pax pcat pcregrep pcretest perl pg ping ping6 pivot_root poweroff pr print printf ps pwd python python2 python3 ranlib read readlink readonly reboot red reset return rev rm rmdir rmmod rpm rsync sed select service set sh sha1sum sha224sum sha256sum sha3sum sha512sum shift shred shuf shutdown size sleep sort spell split start stop strings strip stty su sudo sum suspend switch_root sync systemctl tac tail tar tee test then time times touch tr trap troff true tsort tty type typeset ulimit umask umount unalias uname uncompress unexpand uniq unlink unlzma unpack unset until unzip unzipsfx useradd userdel uudecode uuencode vi vim vpax wait wc wget whence which while who wpaste wstart xargs xdotool xxd xz xzcat xzcmp xzdiff xzfgrep xzgrep xzless xzmore yes yum zcat zcmp zdiff zegrep zfgrep zforce zgrep zless zmore znew zsh + 7z adduser alias apt-get ar as asa autoconf automake awk banner base64 basename bash bc bdiff blkid break bsdcpio bsdtar bunzip2 bzcmp bzdiff bzegrep bzfgrep bzgrep bzip2 bzip2recover bzless bzmore c++ cal calendar case cat cc cd cfdisk chattr chgrp chmod chown chroot chvt cksum clang clang++ clear cmp col column comm compgen compress continue convert cp cpio crontab crypt csplit ctags curl cut date dc dd deallocvt declare deluser depmod deroff df dialog diff diff3 dig dircmp dirname disown dmesg do done dpkg dpkg-deb du echo ed egrep elif else env esac eval ex exec exit expand export expr fakeroot false fc fdisk ffmpeg fgrep fi file find flex flock fmt fold for fsck function functions fuser fusermount g++ gas gawk gcc gdb genisoimage getconf getopt getopts git gpg gpgsplit gpgv grep gres groff groups gunzip gzexe hash hd head help hexdump hg history httpd iconv id if ifconfig ifdown ifquery ifup in insmod integer inxi ip jobs join kill killall killall5 lc ld ldd let lex line ln local logname look ls lsattr lsb_release lsblk lscpu lshw lslocks lsmod lsusb lzcmp lzegrep lzfgrep lzgrep lzless lzma lzmainfo lzmore m4 mail mailx make man mkdir mkfifo mkswap mktemp modinfo modprobe mogrify more mount msgfmt mt mv nameif nasm nc ndisasm netcat newgrp nl nm nohup ntps objdump od openssl p7zip pacman passwd paste patch pathchk pax pcat pcregrep pcretest perl pg ping ping6 pivot_root poweroff pr print printf ps pwd python python2 python3 ranlib read readlink readonly reboot reset return rev rm rmdir rmmod rpm rsync sed select service set sh sha1sum sha224sum sha256sum sha3sum sha512sum shift shred shuf shutdown size sleep sort spell split start stop strings strip stty su sudo sum suspend switch_root sync systemctl tac tail tar tee test then time times touch tr trap troff true tsort tty type typeset ulimit umask umount unalias uname uncompress unexpand uniq unlink unlzma unset until unzip unzipsfx useradd userdel uudecode uuencode vi vim wait wc wget whence which while who wpaste wstart xargs xdotool xxd xz xzcat xzcmp xzdiff xzfgrep xzgrep xzless xzmore yes yum zcat zcmp zdiff zegrep zfgrep zforce zgrep zless zmore znew zsh rem set if else exist errorlevel for in do break call copy chcp cd chdir choice cls country ctty date del erase dir echo exit goto loadfix loadhigh mkdir md move path pause prompt rename ren rmdir rd shift time type ver verify vol com con lpt nul defined not errorlevel cmdextversion From ffaa74c15a9fecf14eb8b1e5a9d6ac6f9036a235 Mon Sep 17 00:00:00 2001 From: squarefractal Date: Wed, 2 Sep 2015 13:37:59 +0530 Subject: [PATCH 66/85] Update Obsidian theme for diff/patch syntax highlighting (closes #841) Make the Obsidian theme color additions, deletions and position indicators in diff files. --- PowerEditor/installer/themes/Obsidian.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/PowerEditor/installer/themes/Obsidian.xml b/PowerEditor/installer/themes/Obsidian.xml index 77055c408..a3c5fb4cf 100644 --- a/PowerEditor/installer/themes/Obsidian.xml +++ b/PowerEditor/installer/themes/Obsidian.xml @@ -223,9 +223,9 @@ Notepad++ Custom Style - - - + + + From 7621ca2a914fd9dd1182934fae52862bee7336c2 Mon Sep 17 00:00:00 2001 From: Artem Polivanchuk Date: Fri, 28 Aug 2015 09:26:33 +0300 Subject: [PATCH 67/85] Update translation ukrainian.xml (closes #818) --- .../installer/nativeLang/ukrainian.xml | 202 +++++++++--------- 1 file changed, 101 insertions(+), 101 deletions(-) diff --git a/PowerEditor/installer/nativeLang/ukrainian.xml b/PowerEditor/installer/nativeLang/ukrainian.xml index 403076c41..0b3a3f660 100644 --- a/PowerEditor/installer/nativeLang/ukrainian.xml +++ b/PowerEditor/installer/nativeLang/ukrainian.xml @@ -5,13 +5,13 @@
- - - - - - - + + + + + + + @@ -22,7 +22,7 @@ - + @@ -65,36 +65,36 @@ - - + + - + - - - + + + - + - + - - - - - - - + + + + + + + @@ -105,20 +105,20 @@ - - - + + + - - - - - - - - + + + + + + + + @@ -132,11 +132,11 @@ - - - - - + + + + + @@ -145,8 +145,8 @@ - - + + @@ -163,7 +163,7 @@ - + @@ -200,25 +200,25 @@ - - - - + + + + - - - - - - - - - + + + + + + + + + @@ -281,15 +281,15 @@ - + - - + + @@ -326,20 +326,20 @@ - - - - - - + + + + + + - - - + + + @@ -358,7 +358,7 @@ - + @@ -366,10 +366,10 @@ - - + + - + @@ -379,7 +379,7 @@ - + @@ -392,7 +392,7 @@ - + @@ -466,27 +466,27 @@ - + - + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -505,16 +505,16 @@ - - - - - - - - + + + + + + + + - + @@ -854,7 +854,7 @@ - + From db658ff503bcfeb0b4ec520bcb6781f754e338c9 Mon Sep 17 00:00:00 2001 From: Artur Date: Tue, 25 Aug 2015 01:56:39 +0400 Subject: [PATCH 68/85] Update RUSSIAN translation for v.6.8.2 Reworked fast access Small fixes --- PowerEditor/installer/nativeLang/russian.xml | 132 +++++++++---------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/PowerEditor/installer/nativeLang/russian.xml b/PowerEditor/installer/nativeLang/russian.xml index ba1928b76..40140ff58 100644 --- a/PowerEditor/installer/nativeLang/russian.xml +++ b/PowerEditor/installer/nativeLang/russian.xml @@ -5,39 +5,39 @@
- - - - - - - - - - - + + + + + + + + + + + - + - + - - - + + + - + - + - + @@ -65,25 +65,25 @@ - + - + - + - + - - - + + + - + - + @@ -93,7 +93,7 @@ - + @@ -113,12 +113,12 @@ - - - - + + + + - + @@ -130,18 +130,18 @@ - + - - + + - + @@ -159,7 +159,7 @@ - + @@ -203,7 +203,7 @@ - + @@ -216,13 +216,13 @@ - + - + @@ -281,7 +281,7 @@ - + @@ -306,18 +306,18 @@ - - - + + + - - + + - - + + @@ -325,33 +325,33 @@ - + - + - + - + - - + + - + - - - + + + - + @@ -366,10 +366,10 @@ - + - + @@ -511,7 +511,7 @@ - + @@ -600,7 +600,7 @@ - + @@ -841,7 +841,7 @@ - + From e0cfa3abc59a9debfa4c0ec4e39deddb643bfcd2 Mon Sep 17 00:00:00 2001 From: h-h-h-h Date: Sat, 22 Aug 2015 04:51:33 +0200 Subject: [PATCH 69/85] Update german.xml (closes #779) Changed "Mark occurences" to "Mark" as in English language file. This is obsolete. You could also say: "Replace occurences". Also, used the same word as in menu rather than a different one. --- PowerEditor/installer/nativeLang/german.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PowerEditor/installer/nativeLang/german.xml b/PowerEditor/installer/nativeLang/german.xml index 69ecf0111..0e53ae6a7 100644 --- a/PowerEditor/installer/nativeLang/german.xml +++ b/PowerEditor/installer/nativeLang/german.xml @@ -332,7 +332,7 @@ - + From 35b9f5e376763dbfd27d1b5a94ed1e83c01b3522 Mon Sep 17 00:00:00 2001 From: Lin Xiao Date: Fri, 21 Aug 2015 19:09:41 +0800 Subject: [PATCH 70/85] Update Chinese (Simplified) translation (closes #770) --- .../nativeLang/chineseSimplified.xml | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/PowerEditor/installer/nativeLang/chineseSimplified.xml b/PowerEditor/installer/nativeLang/chineseSimplified.xml index de425cdd6..99347affe 100644 --- a/PowerEditor/installer/nativeLang/chineseSimplified.xml +++ b/PowerEditor/installer/nativeLang/chineseSimplified.xml @@ -1,6 +1,6 @@ - +
@@ -144,8 +144,14 @@ - - + + + + + + + + @@ -170,6 +176,7 @@ + @@ -260,12 +267,13 @@ - + - + + @@ -353,6 +361,19 @@ + + + + + + + + + + + + + @@ -454,6 +475,8 @@ + + @@ -642,6 +665,7 @@ + From 286a65851e91961fc04e823b7adad62b1b1c7298 Mon Sep 17 00:00:00 2001 From: Tmp341 Date: Fri, 21 Aug 2015 09:29:28 +0300 Subject: [PATCH 71/85] Update turkish.xml (closes #767) Catch up with the english.xml for v6.8.2 update --- PowerEditor/installer/nativeLang/turkish.xml | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/PowerEditor/installer/nativeLang/turkish.xml b/PowerEditor/installer/nativeLang/turkish.xml index a42cbd651..adc6de1d4 100644 --- a/PowerEditor/installer/nativeLang/turkish.xml +++ b/PowerEditor/installer/nativeLang/turkish.xml @@ -1,6 +1,6 @@ - - + +
@@ -201,6 +201,7 @@ + @@ -277,6 +278,7 @@ + @@ -470,6 +472,8 @@ + + @@ -655,7 +659,7 @@ - + @@ -666,10 +670,10 @@ - - - - + + + + From 5c48338f4e6d393ab89c557262ac8ca99288a0b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gy=C3=B6rgy=20Bata?= Date: Thu, 20 Aug 2015 17:10:53 +0200 Subject: [PATCH 72/85] Update Hungarian translation for Notepad++ 6.8.2 (closes #758) Hungarian translation update for Notepad++ 6.8.2 --- .../installer/nativeLang/hungarian.xml | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/PowerEditor/installer/nativeLang/hungarian.xml b/PowerEditor/installer/nativeLang/hungarian.xml index cf3eab78d..ff6fef105 100644 --- a/PowerEditor/installer/nativeLang/hungarian.xml +++ b/PowerEditor/installer/nativeLang/hungarian.xml @@ -3,9 +3,9 @@ - + - +
@@ -290,6 +290,7 @@ + @@ -371,7 +372,7 @@ - + @@ -483,8 +484,8 @@ - - + + @@ -639,7 +640,6 @@ - @@ -670,7 +670,7 @@ - + @@ -681,10 +681,10 @@ - - - - + + + + From ea548169ccc601c7741be8ed25796f150a296cf5 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Thu, 3 Sep 2015 20:50:51 +0200 Subject: [PATCH 73/85] Fix a display regression in functionList Panel. Fix a regression inserted by: https://github.com/notepad-plus-plus/notepad-plus-plus/commit/bd6d650e8a22c467c49f9eea436b47b1f47f06a8 --- .../WinControls/FunctionList/functionListPanel.cpp | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/PowerEditor/src/WinControls/FunctionList/functionListPanel.cpp b/PowerEditor/src/WinControls/FunctionList/functionListPanel.cpp index 063b24800..375df9530 100644 --- a/PowerEditor/src/WinControls/FunctionList/functionListPanel.cpp +++ b/PowerEditor/src/WinControls/FunctionList/functionListPanel.cpp @@ -568,16 +568,9 @@ INT_PTR CALLBACK FunctionListPanel::run_dlgProc(UINT message, WPARAM wParam, LPA int editWidth = NppParameters::getInstance()->_dpiManager.scaleX(100); int editWidthSep = NppParameters::getInstance()->_dpiManager.scaleX(105); //editWidth + 5 int editHeight = NppParameters::getInstance()->_dpiManager.scaleY(20); - int iconSizeX = NppParameters::getInstance()->_dpiManager.scaleX(16); - int iconSizeY = NppParameters::getInstance()->_dpiManager.scaleY(16); + // Create toolbar menu - //int style = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS |TBSTYLE_FLAT | CCS_TOP | BTNS_AUTOSIZE | CCS_NOPARENTALIGN | CCS_NORESIZE | CCS_NODIVIDER; - - // CCS_ADJUSTABLE -- we have no customization, thus it caused double-clicking the toolbar to open and close instantly the dialog to select icons. - // TBSTYLE_LIST -- "TBSTYLE_FLAT repaints its portion of the parent window after activating the tool bar (CHILDACTIVATE message), TBSTYLE_LIST does _NOT_ do this (and is reasonably annoying...)." (comment at https://msdn.microsoft.com/en-us/library/windows/desktop/bb760439.aspx) - // TBSTYLE_WRAPABLE -- requires refreshing toolbar somewhere else, apparently. - - int style = WS_CHILD | WS_VISIBLE | TBSTYLE_FLAT | TBSTYLE_TRANSPARENT | BTNS_AUTOSIZE | TBSTYLE_TOOLTIPS; + int style = WS_CHILD | WS_VISIBLE | CCS_ADJUSTABLE | TBSTYLE_AUTOSIZE | TBSTYLE_FLAT | TBSTYLE_LIST | TBSTYLE_TRANSPARENT | BTNS_AUTOSIZE | BTNS_SEP | TBSTYLE_TOOLTIPS; _hToolbarMenu = CreateWindowEx(0,TOOLBARCLASSNAME,NULL, style, 0,0,0,0,_hSelf,(HMENU)0, _hInst, NULL); @@ -612,8 +605,8 @@ INT_PTR CALLBACK FunctionListPanel::run_dlgProc(UINT message, WPARAM wParam, LPA tbButtons[2].iString = (INT_PTR)TEXT(""); ::SendMessage(_hToolbarMenu, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); + ::SendMessage(_hToolbarMenu, TB_SETBUTTONSIZE, (WPARAM)0, (LPARAM)MAKELONG(16, 16)); ::SendMessage(_hToolbarMenu, TB_ADDBUTTONS, (WPARAM)sizeof(tbButtons) / sizeof(TBBUTTON), (LPARAM)&tbButtons); - ::SendMessage(_hToolbarMenu, TB_SETBUTTONSIZE, 0, MAKELPARAM(iconSizeX, iconSizeY)); //TB_SETBUTTONSIZE should be called after adding buttons. ::SendMessage(_hToolbarMenu, TB_AUTOSIZE, 0, 0); ShowWindow(_hToolbarMenu, SW_SHOW); From 40c902425fbb0f9c016e36a9b2de04d14ccba77f Mon Sep 17 00:00:00 2001 From: Don Ho Date: Thu, 3 Sep 2015 23:50:01 +0200 Subject: [PATCH 74/85] Update localization files --- .../installer/nativeLang/bulgarian.xml | 12 +- PowerEditor/installer/nativeLang/korean.xml | 61 +++--- .../installer/nativeLang/slovenian.xml | 186 ++++++++++-------- PowerEditor/installer/nativeLang/spanish.xml | 11 +- 4 files changed, 151 insertions(+), 119 deletions(-) diff --git a/PowerEditor/installer/nativeLang/bulgarian.xml b/PowerEditor/installer/nativeLang/bulgarian.xml index c566184a5..988d87eca 100644 --- a/PowerEditor/installer/nativeLang/bulgarian.xml +++ b/PowerEditor/installer/nativeLang/bulgarian.xml @@ -3,7 +3,7 @@ ## Bulgarian localization for Notepad++ ## Translators:.....: 2007-2012 - Milen Metev (Tragedy); 2014-yyyy - RDD - Last modified:...: 24.07.2015 by RDD + Last modified:...: 27.08.2015 by RDD Download:........: https://drive.google.com/file/d/0B2sYyYGUvu5dMEJYR2xMcWw2Nms --> @@ -352,7 +352,7 @@ - + @@ -730,11 +730,11 @@ - + - - - + + + diff --git a/PowerEditor/installer/nativeLang/korean.xml b/PowerEditor/installer/nativeLang/korean.xml index 8c2a6da5c..89999d580 100644 --- a/PowerEditor/installer/nativeLang/korean.xml +++ b/PowerEditor/installer/nativeLang/korean.xml @@ -1,7 +1,7 @@ - - + +
@@ -16,24 +16,24 @@ - + - + - + - - + + @@ -78,7 +78,7 @@ - + @@ -154,7 +154,7 @@ - + @@ -200,6 +200,7 @@ + @@ -208,7 +209,7 @@ - + @@ -244,7 +245,7 @@ - + @@ -272,6 +273,7 @@ + @@ -319,20 +321,20 @@
- + - + - - + + @@ -350,18 +352,18 @@ - + - + - + - + @@ -421,7 +423,7 @@ - + @@ -456,6 +458,8 @@ + + @@ -634,6 +638,7 @@ + @@ -643,10 +648,10 @@ - - - - + + + + @@ -657,8 +662,8 @@ - - + + @@ -679,7 +684,7 @@ - + @@ -780,7 +785,7 @@ - + diff --git a/PowerEditor/installer/nativeLang/slovenian.xml b/PowerEditor/installer/nativeLang/slovenian.xml index 8ae81c0b1..cdd177f86 100644 --- a/PowerEditor/installer/nativeLang/slovenian.xml +++ b/PowerEditor/installer/nativeLang/slovenian.xml @@ -1,11 +1,11 @@ - + - +
@@ -21,7 +21,7 @@ - + @@ -40,11 +40,11 @@ - + - + @@ -67,7 +67,7 @@ - + @@ -78,7 +78,7 @@ - + @@ -91,7 +91,8 @@ - + + @@ -105,8 +106,16 @@ - - + + + + + + + + + + @@ -131,7 +140,7 @@ - + @@ -145,10 +154,8 @@ - - - - + + @@ -156,7 +163,7 @@ - + @@ -164,15 +171,13 @@ - + - - @@ -200,9 +205,9 @@ - + - + @@ -212,7 +217,7 @@ - + @@ -226,7 +231,7 @@ - + @@ -255,7 +260,20 @@ - + + + + + + + + + + + + + + @@ -264,10 +282,9 @@ - + - @@ -275,7 +292,7 @@ - + @@ -284,7 +301,7 @@ - +
@@ -313,7 +330,7 @@
- + @@ -328,20 +345,17 @@ - - - @@ -356,6 +370,19 @@ + + + + + + + + + + + + + @@ -365,7 +392,7 @@ - + @@ -376,7 +403,7 @@ - + @@ -402,9 +429,9 @@ - + - + @@ -469,7 +496,7 @@ - +
@@ -495,9 +522,9 @@ - + - + @@ -572,7 +599,6 @@ - @@ -582,24 +608,23 @@ - + - + - - + - + @@ -618,12 +643,12 @@ - + - + @@ -635,10 +660,10 @@ - + - - + + @@ -650,35 +675,35 @@ - + - + - - + + - + - + - + - + @@ -708,7 +733,7 @@ - + @@ -719,14 +744,14 @@ - + - + @@ -734,7 +759,7 @@ - + @@ -753,7 +778,7 @@ - + @@ -761,24 +786,22 @@ - + - - - + + + - - - + - - - + + + @@ -794,7 +817,7 @@ - + @@ -802,7 +825,7 @@ - + @@ -845,10 +868,11 @@ - + - + + @@ -916,6 +940,6 @@ - +
diff --git a/PowerEditor/installer/nativeLang/spanish.xml b/PowerEditor/installer/nativeLang/spanish.xml index d1e258277..36fdcdddd 100644 --- a/PowerEditor/installer/nativeLang/spanish.xml +++ b/PowerEditor/installer/nativeLang/spanish.xml @@ -1,6 +1,6 @@ - +
@@ -199,6 +199,7 @@ + @@ -457,6 +458,8 @@ + + @@ -581,7 +584,6 @@ - @@ -601,8 +603,7 @@ - - + @@ -637,6 +638,8 @@ + + From 2854de22ecaf8013ec13633e1b21d031c97e3c46 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Fri, 4 Sep 2015 20:24:46 +0200 Subject: [PATCH 75/85] [RELEASE] Notepad++ release 6.8.3 --- PowerEditor/bin/change.log | 5 +++-- PowerEditor/installer/nppSetup.nsi | 4 ++-- PowerEditor/src/resource.h | 6 +++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/PowerEditor/bin/change.log b/PowerEditor/bin/change.log index 603e9dd97..3d4147c79 100644 --- a/PowerEditor/bin/change.log +++ b/PowerEditor/bin/change.log @@ -1,10 +1,11 @@ Notepad++ v6.8.3 bug-fixes: -1. Fix the crash by using wild card (*) to open files on command line. +1. Fix a crash issue by using wild card (*) to open files on command line. 2. Fix the problem of display refresh missing on exit. 3. Fix plugin shortcut configuration lost problem by using option -noPlugin. 4. Fix Norwegian localization bad display and wrong encoding. - +5. Fix functionList display problem under high DPI. +6. Fix Norwegian localization bad display and wrong encoding. Included plugins: diff --git a/PowerEditor/installer/nppSetup.nsi b/PowerEditor/installer/nppSetup.nsi index 8d8303ace..ce2ed2674 100644 --- a/PowerEditor/installer/nppSetup.nsi +++ b/PowerEditor/installer/nppSetup.nsi @@ -36,10 +36,10 @@ ; Define the application name !define APPNAME "Notepad++" -!define APPVERSION "6.8.2" +!define APPVERSION "6.8.3" !define APPNAMEANDVERSION "${APPNAME} v${APPVERSION}" !define VERSION_MAJOR 6 -!define VERSION_MINOR 82 +!define VERSION_MINOR 83 !define APPWEBSITE "http://notepad-plus-plus.org/" diff --git a/PowerEditor/src/resource.h b/PowerEditor/src/resource.h index bc1e1cc43..292577719 100644 --- a/PowerEditor/src/resource.h +++ b/PowerEditor/src/resource.h @@ -26,13 +26,13 @@ // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #pragma once -#define NOTEPAD_PLUS_VERSION TEXT("Notepad++ v6.8.2") +#define NOTEPAD_PLUS_VERSION TEXT("Notepad++ v6.8.3") // should be X.Y : ie. if VERSION_DIGITALVALUE == 4, 7, 1, 0 , then X = 4, Y = 71 // ex : #define VERSION_VALUE TEXT("5.63\0") -#define VERSION_VALUE TEXT("6.82\0") -#define VERSION_DIGITALVALUE 6, 8, 2, 0 +#define VERSION_VALUE TEXT("6.83\0") +#define VERSION_DIGITALVALUE 6, 8, 3, 0 #ifndef IDC_STATIC #define IDC_STATIC -1 From 44e9a03101e132fad856da449f422c1a515c0d36 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Fri, 11 Sep 2015 01:34:28 +0200 Subject: [PATCH 76/85] Fix the restoring problem from system tray when running in admin mode (closes #884) It seems the notification area is locked (for the sake of security) while application is in Admin mode. Disabling the tray icon mode while Notepad++ is in Admin mode is the compromised solution. --- PowerEditor/src/NppBigSwitch.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PowerEditor/src/NppBigSwitch.cpp b/PowerEditor/src/NppBigSwitch.cpp index f6c70b874..95aec90c6 100644 --- a/PowerEditor/src/NppBigSwitch.cpp +++ b/PowerEditor/src/NppBigSwitch.cpp @@ -1633,7 +1633,7 @@ LRESULT Notepad_plus::process(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lPa case WM_SYSCOMMAND: { NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); - if ((nppgui._isMinimizedToTray || _pPublicInterface->isPrelaunch()) && (wParam == SC_MINIMIZE)) + if (((nppgui._isMinimizedToTray && !_isAdministrator) || _pPublicInterface->isPrelaunch()) && (wParam == SC_MINIMIZE)) { if (nullptr == _pTrayIco) _pTrayIco = new trayIconControler(hwnd, IDI_M30ICON, IDC_MINIMIZED_TRAY, ::LoadIcon(_pPublicInterface->getHinst(), MAKEINTRESOURCE(IDI_M30ICON)), TEXT("")); From ae324bd97eb3df91b692b605ca1c096c113ccff1 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Mon, 14 Sep 2015 23:21:12 +0200 Subject: [PATCH 77/85] Remove NppFTP Remove NppFTP due to System error on startup - api-ms-win-crt-runtime-l1-1-0.dll is missing --- PowerEditor/installer/nppSetup.nsi | 13 ------------- PowerEditor/installer/packageAll.bat | 2 -- 2 files changed, 15 deletions(-) diff --git a/PowerEditor/installer/nppSetup.nsi b/PowerEditor/installer/nppSetup.nsi index ce2ed2674..d707bb795 100644 --- a/PowerEditor/installer/nppSetup.nsi +++ b/PowerEditor/installer/nppSetup.nsi @@ -804,19 +804,6 @@ SectionGroupEnd SectionGroup "Plugins" Plugins SetOverwrite on - ${MementoSection} "Npp FTP" NppFTP - Delete "$INSTDIR\plugins\NppFTP.dll" - SetOutPath "$INSTDIR\plugins" - File "..\bin\plugins\NppFTP.dll" - SetOutPath "$INSTDIR\plugins\doc\NppFTP" - File "..\bin\plugins\doc\NppFTP\license_NppFTP.txt" - File "..\bin\plugins\doc\NppFTP\license_libssh.txt" - File "..\bin\plugins\doc\NppFTP\license_OpenSSL.txt" - File "..\bin\plugins\doc\NppFTP\license_TiXML.txt" - File "..\bin\plugins\doc\NppFTP\license_ZLIB.txt" - File "..\bin\plugins\doc\NppFTP\license_UTCP.htm" - File "..\bin\plugins\doc\NppFTP\Readme.txt" - ${MementoSectionEnd} ${MementoSection} "NppExport" NppExport Delete "$INSTDIR\plugins\NppExport.dll" diff --git a/PowerEditor/installer/packageAll.bat b/PowerEditor/installer/packageAll.bat index 75b7670b1..8db3eeaae 100644 --- a/PowerEditor/installer/packageAll.bat +++ b/PowerEditor/installer/packageAll.bat @@ -91,8 +91,6 @@ If ErrorLevel 1 PAUSE rem Plugins -copy /Y "..\bin\plugins\NppFTP.dll" .\zipped.package.release\plugins\ -If ErrorLevel 1 PAUSE copy /Y "..\bin\plugins\NppExport.dll" .\zipped.package.release\plugins\ If ErrorLevel 1 PAUSE copy /Y "..\bin\plugins\mimeTools.dll" .\zipped.package.release\plugins\ From 27787fa062bb3ad411fd2c2cec9963c24cefaccd Mon Sep 17 00:00:00 2001 From: Don Ho Date: Mon, 14 Sep 2015 23:52:48 +0200 Subject: [PATCH 78/85] Remove bad asserts. Remove 2 incorrect asserts. Add 1 correct assert. --- .../src/WinControls/DockingWnd/DockingDlgInterface.h | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingDlgInterface.h b/PowerEditor/src/WinControls/DockingWnd/DockingDlgInterface.h index ff1922067..230a24ced 100644 --- a/PowerEditor/src/WinControls/DockingWnd/DockingDlgInterface.h +++ b/PowerEditor/src/WinControls/DockingWnd/DockingDlgInterface.h @@ -63,15 +63,14 @@ public: void create(tTbData * data, bool isRTL = false) { + assert(data != nullptr); StaticDialog::create(_dlgID, isRTL); TCHAR temp[MAX_PATH]; ::GetWindowText(_hSelf, temp, MAX_PATH); _pluginName = temp; - // user information - assert(data->hClient != nullptr); - data->hClient = _hSelf; - assert(data->pszName != nullptr); + // user information + data->hClient = _hSelf; data->pszName = (TCHAR *)_pluginName.c_str(); // supported features by plugin From 4df21f16dcc2984bc1b9781930ee137815b3a1fc Mon Sep 17 00:00:00 2001 From: Christophe Meriaux Date: Tue, 1 Sep 2015 13:30:54 +0200 Subject: [PATCH 79/85] Fix macro save problem on exit. (closes #831, fixes #830) --- PowerEditor/src/Notepad_plus.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index b8d1ea549..b375fb8af 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -3907,6 +3907,7 @@ bool Notepad_plus::addCurrentMacro() theMacros.push_back(ms); ::InsertMenu(hMacroMenu, posBase + nbMacro, MF_BYPOSITION, cmdID, ms.toMenuItemString().c_str()); _accelerator.updateShortcuts(); + (NppParameters::getInstance())->setShortcutDirty(); return true; } return false; From 69a57e5e8da26489f71b5cdc70df0006360ec5dd Mon Sep 17 00:00:00 2001 From: Don Ho Date: Wed, 16 Sep 2015 17:56:12 +0200 Subject: [PATCH 80/85] Fix user command save problem on exit. --- PowerEditor/src/Notepad_plus.cpp | 7 ++++--- PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg.cpp | 6 ++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp index b375fb8af..7c13f1b60 100644 --- a/PowerEditor/src/Notepad_plus.cpp +++ b/PowerEditor/src/Notepad_plus.cpp @@ -3878,7 +3878,8 @@ bool Notepad_plus::saveScintillaParams() bool Notepad_plus::addCurrentMacro() { - vector & theMacros = (NppParameters::getInstance())->getMacroList(); + NppParameters* nppParams = NppParameters::getInstance(); + vector & theMacros = nppParams->getMacroList(); int nbMacro = theMacros.size(); @@ -3897,7 +3898,7 @@ bool Notepad_plus::addCurrentMacro() // Insert the separator and modify/delete command ::InsertMenu(hMacroMenu, posBase + nbMacro + 1, MF_BYPOSITION, (unsigned int)-1, 0); - NativeLangSpeaker *pNativeLangSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker(); + NativeLangSpeaker *pNativeLangSpeaker = nppParams->getNativeLangSpeaker(); generic_string nativeLangShortcutMapperMacro = pNativeLangSpeaker->getNativeLangMenuString(IDM_SETTING_SHORTCUT_MAPPER_MACRO); if (nativeLangShortcutMapperMacro == TEXT("")) nativeLangShortcutMapperMacro = TEXT("Modify Shortcut/Delete Macro..."); @@ -3907,7 +3908,7 @@ bool Notepad_plus::addCurrentMacro() theMacros.push_back(ms); ::InsertMenu(hMacroMenu, posBase + nbMacro, MF_BYPOSITION, cmdID, ms.toMenuItemString().c_str()); _accelerator.updateShortcuts(); - (NppParameters::getInstance())->setShortcutDirty(); + nppParams->setShortcutDirty(); return true; } return false; diff --git a/PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg.cpp b/PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg.cpp index aeb2b4e98..095ed67bf 100644 --- a/PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg.cpp +++ b/PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg.cpp @@ -250,18 +250,20 @@ INT_PTR CALLBACK RunDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM) theUserCmds.push_back(uc); ::InsertMenu(hRunMenu, posBase + nbCmd, MF_BYPOSITION, cmdID, uc.toMenuItemString().c_str()); + NppParameters* nppParams = NppParameters::getInstance(); if (nbCmd == 0) { // Insert the separator and modify/delete command ::InsertMenu(hRunMenu, posBase + nbCmd + 1, MF_BYPOSITION, (unsigned int)-1, 0); - NativeLangSpeaker *pNativeLangSpeaker = (NppParameters::getInstance())->getNativeLangSpeaker(); + NativeLangSpeaker *pNativeLangSpeaker = nppParams->getNativeLangSpeaker(); generic_string nativeLangShortcutMapperMacro = pNativeLangSpeaker->getNativeLangMenuString(IDM_SETTING_SHORTCUT_MAPPER_MACRO); if (nativeLangShortcutMapperMacro == TEXT("")) nativeLangShortcutMapperMacro = TEXT("Modify Shortcut/Delete Command..."); ::InsertMenu(hRunMenu, posBase + nbCmd + 2, MF_BYCOMMAND, IDM_SETTING_SHORTCUT_MAPPER_RUN, nativeLangShortcutMapperMacro.c_str()); } - (NppParameters::getInstance())->getAccelerator()->updateShortcuts(); + nppParams->getAccelerator()->updateShortcuts(); + nppParams->setShortcutDirty(); } return TRUE; } From 9b91480ecfc5eb392d562ddab1d530bd439d386e Mon Sep 17 00:00:00 2001 From: Don Ho Date: Wed, 16 Sep 2015 09:08:53 +0200 Subject: [PATCH 81/85] Add language auto-detection for php, xml, html and bash Check the beginning of file content to learn which programming language in the content. The detected lang type will be applied only if php, xml, html or bash is detected. The language type is determinated via file extension, if the file extension is unknown or the determinated lang type is different from the detected value, then the detected lang type via the file content will be used. --- PowerEditor/bin/Nppold.exe | Bin 0 -> 2049536 bytes PowerEditor/src/ScitillaComponent/Buffer.cpp | 76 +++++++++++++++++-- PowerEditor/src/ScitillaComponent/Buffer.h | 3 +- 3 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 PowerEditor/bin/Nppold.exe diff --git a/PowerEditor/bin/Nppold.exe b/PowerEditor/bin/Nppold.exe new file mode 100644 index 0000000000000000000000000000000000000000..122ec558e05c6d9e9f8416b530e36db8f49bc8ab GIT binary patch literal 2049536 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