From 4dd3b257e06c56093d109f055911addfe93770f7 Mon Sep 17 00:00:00 2001 From: Don Ho Date: Fri, 24 Apr 2009 23:34:47 +0000 Subject: [PATCH] Moved PowerEditor in trunk remotely git-svn-id: svn://svn.tuxfamily.org/svnroot/notepadplus/repository/trunk@460 f5eea248-9336-0410-98b8-ebc06183d4e3 --- PowerEditor/bin/change.log | 29 + PowerEditor/bin/license.txt | 88 + PowerEditor/bin/npp.pdb | Bin 0 -> 5475328 bytes PowerEditor/bin/readme.txt | 45 + PowerEditor/gcc/delete.bat | 4 + PowerEditor/gcc/include/eh.h | 7 + PowerEditor/gcc/include/various.h | 51 + PowerEditor/gcc/makefile | 203 + PowerEditor/gcc/readme.txt | 5 + PowerEditor/gcc/resources.rc | 19 + PowerEditor/installer/bin/xmlUpdater.exe | Bin 0 -> 100247 bytes PowerEditor/installer/configModel.xml | 6 + .../installer/externalTools/md5summer.exe | Bin 0 -> 907264 bytes PowerEditor/installer/images/header.bmp | Bin 0 -> 25818 bytes PowerEditor/installer/images/headerLeft.bmp | Bin 0 -> 26270 bytes PowerEditor/installer/images/headerRight.bmp | Bin 0 -> 26270 bytes PowerEditor/installer/images/npp_inst.ico | Bin 0 -> 13902 bytes PowerEditor/installer/images/splash.bmp | Bin 0 -> 1205354 bytes PowerEditor/installer/images/wizard.bmp | Bin 0 -> 154542 bytes PowerEditor/installer/langsModel.xml | 6 + PowerEditor/installer/nppSetup.nsi | 1011 ++ PowerEditor/installer/packageAll.bat | 48 + PowerEditor/installer/stylesGlobalModel.xml | 7 + PowerEditor/installer/stylesLexerModel.xml | 7 + PowerEditor/license.txt | 88 + PowerEditor/src/CMakeLists.txt | 182 + PowerEditor/src/MISC/Common/Common.cpp | 377 + PowerEditor/src/MISC/Common/Common.h | 136 + PowerEditor/src/MISC/Exception/MiniDumper.cpp | 82 + PowerEditor/src/MISC/Exception/MiniDumper.h | 22 + .../src/MISC/Exception/Win32Exception.cpp | 49 + .../src/MISC/Exception/Win32Exception.h | 46 + PowerEditor/src/MISC/FileNameStringSplitter.h | 92 + .../MISC/PluginsManager/Notepad_plus_msgs.h | 428 + .../src/MISC/PluginsManager/PluginInterface.h | 69 + .../MISC/PluginsManager/PluginsManager.cpp | 301 + .../src/MISC/PluginsManager/PluginsManager.h | 155 + .../MISC/PluginsManager/deprecatedSymbols.h | 68 + PowerEditor/src/MISC/Process/Process.cpp | 301 + PowerEditor/src/MISC/Process/Process.h | 111 + .../Process/ProcessAvecThread/Process.cpp | 243 + .../MISC/Process/ProcessAvecThread/Process.h | 92 + .../Process/ProcessAvecThread/ProcessThread.h | 85 + PowerEditor/src/MISC/RegExt/regExtDlg.cpp | 388 + PowerEditor/src/MISC/RegExt/regExtDlg.h | 60 + PowerEditor/src/MISC/RegExt/regExtDlg.rc | 39 + PowerEditor/src/MISC/RegExt/regExtDlgRc.h | 35 + PowerEditor/src/MISC/crc16/Crc16.h | 112 + PowerEditor/src/Notepad_plus.cpp | 9885 +++++++++++++++++ PowerEditor/src/Notepad_plus.h | 839 ++ PowerEditor/src/Notepad_plus.rc | 622 ++ PowerEditor/src/Parameters.cpp | 4722 ++++++++ PowerEditor/src/Parameters.h | 1418 +++ .../src/ScitillaComponent/AutoCompletion.cpp | 306 + .../src/ScitillaComponent/AutoCompletion.h | 57 + PowerEditor/src/ScitillaComponent/Buffer.cpp | 723 ++ PowerEditor/src/ScitillaComponent/Buffer.h | 386 + .../src/ScitillaComponent/DocTabView.cpp | 146 + .../src/ScitillaComponent/DocTabView.h | 92 + .../src/ScitillaComponent/FindReplaceDlg.cpp | 1975 ++++ .../src/ScitillaComponent/FindReplaceDlg.h | 594 + .../src/ScitillaComponent/FindReplaceDlg.rc | 100 + .../src/ScitillaComponent/FindReplaceDlg_rc.h | 74 + .../src/ScitillaComponent/FunctionCallTip.cpp | 416 + .../src/ScitillaComponent/FunctionCallTip.h | 71 + .../src/ScitillaComponent/GoToLineDlg.cpp | 104 + .../src/ScitillaComponent/GoToLineDlg.h | 93 + PowerEditor/src/ScitillaComponent/Printer.cpp | 502 + PowerEditor/src/ScitillaComponent/Printer.h | 55 + .../ScitillaComponent/ScintillaEditView.cpp | 2486 +++++ .../src/ScitillaComponent/ScintillaEditView.h | 821 ++ .../src/ScitillaComponent/ScintillaRef.h | 6 + .../ScitillaComponent/SmartHighlighter.cpp | 177 + .../src/ScitillaComponent/SmartHighlighter.h | 35 + .../ScitillaComponent/UserDefineDialog.cpp | 1611 +++ .../src/ScitillaComponent/UserDefineDialog.h | 505 + .../src/ScitillaComponent/UserDefineDialog.rc | 270 + .../UserDefineLangReference.h | 36 + .../ScitillaComponent/UserDefineResource.h | 265 + PowerEditor/src/ScitillaComponent/colors.h | 62 + .../src/ScitillaComponent/columnEditor.cpp | 255 + .../src/ScitillaComponent/columnEditor.h | 83 + .../src/ScitillaComponent/columnEditor.rc | 49 + .../src/ScitillaComponent/columnEditor_rc.h | 39 + .../xmlMatchedTagsHighlighter.cpp | 492 + .../xmlMatchedTagsHighlighter.h | 61 + PowerEditor/src/StaticControl.h | 35 + PowerEditor/src/TinyXml/tinyXmlA/tinystrA.cpp | 303 + PowerEditor/src/TinyXml/tinyXmlA/tinystrA.h | 236 + PowerEditor/src/TinyXml/tinyXmlA/tinyxmlA.cpp | 1316 +++ PowerEditor/src/TinyXml/tinyXmlA/tinyxmlA.h | 1263 +++ .../src/TinyXml/tinyXmlA/tinyxmlerrorA.cpp | 50 + .../src/TinyXml/tinyXmlA/tinyxmlparserA.cpp | 1157 ++ PowerEditor/src/TinyXml/tinystr.cpp | 303 + PowerEditor/src/TinyXml/tinystr.h | 237 + PowerEditor/src/TinyXml/tinyxml.cpp | 1260 +++ PowerEditor/src/TinyXml/tinyxml.h | 1265 +++ PowerEditor/src/TinyXml/tinyxmlerror.cpp | 51 + PowerEditor/src/TinyXml/tinyxmlparser.cpp | 1141 ++ PowerEditor/src/UniConversion.cpp | 136 + PowerEditor/src/UniConversion.h | 13 + PowerEditor/src/Utf8_16.cpp | 527 + PowerEditor/src/Utf8_16.h | 153 + .../src/WinControls/AboutDlg/AboutDlg.cpp | 107 + .../src/WinControls/AboutDlg/AboutDlg.h | 63 + .../src/WinControls/AboutDlg/URLCtrl.cpp | 277 + .../src/WinControls/AboutDlg/URLCtrl.h | 43 + .../WinControls/ColourPicker/ColourPicker.cpp | 181 + .../WinControls/ColourPicker/ColourPicker.h | 62 + .../WinControls/ColourPicker/ColourPopup.cpp | 240 + .../WinControls/ColourPicker/ColourPopup.h | 68 + .../WinControls/ColourPicker/ColourPopup.rc | 32 + .../ColourPicker/ColourPopupResource.h | 3 + .../WinControls/ColourPicker/WordStyleDlg.cpp | 824 ++ .../WinControls/ColourPicker/WordStyleDlg.h | 249 + .../WinControls/ColourPicker/WordStyleDlg.rc | 82 + .../ColourPicker/WordStyleDlgRes.h | 65 + .../src/WinControls/ContextMenu/ContextMenu.h | 82 + .../src/WinControls/DockingWnd/CloseDown.bmp | Bin 0 -> 486 bytes .../src/WinControls/DockingWnd/CloseUp.bmp | Bin 0 -> 486 bytes .../src/WinControls/DockingWnd/Docking.h | 79 + .../WinControls/DockingWnd/DockingCont.cpp | 1408 +++ .../src/WinControls/DockingWnd/DockingCont.h | 234 + .../DockingWnd/DockingDlgInterface.h | 136 + .../DockingWnd/DockingGUIWidget.rc | 22 + .../WinControls/DockingWnd/DockingManager.cpp | 876 ++ .../WinControls/DockingWnd/DockingManager.h | 213 + .../DockingWnd/DockingSplitter.cpp | 207 + .../WinControls/DockingWnd/DockingSplitter.h | 59 + .../WinControls/DockingWnd/DropData.cpp.bak | 214 + .../src/WinControls/DockingWnd/DropData.h | 74 + .../src/WinControls/DockingWnd/Gripper.cpp | 793 ++ .../src/WinControls/DockingWnd/Gripper.h | 138 + .../WinControls/DockingWnd/dockingResource.h | 46 + PowerEditor/src/WinControls/Grid/BabyGrid.cpp | 3268 ++++++ PowerEditor/src/WinControls/Grid/BabyGrid.h | 109 + .../src/WinControls/Grid/BabyGridWrapper.cpp | 41 + .../src/WinControls/Grid/BabyGridWrapper.h | 91 + .../src/WinControls/Grid/ShortcutMapper.cpp | 400 + .../src/WinControls/Grid/ShortcutMapper.h | 80 + .../src/WinControls/Grid/ShortcutMapper.rc | 38 + .../src/WinControls/Grid/ShortcutMapper_rc.h | 24 + .../WinControls/ImageListSet/ImageListSet.cpp | 62 + .../WinControls/ImageListSet/ImageListSet.h | 184 + .../OpenSaveFileDialog/FileDialog.cpp | 409 + .../OpenSaveFileDialog/FileDialog.h | 152 + .../src/WinControls/Preference/preference.rc | 252 + .../WinControls/Preference/preferenceDlg.cpp | 1778 +++ .../WinControls/Preference/preferenceDlg.h | 187 + .../WinControls/Preference/preference_rc.h | 206 + .../SplitterContainer/Splitter.cpp | 691 ++ .../WinControls/SplitterContainer/Splitter.h | 117 + .../SplitterContainer/SplitterContainer.cpp | 240 + .../SplitterContainer/SplitterContainer.h | 101 + .../StaticDialog/RunDlg/RunDlg.cpp | 299 + .../WinControls/StaticDialog/RunDlg/RunDlg.h | 77 + .../WinControls/StaticDialog/RunDlg/RunDlg.rc | 43 + .../StaticDialog/RunDlg/RunDlg_rc.h | 5 + .../WinControls/StaticDialog/StaticDialog.cpp | 168 + .../WinControls/StaticDialog/StaticDialog.h | 89 + .../src/WinControls/StatusBar/StatusBar.cpp | 77 + .../src/WinControls/StatusBar/StatusBar.h | 84 + .../src/WinControls/TabBar/ControlsTab.cpp | 71 + .../src/WinControls/TabBar/ControlsTab.h | 110 + PowerEditor/src/WinControls/TabBar/TabBar.cpp | 810 ++ PowerEditor/src/WinControls/TabBar/TabBar.h | 382 + .../src/WinControls/TaskList/TaskList.cpp | 243 + .../src/WinControls/TaskList/TaskList.h | 89 + .../src/WinControls/TaskList/TaskListDlg.h | 255 + .../src/WinControls/TaskList/TaskListDlg.rc | 26 + .../src/WinControls/TaskList/TaskListDlg_rc.h | 24 + .../src/WinControls/ToolBar/ToolBar.cpp | 392 + PowerEditor/src/WinControls/ToolBar/ToolBar.h | 174 + .../src/WinControls/ToolTip/ToolTip.cpp | 81 + PowerEditor/src/WinControls/ToolTip/ToolTip.h | 63 + .../TrayIcon/trayIconControler.cpp | 26 + .../WinControls/TrayIcon/trayIconControler.h | 25 + .../src/WinControls/TreeView/TreeView.cpp | 73 + .../src/WinControls/TreeView/TreeView.h | 44 + PowerEditor/src/WinControls/Window.h | 119 + PowerEditor/src/WinControls/WindowInterface.h | 33 + .../WinControls/WindowsDlg/SizeableDlg.cpp | 58 + .../src/WinControls/WindowsDlg/SizeableDlg.h | 20 + .../src/WinControls/WindowsDlg/WinMgr.cpp | 480 + .../src/WinControls/WindowsDlg/WinMgr.h | 303 + .../src/WinControls/WindowsDlg/WinRect.cpp | 84 + .../src/WinControls/WindowsDlg/WindowsDlg.cpp | 882 ++ .../src/WinControls/WindowsDlg/WindowsDlg.h | 114 + .../src/WinControls/WindowsDlg/WindowsDlg.rc | 48 + .../src/WinControls/WindowsDlg/WindowsDlgRc.h | 19 + .../src/WinControls/shortcut/RunMacroDlg.cpp | 115 + .../src/WinControls/shortcut/RunMacroDlg.h | 97 + .../src/WinControls/shortcut/RunMacroDlg.rc | 41 + .../src/WinControls/shortcut/RunMacroDlg_rc.h | 32 + .../src/WinControls/shortcut/shortcut.cpp | 823 ++ .../src/WinControls/shortcut/shortcut.h | 381 + .../src/WinControls/shortcut/shortcut.rc | 79 + .../src/WinControls/shortcut/shortcutRc.h | 36 + PowerEditor/src/config.model.xml | 82 + PowerEditor/src/contextMenu.xml | 30 + PowerEditor/src/cursors/drag.cur | Bin 0 -> 766 bytes PowerEditor/src/cursors/drag_interdit.cur | Bin 0 -> 766 bytes PowerEditor/src/cursors/drag_out.cur | Bin 0 -> 2238 bytes PowerEditor/src/cursors/drag_plus.cur | Bin 0 -> 766 bytes PowerEditor/src/font/LINEDRAW.TTF | Bin 0 -> 80024 bytes PowerEditor/src/icons/allChars_off.ico | Bin 0 -> 4022 bytes PowerEditor/src/icons/allChars_on.ico | Bin 0 -> 4022 bytes PowerEditor/src/icons/closeAll.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/closeFile.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/closeTabButton.bmp | Bin 0 -> 450 bytes .../src/icons/closeTabButton_hover.bmp | Bin 0 -> 450 bytes .../src/icons/closeTabButton_inact.bmp | Bin 0 -> 450 bytes PowerEditor/src/icons/closeTabButton_push.bmp | Bin 0 -> 450 bytes PowerEditor/src/icons/copy.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/cut.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/cut_dis.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/cut_off.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/cut_on.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/delete.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/dupli_dis.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/dupli_off.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/dupli_on.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/find.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/findReplace.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/findResult.ico | Bin 0 -> 1406 bytes PowerEditor/src/icons/find_off.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/find_on.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/findrep_off.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/findrep_on.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/imprim_off.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/imprim_on.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/indentGuide.bmp | Bin 0 -> 246 bytes PowerEditor/src/icons/indentGuide_off.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/indentGuide_on.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/invisibleChar.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/newFile.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/new_off.ico | Bin 0 -> 2238 bytes PowerEditor/src/icons/new_on.ico | Bin 0 -> 2238 bytes PowerEditor/src/icons/npp.ico | Bin 0 -> 7406 bytes PowerEditor/src/icons/openFile.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/open_off.ico | Bin 0 -> 2238 bytes PowerEditor/src/icons/open_on.ico | Bin 0 -> 2238 bytes PowerEditor/src/icons/paste.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/paste_dis.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/paste_off.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/paste_on.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/playRecord.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/playRecord_m.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/playrecord_dis.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/playrecord_m_dis.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/playrecord_m_off.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/playrecord_m_on.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/playrecord_off.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/playrecord_on.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/print.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/readonly.ico | Bin 0 -> 1150 bytes PowerEditor/src/icons/readonly.ico.old | Bin 0 -> 2238 bytes PowerEditor/src/icons/redo.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/redo_dis.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/redo_off.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/redo_on.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/saveAll.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/saveFile.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/saveRecord.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/save_dis.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/save_off.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/save_on.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/saveall_dis.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/saveall_off.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/saveall_on.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/saved.ico | Bin 0 -> 1150 bytes PowerEditor/src/icons/saved.ico.old | Bin 0 -> 1342 bytes PowerEditor/src/icons/saverecord_dis.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/saverecord_off.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/saverecord_on.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/showPannel.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/startRecord.bmp | Bin 0 -> 246 bytes PowerEditor/src/icons/startrecord_dis.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/startrecord_off.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/startrecord_on.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/stopRecord.bmp | Bin 0 -> 246 bytes PowerEditor/src/icons/stoprecord_dis.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/stoprecord_off.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/stoprecord_on.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/supp_off.ico | Bin 0 -> 2238 bytes PowerEditor/src/icons/supp_on.ico | Bin 0 -> 2238 bytes PowerEditor/src/icons/suppall_off.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/suppall_on.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/syncH.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/syncH_dis.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/syncH_off.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/syncH_on.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/syncV.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/syncV_dis.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/syncV_off.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/syncV_on.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/undo.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/undo_dis.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/undo_off.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/undo_on.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/unsaved.ico | Bin 0 -> 1150 bytes PowerEditor/src/icons/unsaved.ico.old | Bin 0 -> 1566 bytes PowerEditor/src/icons/userDefineDlg_off.ico | Bin 0 -> 4022 bytes PowerEditor/src/icons/userDefineDlg_on.ico | Bin 0 -> 4022 bytes PowerEditor/src/icons/wrap.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/wrap_dis.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/wrap_off.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/wrap_on.ico | Bin 0 -> 3262 bytes PowerEditor/src/icons/xxxx.bmp | Bin 0 -> 822 bytes PowerEditor/src/icons/zoomIn.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/zoomIn_off.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/zoomIn_on.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/zoomOut.bmp | Bin 0 -> 1334 bytes PowerEditor/src/icons/zoomOut_off.ico | Bin 0 -> 2998 bytes PowerEditor/src/icons/zoomOut_on.ico | Bin 0 -> 2998 bytes PowerEditor/src/keys.h | 178 + PowerEditor/src/langs.model.xml | 209 + PowerEditor/src/lastRecentFileList.cpp | 209 + PowerEditor/src/lastRecentFileList.h | 74 + PowerEditor/src/lesDlgs.h | 131 + PowerEditor/src/localizationString.h | Bin 0 -> 6106 bytes PowerEditor/src/menuCmdID.h | 307 + PowerEditor/src/notepad++.exe.manifest | 32 + PowerEditor/src/resource.h | 375 + PowerEditor/src/shortcuts.xml | 20 + PowerEditor/src/stylers.model.xml | 730 ++ PowerEditor/src/toolbarIcons.xml | 94 + PowerEditor/src/tools/IExplorerShell/makefile | 2 + .../IExplorerShell/nppIExplorerShell.cpp | 40 + PowerEditor/src/tools/nppCM/Makefile | 24 + PowerEditor/src/tools/nppCM/license.txt | 19 + PowerEditor/src/tools/nppCM/npp.bmp | Bin 0 -> 1334 bytes PowerEditor/src/tools/nppCM/nppcm.RES | Bin 0 -> 2248 bytes PowerEditor/src/tools/nppCM/nppcm.cpp | 481 + PowerEditor/src/tools/nppCM/nppcm.def | 10 + PowerEditor/src/tools/nppCM/nppcm.h | 79 + PowerEditor/src/tools/nppCM/nppcm.rc | 116 + PowerEditor/src/tools/nppCM/readme.txt | 62 + PowerEditor/src/tools/nppCM/resource.h | 17 + PowerEditor/src/tools/xmlApiSorter/sorter.cpp | 176 + .../src/tools/xmlApiSorter/sorter.vcproj | 160 + .../src/tools/xmlUpdater/configModel.xml | 6 + .../src/tools/xmlUpdater/langsModel.xml | 6 + PowerEditor/src/tools/xmlUpdater/makefile | 56 + .../src/tools/xmlUpdater/stylers_remove.xml | 17 + .../src/tools/xmlUpdater/stylesModel.xml | 12 + .../src/tools/xmlUpdater/xmlUpdater.cpp | 337 + .../src/tools/xmlUpdater/xmlUpdater.vcproj | 224 + PowerEditor/src/userDefineLang.xml | 62 + PowerEditor/src/winmain.cpp | 383 + PowerEditor/src/xpm_icons.h | 287 + PowerEditor/visual.net/no_ms_shit.vsprops | 11 + .../visual.net/notepadPlus.vc.7.0.vcproj | 1091 ++ PowerEditor/visual.net/notepadPlus.vcproj | 1344 +++ 354 files changed, 75270 insertions(+) create mode 100644 PowerEditor/bin/change.log create mode 100644 PowerEditor/bin/license.txt create mode 100644 PowerEditor/bin/npp.pdb create mode 100644 PowerEditor/bin/readme.txt create mode 100644 PowerEditor/gcc/delete.bat create mode 100644 PowerEditor/gcc/include/eh.h create mode 100644 PowerEditor/gcc/include/various.h create mode 100644 PowerEditor/gcc/makefile create mode 100644 PowerEditor/gcc/readme.txt create mode 100644 PowerEditor/gcc/resources.rc create mode 100644 PowerEditor/installer/bin/xmlUpdater.exe create mode 100644 PowerEditor/installer/configModel.xml create mode 100644 PowerEditor/installer/externalTools/md5summer.exe create mode 100644 PowerEditor/installer/images/header.bmp create mode 100644 PowerEditor/installer/images/headerLeft.bmp create mode 100644 PowerEditor/installer/images/headerRight.bmp create mode 100644 PowerEditor/installer/images/npp_inst.ico create mode 100644 PowerEditor/installer/images/splash.bmp create mode 100644 PowerEditor/installer/images/wizard.bmp create mode 100644 PowerEditor/installer/langsModel.xml create mode 100644 PowerEditor/installer/nppSetup.nsi create mode 100644 PowerEditor/installer/packageAll.bat create mode 100644 PowerEditor/installer/stylesGlobalModel.xml create mode 100644 PowerEditor/installer/stylesLexerModel.xml create mode 100644 PowerEditor/license.txt create mode 100644 PowerEditor/src/CMakeLists.txt create mode 100644 PowerEditor/src/MISC/Common/Common.cpp create mode 100644 PowerEditor/src/MISC/Common/Common.h create mode 100644 PowerEditor/src/MISC/Exception/MiniDumper.cpp create mode 100644 PowerEditor/src/MISC/Exception/MiniDumper.h create mode 100644 PowerEditor/src/MISC/Exception/Win32Exception.cpp create mode 100644 PowerEditor/src/MISC/Exception/Win32Exception.h create mode 100644 PowerEditor/src/MISC/FileNameStringSplitter.h create mode 100644 PowerEditor/src/MISC/PluginsManager/Notepad_plus_msgs.h create mode 100644 PowerEditor/src/MISC/PluginsManager/PluginInterface.h create mode 100644 PowerEditor/src/MISC/PluginsManager/PluginsManager.cpp create mode 100644 PowerEditor/src/MISC/PluginsManager/PluginsManager.h create mode 100644 PowerEditor/src/MISC/PluginsManager/deprecatedSymbols.h create mode 100644 PowerEditor/src/MISC/Process/Process.cpp create mode 100644 PowerEditor/src/MISC/Process/Process.h create mode 100644 PowerEditor/src/MISC/Process/ProcessAvecThread/Process.cpp create mode 100644 PowerEditor/src/MISC/Process/ProcessAvecThread/Process.h create mode 100644 PowerEditor/src/MISC/Process/ProcessAvecThread/ProcessThread.h create mode 100644 PowerEditor/src/MISC/RegExt/regExtDlg.cpp create mode 100644 PowerEditor/src/MISC/RegExt/regExtDlg.h create mode 100644 PowerEditor/src/MISC/RegExt/regExtDlg.rc create mode 100644 PowerEditor/src/MISC/RegExt/regExtDlgRc.h create mode 100644 PowerEditor/src/MISC/crc16/Crc16.h create mode 100644 PowerEditor/src/Notepad_plus.cpp create mode 100644 PowerEditor/src/Notepad_plus.h create mode 100644 PowerEditor/src/Notepad_plus.rc create mode 100644 PowerEditor/src/Parameters.cpp create mode 100644 PowerEditor/src/Parameters.h create mode 100644 PowerEditor/src/ScitillaComponent/AutoCompletion.cpp create mode 100644 PowerEditor/src/ScitillaComponent/AutoCompletion.h create mode 100644 PowerEditor/src/ScitillaComponent/Buffer.cpp create mode 100644 PowerEditor/src/ScitillaComponent/Buffer.h create mode 100644 PowerEditor/src/ScitillaComponent/DocTabView.cpp create mode 100644 PowerEditor/src/ScitillaComponent/DocTabView.h create mode 100644 PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp create mode 100644 PowerEditor/src/ScitillaComponent/FindReplaceDlg.h create mode 100644 PowerEditor/src/ScitillaComponent/FindReplaceDlg.rc create mode 100644 PowerEditor/src/ScitillaComponent/FindReplaceDlg_rc.h create mode 100644 PowerEditor/src/ScitillaComponent/FunctionCallTip.cpp create mode 100644 PowerEditor/src/ScitillaComponent/FunctionCallTip.h create mode 100644 PowerEditor/src/ScitillaComponent/GoToLineDlg.cpp create mode 100644 PowerEditor/src/ScitillaComponent/GoToLineDlg.h create mode 100644 PowerEditor/src/ScitillaComponent/Printer.cpp create mode 100644 PowerEditor/src/ScitillaComponent/Printer.h create mode 100644 PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp create mode 100644 PowerEditor/src/ScitillaComponent/ScintillaEditView.h create mode 100644 PowerEditor/src/ScitillaComponent/ScintillaRef.h create mode 100644 PowerEditor/src/ScitillaComponent/SmartHighlighter.cpp create mode 100644 PowerEditor/src/ScitillaComponent/SmartHighlighter.h create mode 100644 PowerEditor/src/ScitillaComponent/UserDefineDialog.cpp create mode 100644 PowerEditor/src/ScitillaComponent/UserDefineDialog.h create mode 100644 PowerEditor/src/ScitillaComponent/UserDefineDialog.rc create mode 100644 PowerEditor/src/ScitillaComponent/UserDefineLangReference.h create mode 100644 PowerEditor/src/ScitillaComponent/UserDefineResource.h create mode 100644 PowerEditor/src/ScitillaComponent/colors.h create mode 100644 PowerEditor/src/ScitillaComponent/columnEditor.cpp create mode 100644 PowerEditor/src/ScitillaComponent/columnEditor.h create mode 100644 PowerEditor/src/ScitillaComponent/columnEditor.rc create mode 100644 PowerEditor/src/ScitillaComponent/columnEditor_rc.h create mode 100644 PowerEditor/src/ScitillaComponent/xmlMatchedTagsHighlighter.cpp create mode 100644 PowerEditor/src/ScitillaComponent/xmlMatchedTagsHighlighter.h create mode 100644 PowerEditor/src/StaticControl.h create mode 100644 PowerEditor/src/TinyXml/tinyXmlA/tinystrA.cpp create mode 100644 PowerEditor/src/TinyXml/tinyXmlA/tinystrA.h create mode 100644 PowerEditor/src/TinyXml/tinyXmlA/tinyxmlA.cpp create mode 100644 PowerEditor/src/TinyXml/tinyXmlA/tinyxmlA.h create mode 100644 PowerEditor/src/TinyXml/tinyXmlA/tinyxmlerrorA.cpp create mode 100644 PowerEditor/src/TinyXml/tinyXmlA/tinyxmlparserA.cpp create mode 100644 PowerEditor/src/TinyXml/tinystr.cpp create mode 100644 PowerEditor/src/TinyXml/tinystr.h create mode 100644 PowerEditor/src/TinyXml/tinyxml.cpp create mode 100644 PowerEditor/src/TinyXml/tinyxml.h create mode 100644 PowerEditor/src/TinyXml/tinyxmlerror.cpp create mode 100644 PowerEditor/src/TinyXml/tinyxmlparser.cpp create mode 100644 PowerEditor/src/UniConversion.cpp create mode 100644 PowerEditor/src/UniConversion.h create mode 100644 PowerEditor/src/Utf8_16.cpp create mode 100644 PowerEditor/src/Utf8_16.h create mode 100644 PowerEditor/src/WinControls/AboutDlg/AboutDlg.cpp create mode 100644 PowerEditor/src/WinControls/AboutDlg/AboutDlg.h create mode 100644 PowerEditor/src/WinControls/AboutDlg/URLCtrl.cpp create mode 100644 PowerEditor/src/WinControls/AboutDlg/URLCtrl.h create mode 100644 PowerEditor/src/WinControls/ColourPicker/ColourPicker.cpp create mode 100644 PowerEditor/src/WinControls/ColourPicker/ColourPicker.h create mode 100644 PowerEditor/src/WinControls/ColourPicker/ColourPopup.cpp create mode 100644 PowerEditor/src/WinControls/ColourPicker/ColourPopup.h create mode 100644 PowerEditor/src/WinControls/ColourPicker/ColourPopup.rc create mode 100644 PowerEditor/src/WinControls/ColourPicker/ColourPopupResource.h create mode 100644 PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.cpp create mode 100644 PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.h create mode 100644 PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.rc create mode 100644 PowerEditor/src/WinControls/ColourPicker/WordStyleDlgRes.h create mode 100644 PowerEditor/src/WinControls/ContextMenu/ContextMenu.h create mode 100644 PowerEditor/src/WinControls/DockingWnd/CloseDown.bmp create mode 100644 PowerEditor/src/WinControls/DockingWnd/CloseUp.bmp create mode 100644 PowerEditor/src/WinControls/DockingWnd/Docking.h create mode 100644 PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp create mode 100644 PowerEditor/src/WinControls/DockingWnd/DockingCont.h create mode 100644 PowerEditor/src/WinControls/DockingWnd/DockingDlgInterface.h create mode 100644 PowerEditor/src/WinControls/DockingWnd/DockingGUIWidget.rc create mode 100644 PowerEditor/src/WinControls/DockingWnd/DockingManager.cpp create mode 100644 PowerEditor/src/WinControls/DockingWnd/DockingManager.h create mode 100644 PowerEditor/src/WinControls/DockingWnd/DockingSplitter.cpp create mode 100644 PowerEditor/src/WinControls/DockingWnd/DockingSplitter.h create mode 100644 PowerEditor/src/WinControls/DockingWnd/DropData.cpp.bak create mode 100644 PowerEditor/src/WinControls/DockingWnd/DropData.h create mode 100644 PowerEditor/src/WinControls/DockingWnd/Gripper.cpp create mode 100644 PowerEditor/src/WinControls/DockingWnd/Gripper.h create mode 100644 PowerEditor/src/WinControls/DockingWnd/dockingResource.h create mode 100644 PowerEditor/src/WinControls/Grid/BabyGrid.cpp create mode 100644 PowerEditor/src/WinControls/Grid/BabyGrid.h create mode 100644 PowerEditor/src/WinControls/Grid/BabyGridWrapper.cpp create mode 100644 PowerEditor/src/WinControls/Grid/BabyGridWrapper.h create mode 100644 PowerEditor/src/WinControls/Grid/ShortcutMapper.cpp create mode 100644 PowerEditor/src/WinControls/Grid/ShortcutMapper.h create mode 100644 PowerEditor/src/WinControls/Grid/ShortcutMapper.rc create mode 100644 PowerEditor/src/WinControls/Grid/ShortcutMapper_rc.h create mode 100644 PowerEditor/src/WinControls/ImageListSet/ImageListSet.cpp create mode 100644 PowerEditor/src/WinControls/ImageListSet/ImageListSet.h create mode 100644 PowerEditor/src/WinControls/OpenSaveFileDialog/FileDialog.cpp create mode 100644 PowerEditor/src/WinControls/OpenSaveFileDialog/FileDialog.h create mode 100644 PowerEditor/src/WinControls/Preference/preference.rc create mode 100644 PowerEditor/src/WinControls/Preference/preferenceDlg.cpp create mode 100644 PowerEditor/src/WinControls/Preference/preferenceDlg.h create mode 100644 PowerEditor/src/WinControls/Preference/preference_rc.h create mode 100644 PowerEditor/src/WinControls/SplitterContainer/Splitter.cpp create mode 100644 PowerEditor/src/WinControls/SplitterContainer/Splitter.h create mode 100644 PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.cpp create mode 100644 PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.h create mode 100644 PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg.cpp create mode 100644 PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg.h create mode 100644 PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg.rc create mode 100644 PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg_rc.h create mode 100644 PowerEditor/src/WinControls/StaticDialog/StaticDialog.cpp create mode 100644 PowerEditor/src/WinControls/StaticDialog/StaticDialog.h create mode 100644 PowerEditor/src/WinControls/StatusBar/StatusBar.cpp create mode 100644 PowerEditor/src/WinControls/StatusBar/StatusBar.h create mode 100644 PowerEditor/src/WinControls/TabBar/ControlsTab.cpp create mode 100644 PowerEditor/src/WinControls/TabBar/ControlsTab.h create mode 100644 PowerEditor/src/WinControls/TabBar/TabBar.cpp create mode 100644 PowerEditor/src/WinControls/TabBar/TabBar.h create mode 100644 PowerEditor/src/WinControls/TaskList/TaskList.cpp create mode 100644 PowerEditor/src/WinControls/TaskList/TaskList.h create mode 100644 PowerEditor/src/WinControls/TaskList/TaskListDlg.h create mode 100644 PowerEditor/src/WinControls/TaskList/TaskListDlg.rc create mode 100644 PowerEditor/src/WinControls/TaskList/TaskListDlg_rc.h create mode 100644 PowerEditor/src/WinControls/ToolBar/ToolBar.cpp create mode 100644 PowerEditor/src/WinControls/ToolBar/ToolBar.h create mode 100644 PowerEditor/src/WinControls/ToolTip/ToolTip.cpp create mode 100644 PowerEditor/src/WinControls/ToolTip/ToolTip.h create mode 100644 PowerEditor/src/WinControls/TrayIcon/trayIconControler.cpp create mode 100644 PowerEditor/src/WinControls/TrayIcon/trayIconControler.h create mode 100644 PowerEditor/src/WinControls/TreeView/TreeView.cpp create mode 100644 PowerEditor/src/WinControls/TreeView/TreeView.h create mode 100644 PowerEditor/src/WinControls/Window.h create mode 100644 PowerEditor/src/WinControls/WindowInterface.h create mode 100644 PowerEditor/src/WinControls/WindowsDlg/SizeableDlg.cpp create mode 100644 PowerEditor/src/WinControls/WindowsDlg/SizeableDlg.h create mode 100644 PowerEditor/src/WinControls/WindowsDlg/WinMgr.cpp create mode 100644 PowerEditor/src/WinControls/WindowsDlg/WinMgr.h create mode 100644 PowerEditor/src/WinControls/WindowsDlg/WinRect.cpp create mode 100644 PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.cpp create mode 100644 PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.h create mode 100644 PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.rc create mode 100644 PowerEditor/src/WinControls/WindowsDlg/WindowsDlgRc.h create mode 100644 PowerEditor/src/WinControls/shortcut/RunMacroDlg.cpp create mode 100644 PowerEditor/src/WinControls/shortcut/RunMacroDlg.h create mode 100644 PowerEditor/src/WinControls/shortcut/RunMacroDlg.rc create mode 100644 PowerEditor/src/WinControls/shortcut/RunMacroDlg_rc.h create mode 100644 PowerEditor/src/WinControls/shortcut/shortcut.cpp create mode 100644 PowerEditor/src/WinControls/shortcut/shortcut.h create mode 100644 PowerEditor/src/WinControls/shortcut/shortcut.rc create mode 100644 PowerEditor/src/WinControls/shortcut/shortcutRc.h create mode 100644 PowerEditor/src/config.model.xml create mode 100644 PowerEditor/src/contextMenu.xml create mode 100644 PowerEditor/src/cursors/drag.cur create mode 100644 PowerEditor/src/cursors/drag_interdit.cur create mode 100644 PowerEditor/src/cursors/drag_out.cur create mode 100644 PowerEditor/src/cursors/drag_plus.cur create mode 100644 PowerEditor/src/font/LINEDRAW.TTF create mode 100644 PowerEditor/src/icons/allChars_off.ico create mode 100644 PowerEditor/src/icons/allChars_on.ico create mode 100644 PowerEditor/src/icons/closeAll.bmp create mode 100644 PowerEditor/src/icons/closeFile.bmp create mode 100644 PowerEditor/src/icons/closeTabButton.bmp create mode 100644 PowerEditor/src/icons/closeTabButton_hover.bmp create mode 100644 PowerEditor/src/icons/closeTabButton_inact.bmp create mode 100644 PowerEditor/src/icons/closeTabButton_push.bmp create mode 100644 PowerEditor/src/icons/copy.bmp create mode 100644 PowerEditor/src/icons/cut.bmp create mode 100644 PowerEditor/src/icons/cut_dis.ico create mode 100644 PowerEditor/src/icons/cut_off.ico create mode 100644 PowerEditor/src/icons/cut_on.ico create mode 100644 PowerEditor/src/icons/delete.ico create mode 100644 PowerEditor/src/icons/dupli_dis.ico create mode 100644 PowerEditor/src/icons/dupli_off.ico create mode 100644 PowerEditor/src/icons/dupli_on.ico create mode 100644 PowerEditor/src/icons/find.bmp create mode 100644 PowerEditor/src/icons/findReplace.bmp create mode 100644 PowerEditor/src/icons/findResult.ico create mode 100644 PowerEditor/src/icons/find_off.ico create mode 100644 PowerEditor/src/icons/find_on.ico create mode 100644 PowerEditor/src/icons/findrep_off.ico create mode 100644 PowerEditor/src/icons/findrep_on.ico create mode 100644 PowerEditor/src/icons/imprim_off.ico create mode 100644 PowerEditor/src/icons/imprim_on.ico create mode 100644 PowerEditor/src/icons/indentGuide.bmp create mode 100644 PowerEditor/src/icons/indentGuide_off.ico create mode 100644 PowerEditor/src/icons/indentGuide_on.ico create mode 100644 PowerEditor/src/icons/invisibleChar.bmp create mode 100644 PowerEditor/src/icons/newFile.bmp create mode 100644 PowerEditor/src/icons/new_off.ico create mode 100644 PowerEditor/src/icons/new_on.ico create mode 100644 PowerEditor/src/icons/npp.ico create mode 100644 PowerEditor/src/icons/openFile.bmp create mode 100644 PowerEditor/src/icons/open_off.ico create mode 100644 PowerEditor/src/icons/open_on.ico create mode 100644 PowerEditor/src/icons/paste.bmp create mode 100644 PowerEditor/src/icons/paste_dis.ico create mode 100644 PowerEditor/src/icons/paste_off.ico create mode 100644 PowerEditor/src/icons/paste_on.ico create mode 100644 PowerEditor/src/icons/playRecord.bmp create mode 100644 PowerEditor/src/icons/playRecord_m.bmp create mode 100644 PowerEditor/src/icons/playrecord_dis.ico create mode 100644 PowerEditor/src/icons/playrecord_m_dis.ico create mode 100644 PowerEditor/src/icons/playrecord_m_off.ico create mode 100644 PowerEditor/src/icons/playrecord_m_on.ico create mode 100644 PowerEditor/src/icons/playrecord_off.ico create mode 100644 PowerEditor/src/icons/playrecord_on.ico create mode 100644 PowerEditor/src/icons/print.bmp create mode 100644 PowerEditor/src/icons/readonly.ico create mode 100644 PowerEditor/src/icons/readonly.ico.old create mode 100644 PowerEditor/src/icons/redo.bmp create mode 100644 PowerEditor/src/icons/redo_dis.ico create mode 100644 PowerEditor/src/icons/redo_off.ico create mode 100644 PowerEditor/src/icons/redo_on.ico create mode 100644 PowerEditor/src/icons/saveAll.bmp create mode 100644 PowerEditor/src/icons/saveFile.bmp create mode 100644 PowerEditor/src/icons/saveRecord.bmp create mode 100644 PowerEditor/src/icons/save_dis.ico create mode 100644 PowerEditor/src/icons/save_off.ico create mode 100644 PowerEditor/src/icons/save_on.ico create mode 100644 PowerEditor/src/icons/saveall_dis.ico create mode 100644 PowerEditor/src/icons/saveall_off.ico create mode 100644 PowerEditor/src/icons/saveall_on.ico create mode 100644 PowerEditor/src/icons/saved.ico create mode 100644 PowerEditor/src/icons/saved.ico.old create mode 100644 PowerEditor/src/icons/saverecord_dis.ico create mode 100644 PowerEditor/src/icons/saverecord_off.ico create mode 100644 PowerEditor/src/icons/saverecord_on.ico create mode 100644 PowerEditor/src/icons/showPannel.bmp create mode 100644 PowerEditor/src/icons/startRecord.bmp create mode 100644 PowerEditor/src/icons/startrecord_dis.ico create mode 100644 PowerEditor/src/icons/startrecord_off.ico create mode 100644 PowerEditor/src/icons/startrecord_on.ico create mode 100644 PowerEditor/src/icons/stopRecord.bmp create mode 100644 PowerEditor/src/icons/stoprecord_dis.ico create mode 100644 PowerEditor/src/icons/stoprecord_off.ico create mode 100644 PowerEditor/src/icons/stoprecord_on.ico create mode 100644 PowerEditor/src/icons/supp_off.ico create mode 100644 PowerEditor/src/icons/supp_on.ico create mode 100644 PowerEditor/src/icons/suppall_off.ico create mode 100644 PowerEditor/src/icons/suppall_on.ico create mode 100644 PowerEditor/src/icons/syncH.bmp create mode 100644 PowerEditor/src/icons/syncH_dis.ico create mode 100644 PowerEditor/src/icons/syncH_off.ico create mode 100644 PowerEditor/src/icons/syncH_on.ico create mode 100644 PowerEditor/src/icons/syncV.bmp create mode 100644 PowerEditor/src/icons/syncV_dis.ico create mode 100644 PowerEditor/src/icons/syncV_off.ico create mode 100644 PowerEditor/src/icons/syncV_on.ico create mode 100644 PowerEditor/src/icons/undo.bmp create mode 100644 PowerEditor/src/icons/undo_dis.ico create mode 100644 PowerEditor/src/icons/undo_off.ico create mode 100644 PowerEditor/src/icons/undo_on.ico create mode 100644 PowerEditor/src/icons/unsaved.ico create mode 100644 PowerEditor/src/icons/unsaved.ico.old create mode 100644 PowerEditor/src/icons/userDefineDlg_off.ico create mode 100644 PowerEditor/src/icons/userDefineDlg_on.ico create mode 100644 PowerEditor/src/icons/wrap.bmp create mode 100644 PowerEditor/src/icons/wrap_dis.ico create mode 100644 PowerEditor/src/icons/wrap_off.ico create mode 100644 PowerEditor/src/icons/wrap_on.ico create mode 100644 PowerEditor/src/icons/xxxx.bmp create mode 100644 PowerEditor/src/icons/zoomIn.bmp create mode 100644 PowerEditor/src/icons/zoomIn_off.ico create mode 100644 PowerEditor/src/icons/zoomIn_on.ico create mode 100644 PowerEditor/src/icons/zoomOut.bmp create mode 100644 PowerEditor/src/icons/zoomOut_off.ico create mode 100644 PowerEditor/src/icons/zoomOut_on.ico create mode 100644 PowerEditor/src/keys.h create mode 100644 PowerEditor/src/langs.model.xml create mode 100644 PowerEditor/src/lastRecentFileList.cpp create mode 100644 PowerEditor/src/lastRecentFileList.h create mode 100644 PowerEditor/src/lesDlgs.h create mode 100644 PowerEditor/src/localizationString.h create mode 100644 PowerEditor/src/menuCmdID.h create mode 100644 PowerEditor/src/notepad++.exe.manifest create mode 100644 PowerEditor/src/resource.h create mode 100644 PowerEditor/src/shortcuts.xml create mode 100644 PowerEditor/src/stylers.model.xml create mode 100644 PowerEditor/src/toolbarIcons.xml create mode 100644 PowerEditor/src/tools/IExplorerShell/makefile create mode 100644 PowerEditor/src/tools/IExplorerShell/nppIExplorerShell.cpp create mode 100644 PowerEditor/src/tools/nppCM/Makefile create mode 100644 PowerEditor/src/tools/nppCM/license.txt create mode 100644 PowerEditor/src/tools/nppCM/npp.bmp create mode 100644 PowerEditor/src/tools/nppCM/nppcm.RES create mode 100644 PowerEditor/src/tools/nppCM/nppcm.cpp create mode 100644 PowerEditor/src/tools/nppCM/nppcm.def create mode 100644 PowerEditor/src/tools/nppCM/nppcm.h create mode 100644 PowerEditor/src/tools/nppCM/nppcm.rc create mode 100644 PowerEditor/src/tools/nppCM/readme.txt create mode 100644 PowerEditor/src/tools/nppCM/resource.h create mode 100644 PowerEditor/src/tools/xmlApiSorter/sorter.cpp create mode 100644 PowerEditor/src/tools/xmlApiSorter/sorter.vcproj create mode 100644 PowerEditor/src/tools/xmlUpdater/configModel.xml create mode 100644 PowerEditor/src/tools/xmlUpdater/langsModel.xml create mode 100644 PowerEditor/src/tools/xmlUpdater/makefile create mode 100644 PowerEditor/src/tools/xmlUpdater/stylers_remove.xml create mode 100644 PowerEditor/src/tools/xmlUpdater/stylesModel.xml create mode 100644 PowerEditor/src/tools/xmlUpdater/xmlUpdater.cpp create mode 100644 PowerEditor/src/tools/xmlUpdater/xmlUpdater.vcproj create mode 100644 PowerEditor/src/userDefineLang.xml create mode 100644 PowerEditor/src/winmain.cpp create mode 100644 PowerEditor/src/xpm_icons.h create mode 100644 PowerEditor/visual.net/no_ms_shit.vsprops create mode 100644 PowerEditor/visual.net/notepadPlus.vc.7.0.vcproj create mode 100644 PowerEditor/visual.net/notepadPlus.vcproj diff --git a/PowerEditor/bin/change.log b/PowerEditor/bin/change.log new file mode 100644 index 00000000..2a0e740c --- /dev/null +++ b/PowerEditor/bin/change.log @@ -0,0 +1,29 @@ +Notepad++ v5.3.1 new features and fixed bugs (from v5.3) : + +1. Fix inaccurate replace bug. +2. Increase Find what and replace with fields to 2047 characters. +3. Stop the indicator highlighting while the line change marker margin is hidden. +4. SConstruct and SConscript are recognized as python file. + +Included plugins (Unicode): + +1. TextFX v0.26 +2. NppExec v0.3 RC1 +3. Spell Checker v1.3.2 +4. MIME Tools v1.5 +5. FTP_synchronize v0.9.6 +6. NppExport v0.2.8 +7. Doc Monitor v2.2 +8. NppNetNote v0.1 + +Included plugins (ANSI): + +1. TextFX v0.25 +2. NppExec v0.3 RC1 +3. Spell Checker v1.3.1 +4. MIME Tools v1.5 +5. FTP_synchronize v0.9.6 +6. NppExport v0.2.8 +7. Light Explorer v1.5 +8. Doc Monitor v2.2 +9. NppNetNote v0.1 diff --git a/PowerEditor/bin/license.txt b/PowerEditor/bin/license.txt new file mode 100644 index 00000000..ba835c30 --- /dev/null +++ b/PowerEditor/bin/license.txt @@ -0,0 +1,88 @@ +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + + +a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. + +c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) +The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. +If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + +END OF TERMS AND CONDITIONS diff --git a/PowerEditor/bin/npp.pdb b/PowerEditor/bin/npp.pdb new file mode 100644 index 0000000000000000000000000000000000000000..c1bcafa9948a74bee69ff488a54a0745125a01a2 GIT binary patch literal 5475328 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

SSmyC>VZRqQWK7 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
G2USsmr9*;a1dF1x_zHLtIuw!$m7p`sAF~>cW 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 Ds{;eZu&d~1ZmP9h z8Io!1G0%eU!9{Q*Tn9J7Z4epuz^(9W-FyM=!2Ba5IStn#&8rHh#7TdqR&!-v!f6S; zkZko>b4cg_OF`CMGL(i5U<2p`o4|(91@he_m2OR-q(d^&pQV-cYvtQ&|B?@Hvi1?y zYOSa8&=IpMl(nAv!-kNwR`$`*3G+DE6sG8Ail#CzfK9Nc3sPqB-wEl@waRze)f&P? zQL`6&Hpy=xX|BFK5TvJzoTooes-BPCMPV^NZ?t|MWk7vnajbrx9eJ%k$Elw0l=xP| zExD&En+0oT%C4-XDdnvol-~8JxH6^@7F}p)c*d7*xKJYcjP*APK8vsjS zmUJo!6JaSx9&0vG%7ZPu2g^b7MyQR)^=IJuF2WWbNJZurBNh z>p=r_fD@q;+zw@p-5+5S$a;ucbJ!X>LwU}%1(bZ5g7jzI)H85WKdHJJ>8iGNB%{O| z8G@h(q|0M&(fAFaPA~(rC(MDJ;eAM5H9UgUDfR8SZm<;bpt&>1Hw=2frqB;Qfux}d zPcG-^&yJ~Q%A_7t#O@rDP3n0o7zg8F0vr!XYqh3X5~R+lHKX^!5tzS(qoC9~;-%I! zlX4>M!CO%7r{IQK(`*84g*gTC$d@eHq1G^+3ZpPjgGq1}90yb3N;n(J8px!LVIQ0a zKY{aMCR_w1AE^^+jkBfDl>YkjPwKfSiLZJ3Tj}+=1nf=tZ6I|;eS25xVOh+?O?~Tk zCM=H`ztuN?rT$gIyaQH&lKxd;E%*j>fz%VVR%=}-;gK?}KL?_o50UT`#g2SeTQiQ6 zeO~D>4C8zcI0?3gn_x$n4dwTHkk<;H##4WOLDj+h@x(1dZQLCW>%)am@_96LhjSoh zOPdOV;WRiDPKVTe^{pxLQYy89wAIKP!+OZN`G()%1o#*(h7wQ8kLg~zd`DWfx5cpw zL$XP^b%8yggkum4g8d+Ukoxw^Fi6{|+Bx#XKwqE*K}qj$DE`WMlHL(e{FN~2_rA4* z>`OY7hG|GP?(<7^R^Qr|axfTkB{&3DfrM3tBw8$N4ilh+vlk42JR)KUh5j%W_JxU% zTZM*6us@_sYQbRa0%!*I->KylX;UgP~_<9)~c;iXQg{*%5;^`AdM=|68l z+H&m|7zy(rbycJ7GmM14!f}wcLVdG_v@)#1`~XV*eF*nL3&Qak)Zn+eS?X~?%($%; zhIe5RDB-=0^!uXfeyN04(k}bbtpjJHjtu1DFM!;3?P;o`;QK4r~ms!6s1R&=g8P z(F_uIdAGtq9HkFbYqYn3r7@HDD&DRftKS1v_eLe&g|WjuwYBDF!oYo0f#96gR=$tKen!;tm){=!n1y8^pC9h zlSJQ#WKBl{l=awTy){{DP1abGHPvK2HPbq3vPPr%`geb{R-&wvcz;vje_5l>e0@4u zLouB&$hvfdTKiDeJCrp%WsO5w-%!>zlr;@IQTg((YxqZN8p?Wxvi_i~X)5c3%G!UH z5%j@mG&+HM>F^@b=tN$&?qB{j|72ZHS@*9pgGE{2vlWze|74v{S^Li(e>{-+8i2Cy zr>ysBN1c#$0PXS91DUS}DC+=bgi^kcY2DI4vksvDR@Q19L%yLGtpzCSvB`RXaU5s9 zCSWV-gRBeq@74tTv+Duc8EAu$4+=xcXbMV08&L+zLOCc86&gqWB75Y7T#-MDK*?wd z+KBd|6DSAWN2c}vT*u=V3PN#62I{FO{UU-}PzEwz`!D~xe}87pKUweZWo!NYUtH&J z<7Cnd9Yv<~{r=tBeg?`$+7!l*XfHa7&Y>IVAu_G)mw#Qqd6cb}t?B1S`HDm7Xcw}- z&f0kB9P+rqnsg`yrK4Ra8)-LL;|+PCM3jb(qC!9M+dtbsDezAU{GUjHLWJT!vi={- z@UYNXugLJ>YW=@C|E&M_2Wu(*v;Lo2FY);$UtW3nCG(Y_{#pMo|4MSk<-`72|L@PQ z^Tet|f3FPwv;Lnu>n#o9Wz@fwj{mIxrxwWiXZ^qD)*jBkZrDHT|NXQ6-(Oj<`k(dx z{>=i}|AqDco?Bv=rN^IMM*OFj{9|1YE1SyJ%s-ZpX9I#m{bJ(+ljEY*x_vdU4=QQ2 zZx@@G7#ppAQolLyTU;smErj<@ql4pz7=JUZA?T{yd+{2AF8X`AM>$5e@dh$DDLzIOY~M3C1vJruSbb>E=QWjqeGX;^0i0%NBto z4k2hh{%(0b4uirIJ!8VcliQ6j#^jabAmNm2;d$KXiwt{lxNn(-+dQpv^l&!id~OfP zJv?mz;k4r>w*}L~Pm8pR3*j^+wF>WZ;p9})_L}VEPixcr%-n9#Se!1L>GT(-aeJfR zDviyxGcJtxf=Cf#c{DEwwJxX z_Oj<%U-iAVm%V4Sfrif7;`YX(-&y2VK9TlthhN!N#~c0U-j8_M`)DtFKjKy2NBd8` zHzD8XebM_nFMIFoW$%%_?ENo$`c7+$-wM=Tcy|8&N*js|yBTq6U4QPqQKnz?p4ZFX z=X%-uUoU&l>t*koxZMzcyVMRGWYs$_q{gJso`>&6IKTRP4KI5i^Htw>c-ebrull~j z%idpj+54L>dml5btfbHL?+v}|{j!(6kM^?n%URR$gC_at+Xh$NGYkj{J+nfncc%-kFjL$`~LnP&&S6v z&+MEzGtWHp%$zyT%ml!ZN3SzZod4~*+K(O^btD=Sj zt@HBy{eRY8-vOUr#Ge*^-4MJlcK!sPt-7PHZ+uaE9mlKaO!d0dAI%Rhxijp+=RT}h z?q|xq2j7;_vFLSG*LVEe>)`gXdi)@#Z~Ty=)1TilW^Vh1)`U`wWja!Rs`~R!Xi4GT z`kA4x{oLemC&T_7@3(T>r@fBj7Z$(W14n;Jo09g-%17o*uXUmQGx#o!@sgwUl3MFV z?=evPs_P=P*3DU1{Hp7ei&=Qp^)g!P>9p3RMzj1^UDu|yjz(*}jMh3zt@Scm>shqc znQE=S-o)y+>UuY=b*WnGueH{tYOTxGT7Rdt4peI$x7Ioot@YQ=uH(~MuT4&oj@HF! zt?%2~iQ-pX59sXrKCN})TI&b3*7rHPu3T&Vpw{|vt@VRi>!h^Sm20gl)LL(@wLVd6 zouJk}3|i{}&v&PKth!$BZA^0LbsIeHNLrX$dhghE(@GZ)SoI;+xwG)VknrDX^*$Ta z?r>ou4pD1ep4Pf%t#x^~ zYQ3|w>++mkAFZ`NgVy?Jt#y3Pu8*D)MfKb7YLi~~L~n`PSKM)y|AII1PN22kR%@N0 z*80AwOixT6ncXfOjW_up@o4?di=B7Dr{9yFTXla7t@VS>t`pQ+f2Xxygx2~yt@VRi z>+iJI*(G8^z|ne4t@VRi>npX^4{EIw)LIXyweGJ4dyjU!zRyp>d>EfULo=5aG^*@( zz8`LX2$qV0G^O(vkfs)hr@2z%F9G90d=8V%ZH~Z%8_hdJgXkKDc*KtcqB~;iiv|HP zKf%_yg##yoj|9@35meZk3LFi*pY!ybSP-9QWb=>o9GdH)c@DZ_5TBki9td@0>k|Ee zNSpb)BW<>BzzD>v8e0cK^OwX^`raTuKS)0O5~W`U*b_uo0^%Wvtq;NLA6p-SrbT&S z_vhnpK4-_~^5}jSgk^x}LRqYo-UC24Ai}LMqip?CUm)CgnP2}DAj-nlK~X+ufXA~X zxRa90wKN+D_e1Fs;N!qKK+69J5T9dXb8qx~ydJRq1?i`Gh)0Nft<8Z;fP;ZB^VSgH zav;fg1(4E1xx`!-J(J1f4qzOJu6BqA^}@Uz{PlqbU~6DkU|V1};61?ZKo20~$kvtM zZ!5_JvSaHFP*?1E^lUyy#p+aDzt9;gqOf%ndLX8>tQf9S`IsDif%M!VKFG1y^ z@WKYN|8*-f;)Ak5b3nzQ3eaE(HVw27SJPSmalX8ke|6|s_|u{i zmHySv`c{))^(jy}r~wqTEvP4GFeo0B4I*Lg1eJoWf_lcoHyE@BR0gU8rD+A~2^tKF z0MXioWS|AK08|8`wG6v~2SLX{rJxEBt#5Ea12KTSKqEjn?n%lAk-rqyDru~#3GE=GKe({ZsVXQpde5@h!)Hhg7$&Vf;^!dTk%Zh zyN(H8TH9bj8sslde&XaGE_}mmB~d8ixf~ z+d%6Zj)TfU?h{eZplnbf=rE`p)E13)Fen~02eb`z6m%8j4kHr*ngQAdDkdIZipqd) z(7zy18u)DB0^nBAL68-7dKOp*vhTj2He2IT06ok{y&eQE2D(5G2ZQoK?ub_iJPPu| z-xkneP$?)a70(78gwZjiBcCAUx)-r-;?ybRDGBMpfOr9;LD`@Mpdt{hg*gsvkc@Od z5ukif0f^R4&^j4fJ3;FvXq^PDnW6PEv>u{>egn~Z8Ra?|TH`}&WyCrkS|_7k>qBd1 z#CjjGcINCGy_xwDh8ba^@J`fLwS^!!H+5svCm4MEI%0YEzL#7~i zkk(p^b@*)uNNYWY=fij=C;}7@$_80M1)w6(PEavOxgNv)5y%o03Q7i9Knp3Dwv<V_H*5F?9|Ig3Nh`YTG;PyIz^xV9J3`3M9FFD<8@QxcB7?)tl$V^F! zOV3Km$V)bLf@XFK^ohgiNvSx@(7+BOi3>|l$}#7fQ!IwDRTKCRtOHOsKzlo;#Q+cB z3~$>z#VuYDK#n_4^*qcSN4(`5$p!oIQ1t^CJCooEQ146J*aH)z>h-&SWR_nJ)U4N#aih z4MKf+%JHkzS1uc;qW#Iosa4TK#f(uUJ-l^wGsrcVmqna^Hc?SFlFg%>7w4e~-~T$z zP&iz)&th{R_PUe2QPv`jveKC<6rXexYHzy~y2;B}*R=)vR;{P=%lcEqW;hGT#UAD@ z!j@x0L!HFp4WuwFUGCTobL{*qEU^ZH$&jB(M`vMDK3G^7KYSKE#ic4Gy-&$VNX7Iu zp3%tlINHuW=<1XtS$~dk8ExeH`=g3aWckE*bpHEE&aZ<03Lp7x$bgnltCo+vv%c_& z9m$uWs_&$h@0GK@@LE1`T0Zj5`oe4Zq&w?-uH_@6<@2TG+jXma%(Z+@wS4_9uzIYz zhy6VUs^6-v1Z+pQ7%I5*^NsqWC|Gc>V{H9(fd>;8(`wWwR+jm>* zY>-=Z)IOfBDkEgyfaH9A^8%UWxaw0xGG^)=R7Q=;V~ zthE+FYb}VgKEH2|r25*I@kr*535DTzc8fAT9q?#NyoBgUyT3a}5X=^BoHjkLF4i0fT^hfZ@P>!12I0foZ^E z;Qhb@KzhGB2z(TH2>1l>FmMBq(%A{z0elVkJg^w}0uXT|{AN7{+y(ps_!97I;8NgO zU;*#~a0T!$;7Z^%;3{Aflm*YS-U(a_q&>CQ193hGJM#puiBb`GEWejF1IGZj0C9A- zv=x{L`~XPvLLUN2K2{K)Z(#EfBp*zfk?%3PP*zqiQ-DnnV#U8Uz}Y~mr-y;4D`_r} z>I-f}*5RC|`hxo!J5vKLYF4VJ8NdYKOd!p7(0!DT6Cgepz~%@jAFU8}6hs$Z*sX+k znYY#f4g$IWeSj2iD6j|6ABZ^ETSKz?0fT_}TSA_!FiYeM&CXm116 zUrav4(xnDcE6~mM4HtWhlg}>s=#oD!`O|vhzBrKZrLE*giwY&*SmEjM0}8*~C>u-@E9@+^KY2i2MF*e}wORm-V;s>vUcd?D3-kmdK)ui^t4 zG_96HAIMmQx19qyfRy`E7lSVW879@2Xiw_4FlIrZXiz?AF=!oV2dEfS0?I&I<-j_S zw>!uS6bgz1Wq=AmMWEfF!=U5ez~353i!=N{5ujuc`87K7XZ$C=jBU{ws(l!5=D)ZD z_Tn(83}m?60GYgf{hJb~gT%+)LjS+8gsg;AQx0?gyY2fIciZ>xw(p-gBR39PW7og~ zt&;oDZQnom17yYJn)7m!Ox5(4Brm+Y+!{#UY5yIi2g7aOzo^^3f46=As_D{VXX~jB(xfLYOxfA4{_s!QSyGF_s`z3ho8X;ho?68R z%XYJ5s6~IPeT>L|X8`<@ybJH3bd5$+T3SL@a)v3#-PhMRT=g73zZn1E2>;j+Kg>sB zuCuPIr?@XKYYO(1P053+sLAp-_qu!Hy-_Y_2~FbSN&s~Sg@cBmoW(d))=@d*bCVJ> z5^@a5COiiIo%jO<&r7nHbGqSHR(?JG!7rKxkjv)D%1^$7rObEGu`I;?!MmHv3HSr( z&wD}LkT1`+%6xGR^YMu?WhIB3E$Jy!5s&#V0>wq|$?|32d-+c!DE2_E_qx`dw> zrc*2VES4ef&!T`?nQ6(SOyuJhBkdNFF=hEEj|+JoYD0#Uhe={@Yo3SZJb`AwJ31f_tLsqx z=US3|d?uTydIygf7mn`4a8FMbh!$f`N>GLmH4OFf$(6HslRVn%pdp?k>VWc;$n%uX zS|B@b742Kr%a({+AeX`EJejjiIh50h_f?gheU{3euPg2C`4YN8dSHw&=aQHxuPHpQ zZX_^VO8E`I2M`DH<87Iil2jF9r5_cN)UIoLe*5EjN;zhUy5)K6f&2+M1|Y5jIaYeS zx`HeH$nvI?X!T^;S&>IAnfB%RE@;j~O6UGU*090AOT%H4+6{ql69EU-O|Bx;m_ zAQ!Z~5;;B>sm*?2e`|l*V%dbrhAM5xuA_39)a_eY#&l9IJd48UKKeU7#A3pCs7m?U z$Mc8pT+ZAm{&Wo10@$um{NZ3SSM{&F2678g}>mimN`TGune3X12Pr8BfO};v! zEeW}@wjXHDBf(O>!+E|vTgs17=6f7IdOFT`VZ7r)1I{?4Itd6sitJpWZye92wDU&Qajc@cjc=SBJj zs`ziI;(w=#-?mHT^g}o=(og0*m518C(7#wRQn)UHXbAlss5A60TaK@`pB8g!YKAFV zw(Uwg^>?b!+G1ENRgtco)4@^nONp_TdSms-we^#a- zyyqc*%Kp!t1d9vBV;8ZXIg)dwt`EYl#1E~uyxU;>pq4iaQ^~tM#Z$;z=yDm)uTtJ8 zoRD{=Y^#gGBwu~mSGO!IoELE-bD8HuG^k*dsy}BU>C+1>N;RysycXu z;wkDNhuf1Gc#oq?SqG<_uLFD59TmsPx~OiMSUg2t2z%4rz=}jZifljAo#V=W^hrS=)SHX7wAjLt2LX8NHnFUXCV!>d|ePGU-te*`OZ&y zdYJ30zLOkNDX+T7lLL8)E<`OV5zgM6XH|bPrAodX$x@x~RXpFP9OV1f)UzmoQ|eKz zvZ(dqDPER6ovYTtd$2DK>VRj;ZXVQ?Q6)m9TB-7Db#AX#*o zGu1@dzII$Tr<93?M68sR?vjnZx~(hP3>&*qS(SPw%IZ{qtSIX|Ue_icr=*O#vPjdPBjqwkTjqo3< zs5L)7PkhOUL|XA8E!B678l;D>8|3dTf8VInomGoe3ZQ=F7>N32eK+?0QaOu0K8nZ5 z{e}VY#pQ-SEVB0)WGHTj}YLrnu)}Mg(++ao3@0rF}oGt3->n;z0{385gne$~Rkq?5q|a=J7>~O2l zdupH@D~mCnx@ttYTq9I|q(OaD1W;VmN6GTCepw={A1M`p#4dlsDsMMIrl8ohInr&qRA0l%DR{cTi~EBDm8a?g;e@c zQ7iveon$#%C!!TsX%s?`_6UyZCZ{HKV^30}e(VvdJQH;!zBh)_AXZgJmtoVi>qw-l zX|wGS{sVROJY-iO#vzI^jS+jlm~t$}n%k}rjC>$k^+c)C)TtzIGmTu}ef>iG1IE}b zCOLqJ@8w0z0$|L8Q3*AZUce5pQ&M*tR}Mc+|fH8jmJLr!#v%%G*b>fqS82q>Q_BRqxx5l(I_5;(SAq9=*(>V$?m1^ zUu?`5ZkmEVp7lwGke6z=DPiL18?mPSlYdm&A??=Xe1g24RlX68O^iu{V9)4MwzW~{ zha9xEN?lDg`XO7Z`#0Jg)kC$~T;-ChtWxD4|HE~_8Y7jXT5Yj%R{y8UL5)k+oGKhhc2tzIh)&4v~%%ZTguzQLOhc`%FG3Ir1x4jc9WbQFQ&8M zu{>6^&$lXl@eH=PSM@xz))+)N-cZh$?}T3iUCO+N(R*OkygS+dic(as9M!ecN}EjO z5cY^2sHZB&In<$cIfT+z*B&`np6cqOQunAllhJnHbMVfTYO;{?$>@twAx z*?GBX%&Q0KP}xZj#AW|m+lG?O)v}jI{p6I=0V1y95v(?y$48=4PC;_w|?W z3w8EBFZsTq&fbT5qI~vq_CDAjy05#l_rboh`zCFl+Bh2vWsCk&_LZbPm)W~eHa(Km zSZ>opdA<+weA5~nx=3*;-vzxL+AX%~3Cq1$e%TFG{ja+++t5ZM*d`+Y*@ z3OnxGr?Pn1>Mw=fKQHc4>%GQ(?p&X?IC~%0r$T4%MD}!O9jst`QOzBwE^`& zoSky~%GvPox#_Yw(s|r&yT~@mmt!5Ge1t=1bZe^G%A_1qg2hCSPe{x#1!bgG>H6s_ zynS3X!Whoh5=J7u-!k}N1M@m)C|!TB?sZ-n+szhB|J z@ExDnSHAyljEm^^w*4ye{W&kz0BlhGKE_LqFVf3Y@m9_Y-}Hr?7ryC}psPI`=)UZ{ zAsj0mDZbkK1Ux2uN8n4eB_S0{-=qEf&>B*ZzCom~vaPr18SEuO^qGcHs0>`$=qpL@ zCIFj}Es@Kuwk4IbfcT_ym^!dsq;s-->^fJZp>tY(Dx^y^_M~qC>N7hm2usAg0)Xiv z8LxNX|CF7RG%UlMKtD5GEXFgH>k#N!6xXJoe9Z!d??ha>k*#0jYaB?oj`gpsTTc(D ztUGUVUg*lZoEN%6z6eR8E){*N!qKPtilWjJ@)SWx=LSJyS- zUwj7H5b-WsCmal}hTQ&Lh90(n9vTKRnLE})Rzz6`GvwRZ|D=Pm-0eDOy#+c*y5fSg z9qAkCkkWsO;;vNc6}|W2UJ9o^R;`Dm^VCk1{#F#WPNb158(_M>K!j0{O9aFwk#Q5_>Jwui3|to=aI$SjKpmk|o<0tBia$oy zCq%Pdq)&1g?fOLZEsxt=Tq&Z9uPnDF*!zL_Q$s8B(JDTO^YkrdzMLQOv9W!(cDbgZixN+TI?lZfOoAJNe_<@Z7!^RH)UwJP9 z(rIctx9SWbtu}H%t`AA*{23Mhn~HBO*MY4~d2(Ky`81OAIV0sUOAhBNASG&p3pj5; ztrEYI^G{(ui+Eng(pJtlmg~*Nx8S^37v4;kp)EfnRD7O_->l$id@sfZ2P3IwE1wBv zAe$`fy4ohIkA$l7eoB2hzhK=-k8W*!lC1jkc1ZS#_)(k}bvd2$;!G$X{!SGUE$3_r zaz^jr^MSQc)&j?6Wk*8M*r&UE8~a~x|C^Vuu4}shYER4;!q&#>+QV$^X@Q?Do~<2s zu!r@hq_x_^-<=Ufa;ARk8f224jV)(bTK2P`k}{?-S$)i9BhG><!j?mxdfn57n;$Z#49INt zq<8Y(@Gn}S|HWj1UUxWW!ojZZHCksr*?7WB8JC{MSQZUHuiI6YS33RO{=P@Hbb9rb zC_0x&>r5oAvyX1onN(V5B2DT+`8@jjqO@0cl&x*CY;~R7-TT)|(ycnfDgX;I^g83j z`QNUq{phh#r&2ooHG8?c_E`lcCCeZY{6T2*(vJ(@(*!fLyMas2-izP|xERpL? zDE|I&ZucJv_bThWW6ieAkB0s(Nz++A*B86Q`5Y}B8a67{v+MRxUX`S&T_}D<->AK=*?JWf!@kY#Hv6s9lB9Je z#*cV5+L7y1x*Okolyf=On)ZJ1?r*U7^JogMde)QHSyGFzVTN9}xYPHO4~;H~{pobA z-lM;B{aKRU?@8gESNHJWUJ~Ko{QVnCA_wk{(LN(<3~Se?u3UU-eBaFB7dwZZpH&z~ z@^41z_?B(kbl-LFQ>l|4kz9Y$ACsg}vOMdZn>*`{tX>~I7Q6QPkb5@byBr2;dR^3u zai{n0+SSBo=I*$txYLh8&KD^>>tN_pZ>5b*>A3&3>$yF5WJuDT7{KXuBR8a)^S(Vb zShw)8C*GJm3~6Yc4W)I~*1G1DPQQ!N+&1Ii3`rW6-Mn=6=0JRpV{)kXae3F0WySu< zO+4>e^VWMP>#aIVO6!b{TXmL{)|pYSuy*mP+xU{X@#8-A-_!rG4l%XyMs9E=Ioxk* zHfhFlOPk;Su(Yb<<-0O5*JGgYV}Bj7+2xtQFXK@!==gEA+oX-hKV4f8=`-`KhNmxjtirhwEWF*Fm&SB#S3h}Hr+0U) zer)W+lGL|7#eeSFmW!V*kN3N)*4>MjG>Ux^=X78~RU9nvZ+G7JS3=HOQa{HbSr4-t>*G4-UAva`m!<2L>F?h7GID z>UYjlWz(j1Ng8s;?CW2(|bT<~>^F%^CG2P_=irJQ`4w9YisI(zLM zWp*oBx#+6rFEv0*4a&3XEZr`=F+B)RNm^Jjiz;G)K8(5 zPS4$sv|QKuQsJxZcf{`a(i`Iht+NwHhEe<*gAUg}u>OmR53^Ec|G77y6Tb0xrtp|W z2hYBt3us_`W0G66uIloPnTRV~TJ6 z;MIhgKP>b4Xx%~2l%Qk9I41^W*6XHz*KzrptoNF{Q2Rt?wAA`JNm|X)`Q^DooqoPN zZ`0i?-TlvgHg=LEeapg6ba%`hK@t63IJ~fU!3tQsB^z*fjhwABG{_<%1-)Hyj^vBG{B}wb- zHLbI-oIQI@>x?z6v(&WCO#6#Q@aGigVLQ+`hL{-}rdyunZOh{+n0(mSvY-Xqxi#gLbC9&hqk zfA2-7ehB%b{-hC-^pOX}Pp*i6I&sTOsfYgz^PW*QANKh$v*!VG?(XGN64%8N-uwKo zqdLK%M(Ye)t+O}(TW6pZGduHoi^xIke&1XC=YSi-_j@dX&fe%v<-Oz`o|iK8KuqEX z_2;b}H4pZoHw%BTLv+ua(ns6Q8SvbOfjNId*UT(@=$?5=cOG1QYWzq0LZ0b25;FU@ z&qmWa>rCrRGp)1Bw9f3sD}w|PiTz$B9sVAHd2vFRCw4&%*jZH(;P}3zl0W^8co>$` zSySxVg?I>(UItU-s zIglLrzK@vKlUO|}<%sWoRs>5A0x|59EWkiu9+zV*{^t8K(z#^peoSLXp&+{Y*2eRI z{edWpG!W>=`C#Bs@S}jfK+;v>qd70?neY3@_Fyc-Z_4~FM>!D0&Y&ZGMR&sLdxfHW z|IPbbq4M~?e{B3s_3MXxx*(jc1hk8Kz%(GqECWd8&jj8F%mQNQD`f-GWl1@}w}BSm zN5Fg_hUwB&;19rQz+ZtgfcQK~!nb1jmV6zpBY|^)Nx=EQ?ZAb=&w-BuOMy#)7l8%9 z%fRKp+Q{n)U_IbUU?U*5r?%b+TnlUiTnFq5+yJ~ExEYuM+yXQMw*sdFp8{?JZUcS@ zd@CD#`;ETXZz+J#zkku%P{2F)>cn;VX2I_lY67Wah5?~qd0Pt7f zWnek*E>z@Sz;NJI;B?@1;3D7+;1bT$evrhIelGy=efijaeWV{4hSAxB>~cYSpg$S| zn**BwI|7>lF?^9)1JRbHHo!qVd?@fP@Wc7 z=P{eCwyS338*0Jy5m}WU1W)|~=_TFo3F3R%VSXR>0A;0k?jX8~8p-9^1jOrsv>7Pw z<9o}oJr&gVZEq~!_bd>$P1*qz_x=C;JZ7Key}FpsBI!pRlpl7UUHA^p`iF9$D?)w; z(r;I|efGoOd@myAqo(d}ee1~mq#uy_*%3g}vynjbEz&5UkTc)wihV1kbd>d)i|0|k zsDJ1R6#WC~gZlZ(`#K^%@tuJ5yv{)Jy#Mrld|x9vr&Usy4>rPzU?~0IEUm&;~Zb$Rp2n-4ItS8RGKvbPzy+7k9xq3zy`qQ zfbg$i@+ZCH`+czXsI~*x_KewqJwU4O*MMY?_Hw!Wx9_L1p1ihS-j{*$k8VYxF%(^I zAfKIqZ}R;9+wuL#XtMQu@;X1tPZtEijf!3OAs=MdOh8OQN-4k*z%(G$+x=ah2UCE*0P}%2fK!1@@$6Z^mOwOKE0zdIvw?6a zl;!~8${{@p#AiMU?=ebAjkftr#0fD}fjbNUMP8 ztEDx-cYy1F=!>N-K=idNy-UFD;K_?(Cy>S!yMW}cP0u5{a9fVI<@i6PkI+fJE{?7H zqjrtqpzVD&8uk=HQVh@^I2K6buyMe-z*r#DYyADcln(XVe4Ut-fWJ?;RPOH)X6=OV zL|`~D2}tEA0`c`!60NhM{)xsVD?xMxpuE&S1p(85n76Pl0%A;WT>%USQrrmO0bnHX z3n0m{3`p|ph;+vT$v#a41_CDm(|I`FndrGzj7g;w;6uQ4Al`wb`+<~CvaNib5gljD z`g;sjrNJP&Xnak4b0FoH#?3VU(GeH`GyqX%#{V1X#bXWen9HS{ehUnk&stw2@vlB*6To&+lo0E_|r*Nyo*VA_qNupB}u_Rvb$kG zDi75^UthxfT|Du8{IiYYHzOWcc4j+`8@KZNSij#}_VdsoeY%gvg<`ylF#4#A#Vh;#_1pIH9G#+{@`c!yA)l)-rcQ>fe!$e0`U%SrL_i`K++3pgWUI<`GnKGZ4h=AL{~oIQF}pNnZ26^3;{m_ zNaGhPkmjRM2J3R*T;K-a)4*cjv%q(N3xFR27Xd#9!taWWSC#_ZA-`onsF}0^Nb?(y z0fT{$15LnHK)jnug}_|kTHtcv2H+;(Mj*|9Yyutxz5r|odF=v@1?~n;0KN>Qa+iX* zuQBsMrgGDK(0i^PM1$+{C8u&EuTi_AkIba2_6bPM= z&I8v2e+J^&(l0=~OG;%xDlg zfX9IbAjY`Xe!wq*LBNy1WZ+l8`+;8rF=rup<9Ty|=rdS5rhLB${##%%5He@&74^*K zyM6+~me86m)-Ex2wg!TS{xkjf6*v+66<|CNdA35=q%fpUa{UYZb3oW!>#IPFxvkI* z33bZaYi;1i;OhcE2i^lb3nV%H2y6(X`nUu58xT6c+H(_NUDSmhh&ds4ALfAAeVEgc z+z{Rs*aFxccqgz25Hho34pwRd^a0ZIh6Cw&p}-EnC?I5N#aKmxZM0%+LPuO!6M>k5 zu%-g(J`0fUn+k;NtqXv7kFhQTqAglC1BU{)0|S72fv~OCw}8We?*Z`+Vf_wB@{;Pv zd|lvZ@Gihepc|0%Mx!LVh&u|0i^jc;zt6v03(1~fziMxfeFB;fT=)=NBMx8{jlx1#l+t8qkV= zl$VErWd9xkCIaUG7Xjx1R{|FTsr}Cfx+1@ef#?IJB|vxJQeY1t@?h-;EC7xGt^ke! zt^}eFk{$=<0SkfCfop*Cfv{oLiu!2piRfd^=-)uupgEvo6t);x4y*urC*${Qlogl; z+y^?9gE0$)U;!NldFvWVrNA@@eH+Lv3w39~X1bhLoI~0B=$PEgUpMiVu-0t|>B@^iYV?h>B0cZ!v9pQ(8XF;SuZ9(3k zSWrGF9={g=7eG#1LHWdk4uZ~rDnL8%jDw(4pbC)7Sd8I7X`t?qu@z{|gS>z{K_#Gd z;78!MJ-~AC$AM)a>iG4OaUUoalnq*mu&opq)F2jh2eN<)K_v()29|)3MvMbf?S|`BS6`p zm7ro!DX1+B*yf=+-2L$3@o@eEKXC=Qejngc2X?F1bJ zodBH$Re;=Pq3%F_plDDsC?B){v=UTIf1ifV0MCL7@%L5WHlY3?JP+gr3IfG}vO!i* z0ca~|H|Q|v1gI2L0lIJ+_gV2wPy{F$ln+_}S_j$zDh8E+&VtH8b!H>4Aa{@_$PW|? zN&{K4YDxLP1)z1H9iV-nB{sxuFA0l9;`K%t;GPzGoQr~p(1 z+6_7kI{ppv3oHXsr=w)K`skXZcum7U{EM17L*2B3EB$U4LS@u0V)GY zi%nHMRe(k`LfW8Gkhe=isQ`2eU@bEdq@x2wq^gQlu?!hOM22R$QF*|4M@oOM|p`hn=@*XMp#HxAhn4kQ*N%)8Hh?s zXF5u4)0}0(#$C>~4SIZyZiLaoa1dvhDJ#$EbmRt{k%xoma{2CcPN$(1D|WC*!CviI zNzU~+YDxod&C+;QS;L1~WBK zS9UurY-SDa<#r;DFg7#8-{286E+o8PUtoApa6rs({9!~$(CBed^k+;|uyKG_KuEMP zIwUOE7>%&#kl3(L_Cr*3sNnq-0Y+m~bWosioPT(g5)0^toY3sI68dT=*X~;@ZrX&aS@Rr;nBmQhV-ErV*|ZCjWH3! zBmIMdhj`|D4)kP+#)O9ijt-(UY<~?OX7CsmWbgRMD4zL{WemwtN8XSmR}a_pL# zY-A@#8N)C{!mt)EEBI#U;!69Ic*B9Zwv-0T5@pJnjF%H!E%DpsV9YhhznRSsgqibl zP4K^~>)Pt^s{85rdMZZ*>_WQAeS^i`Jll94 z#0*0N#D5)eiyh@5JvWeTEto7npPp0oGTcF7^vt~)&m7!TzRMj@8`K#@+k7k|o&ct5bOh2^iTNNKwJ%I0NA}Z=W zWR~hV476Y<{=3BLncwK+!~bx)ZXZEf%DNTLU9875aJ2-HoJkkxx$&y!3K5e|A&TvC zBwyvTNWQ6ZTDE;m2S`m_DS;sNKl59Xbl{C3j}XkW%JI|C=;)nBZg}`j``M@_Tw;$J zeCCj{0?oK8jJ?{!7~h`+4hDZgT$qhv0uMR*9c%Q>K?$gjSf)oCS}(Lt)%Vy{Xb^*nYroHTxdx<*A_elA4hp11g`L<0{YXv< zqiSJcv|scm2ulmd%nr=UVPX3eVYHPcwaGmQi-nO+8=a9n3@?3@Chebk7U2thVb5^X z6+MIY^b_eJsx7_d0k}89ltuSZJbEtKC!G42YDu%_Zyu$UnwW!a-&y*!H+4!c_>(8e zaVY(JQE$2F)7W^1(xP)_)nOEm<(FrcbnZB>yJdI=@h3Uo8+jwX_HVM?s53<7n{Yl8 zeFOd8hVx7L{daR-q}P-41^jn!)$fBj-;~>pVXEIlRQFHe{0g4lMiu`o=bQ2L_HzCm z9{&jE4{`pKiodAhudDdBzsvFv=?~z1Oa8nV&adX_=d0o`_Q zTz}eD$oYGW%d0QvALPFWa9-qZ9Oob4zdxk#J9x*|2T!Lz$q$KacA0~6kj=(qx6NM1 zA-=f&t{gYB*JQuc{SMjN9Vi2pNo~W65KcBSEr6LwW}B%m@C2pjM&bQG$zn>DZRJ*; zhOn_DE7})S$VS*};u8~cST%{TNAZmGtQ2^y$hL3PpR(?XeG0Qw{0z9d>{wsaTgg)Mzc+|PCWL(U6bZv2;=KM}t@=Y{RLoAV<6FwTqe#Hsk@ zoL|eI_Y~*XbN&;~3tN7Y^P+q|abC3Lx>x1=30vdJdC|7SI3lARNu2q^vGEU$v)e!? zJ>~e7+E$b)Atxyq`D^EQSa%i)<@FO8es30foXvV{caw4OmDP1#8Q>Q@qCFo zJFDU^ay|+Di?R-n@_e`84{Zi)2OT75V!X3f%6GWglAbaZFO-yVTvUgI4lal9EdQ{E==IfHnEoHF%0bWz@3^1?gS>N=D+<@rMVe5|VH_1J!3XZ6S< zN$q?q=1}k)<$OYln8)bIvcmQOp?6~pr=|Uf%l8MVL7vRnrkn(P4xe}*rL4}IT_5au zD^lc5DN`fN1EoPSqJdf(K4d^KHyi<;^%%soFPcEriZ)9ub%V2BA%6#9nj*P=?6KOI2!4dwkA#7vv zzBj8QNB5wL!nxjV>n!JHB7k&u1Zc%jyi?ArMQzD8|8~;@T5u2Pr!#e>oGYU;i@6GK zcO-`EArOt}W`JtJ?v%)~uVi;p@Rg1-h;d86RLo){YL#}P$dgUp>bVN46E?o&wpW>- z6Ffib5r_0|4X8Hq6LF)e9jug}@PtgV_3Cz8-TYt;wUnJZjio}m`mFpssSf%M%Ac4k z$>@rQ;KCXvjDxXu8c6+1nS=b9v!d7=Gv&#TZsJ#U@>F6QGe(=}L~F7y>i&kpXx@O@ zcsfQSqf=7Y*u2k`BwGbvATky0VAeDgURa7cxVb`15hS3R$*5sT|F@ksez>BzuZa^$~&i z%6T{n%SM=Tu7v7j1j4w^g(c)i=TkZq9)xg~rlPJWJd}rLCghJxPo~)$l3^p)420AC zQd&?FdwxFnG!!IvS~PqFWI3N#$*}=ILGLycj#y#=;xQzu-G_UZgje^Fohe6+G#UI2$tV zZjvHfCkwwqd2L^3Z|F^XmOdLpu#b5(EEsGb!T9*_P#7F)+lu*FmY)2d7$?+qJ;c(Z z{oV(mj+A^KPl`*r)fUec;~df%(k*J&#z1o(wOFOT(>~*L-21u$=p#-tcO=^pFSnMEQY3a!(-j~$aW?zLJ z$(B!QWo?K03(6~{&AS$s-|rOprTkx2@!gS8(kG$+1353gZH(f)__mSAc`?q(Q1KSd zi}Yr2UVOV)%6a;B!Q{z#p|39~?pN0P8O%M?h4pi64hZY&q=t}hi5$ODy-!XzO;O6X zt$Zu{Ut#B9F=hR8)JH4jOFF6Ue<<%RSg=X56M65b;(b(nFz1DAW~zQ)sN&afp3Xd_ z=RM7NQ8%x1UewJo&WpM^rQ*+WUOfK-=SAII=e($!JL=oZM|C0Ii7XyWloB;XYDY9I z*zJY7z$Q76M-ART5>0T*s?rwhwnZ_1#dCzMQ0A!t=9K8FlBeJ7_DnwG*lx^vYFaru zQ`N)LR|7Oo-?Mc}0)hMTNSb7c}>Pul{pIBIE zg6*7NlI2>8H#Q-IvP1byEZ*aE+av#1PMTuydd@O3y( z;}bm=pyM};SNdR7Lb_Ym)nE@BD8lZyhYb*6kJ`ifQy87^)TNO~uRr5|wDDfxtA5L- zwygaAAleR%hlE=dg;Cp~Fr~i*^=-{S!ry}Yt5!ne{g{81MRv+$aT>YOH`@&`++xn1 z(xh*n>hZgycyF#?ct)Ja0Qf27R%4g|bfkRQv;+7h{-*I4{O9t2i&lFhweU8|TFsW+&&x z80G-y#Te#8&Qt!Bw%L!hTI`3z3+)Q53wv`$j$cV;aDA^do)m&op{CqOpVi|@F<#Hb z$_kphp}fuGecx4{w_7)EnB~mS=VtvQz1lFlr5<01vEd$OA+e7I;xz(|1$_Vm9q|Fv ziyDl1Ff+~d6-n7HvUT!hu*qGSCt){#hfPwBL+Cyh#>XK_otVKazWh!}X}g2mpc8s* zLIRzxq!Uvx9hi_vu5(q#6Lhb9$$6u^+)BGnwx^q%CrO+;NptPri$1y1T)QIM_NjJu z&iM%uU)6`(&N`Qe0hs=Un=MX2rMce{r|$8z`73Q3Buiuofcp38AeuY$b0AxBa5z1l z?jl=duWxy-RxYc(k0-yN7Kp3vQ%P3Sxvc10tkQ0F_o39~d0!fzi#(M$$di_DrafPF zJygC=(({9w$~KYu5qiG(_PU!tpZ52mhDG~Q>Y#5Ca(qR_`S|3RXnZT)YOCs;Js)@k zF0~wl4i?{wiS|TtyOZ-m=Zv;rtvM#-A4{t@E(}LndXbh&r}&ty+Ue2QP{_%PjoKyY zUW^Tqed!#C#)jG05JufDD?dk;Q+GrXmmB_&%d5A|bCxmP(V-4}Tn}CsdL*A)+5j61 z(d}ZaScVOUh^KMkoz2bgeT!sK&4-?#Dq zxpCnF)wqzxaTiejy3o^HOAhjhaUFO%?=KrIk@!>K#W=6(?>NugRhCavK8EVbd2xRE zXwHi<+G5Uc@}=|#xvu5B81wwZc`?4|gH5qW{$hT1Fz3bdws2mI;iBdGki;2_Q#em& zEYkDlseWJ0`HqkQ{r(*1?-(NUuX0{I?;PjF*``Cdeu(@gabA?~W6ld(@D%U!Ls5RZ z==J`_Vd3t?s%8m zLox0U-?3--%lU5)Aj8@QMCbROaZrxxeBYH*lmB;A7s@_XIfly*l<)Zoy4G0 zM*5;}rZQR5;9!nRj9=*;-}(1`*m3k}vfrKf8X%{6$`&qv#3mazR?d&@J@hxui*K2= zv8f)}T){_hUf8(xD*i{#i*KD*RD3-yGx3hsT*Y@%@x4`i5a-1^U81m|K_oeO&XC@( z=#$LnUYIl7U(&3#fg*@eb($ zeT(!$OREyb#%5$ob|G$o@Iz9(OBqA5a!olF<3Eu<=2T-*QKCZ@U2&!Q`n!tki<#Mg zF^ZapXO3tC-7&7AD*$%S1K10A7_yf4;@8zg)}qu*-qcr%OOHQfIoah+_N67lN!|hX zkli4853tRpTJ9EM1DTB^SwFzSB%?7Y!IG5b?)yJ1XLnK(%CqtRP@YN9R3Eu`5#sg1 z-o_n`*~o6P`H^vH*xP{aYvfAxO#P73W|1B!Z5G9&Fq-EwMw8c$d@uDw%m!j%4{R12 z+mY=l+g#PQ`Fhseu8qMYg@3?U&pv+4P0co!R%aCD1mh48$zd;OE84@(<0OlkvB?rv(ioYZnr4y5?ZOTnE8?sAQHS^Nd9(UUa2{$lpE* zbO`mz&ladby=G(S9s6#}@<{b0F8kj%A7iQOFo2H-*M-X|Jqc(C+61}*`&5PrH}$(f z5?fGTd4A2Yj=_ZCQp#cG`-UWOUW~ajIUk3&cdEb1(9`Wg=M;L4b-*+kI64IjTccIqe_>O7 z{V^D+=~$BnnzQiS0`Xi``}lXCO_t0)hnO5e9QI~F#orBtTcFegoq3TgCq+~7@u{3I z+1?Chcgz1#+mU5yZ#z3R+78vX`nxCjG}8A>3({fVI2C@WEwEuZvSxc1^HK0rk7WD5 z6!KKmqp#68jDO+v^X=p7TX`Pz@8@s*#>+1TDM-IWq_3*4Tk{OLUMBPX3677EWf}l5 zfM|TR6z!$BLnD$ye5H!1T&Qkvi0@1PB~Q&t$V^W%;7eM5y2Zez>ajN2oMXV2D~4`d zEZx`?3%$qL-`!;YC0U;Kx|HXG<#sax^0>pnyMTr)s^vo=WX;~eMB3GpwG-*fa?as$ z_Kt#JajE63H)zWl54&YDmSyNz#?9cTK;z4!t7wlH_b609?4%qvhli0~l!FQz<2(1y z=<{`+&-krK`hJda&H%6DBf{%q;%Ry_3imDBw&}j>-ltM0JtDdOq(6o-V?tH0GftfU z?Yi2J9vgKkrPE)tmt#6Q6r`SWkSy{T!-@`>kO!hSTZDgIaQzWd9n#czHY za-_>6?>C-^hfibS`agGF9{ynIQ(3X|)*Nqr5N|fM;YXp@bsRAM;@I6qMaQ0g@Uyec z8ehWx&@8^s`Mcg8^@D4{@!p@WepOnt4%>~e@Wgv_KA-v1d*A-tml9^ly&N&%P6# zxL!AML#jFN+f##e3m<#pjmg81b}UQh$gk@k-w^%D(4|LH-&j(Tk&pL7I7sSsRnO0! z37P73_pMxFU0k>Q2J`aCqt3go$46bQ^RpY{#ZRvbx#pMt?(%0%1A2CQ>Dux&6D4T? zE0GL<_Y^zN?JkBxm8 zXLn%IQm?DK{gb|)oqSC96^`_6y=EIm+z(;kq}O%*Fe~F#OX$Z5XA6Sw=rm)JBt`v9 z;g`lHjqV=N`-!D{N4Ufv`y7L!MNFPA9BAMjwQ1hLS6*+oHfp=^1kO&yKv=IUc`eGv zbHtp)lc#>j+SmJ!Met?rMB&Y!xM2t%n;)a=IH_(>`_v-n1Iv%Tx6g(z4yVq@@)PZrc2UbgIT>lcWukX zPnXC0-Bs)E#Y-B+Vi5H;I!?W=QEAJAv)0eNw_D*@m+4Q^UL~cYDSW^0hzmE2`qf1h zQisdizbQt&FnySEhw1DG6PhkKa`Cs$%abvUe^|FbAp zi#`!jZe-u+9Gc$fC-m;L-d zyJrfIZs__VzK3?8_yfC7I(e+m4&*ilV8UfJ@-)f)_XJF3EO=A_rs6%=`(D4 zTr7On?xgU{V=L;fKeE@?*X^xO?;1&mbbQUyv3z)6*qCQZTTS}d)M8Zut-IaSk>dAS zJ1GD4UG3(L`^jU?mNB1Cz#JH}8^J&B{pG2QXWN#)7W2kko1Ve={sq`Lz3$PS&wV*A z=JCjjhe9T_+A;=m=!D5Ly)I_a!Lx7Z0vZ_KnB*31IWhoe7_sn&SKQdVJ!favpgu!< z_nvqZ_U$DWzJJuxcl%9x;ib*jKkf30+ixRaMDd$m_v>k|f=`!RTUsyYQrM6Q- zaH+{F2TCva1wJ(F;^XP2Q6J!and#@$?>a7Dll5Mc7iyo#jFwtIhi^74{x8oR>h$yF zd7JKD>F$5_v$1Fw-?H#iT{EPf7uuvXKc1OZ{O-iTlJpj<$MF%Ht}oj-a$PrTi>^KY zIF0a}J19S=KbimNft)oRe~JI-Q{%|9uo)gqKVR#3sGjcSFORnWeRkhYf6ROw=koNV z`1L+6?^?2~*gv_6=RIrQdJp z{-!5>$Gae`*&A4^N4dKwQ)(od*M zy{_l(M_R7ye5vr&_B&#CeCZ8aGBS+9ZwxwI|G@e$Dn86gnf>S90LVD9JB9BLSl#E) z!REO$w)d{{gYVg+IJ<~FH~aID``5M6|KNXd+nBFsci)6}3RjBn(baR+7hnCB7@bs+ zkU42_Kg4J0G+%S!*RhX&>{V~?Q>#}8Z|sk=hL{~b^25_@C-r(h^~Uj^yf+NJ7KgKY zSUO=Iu8Xb({?$ME#iVU(JPw#(KbhRt_ZoIS^tIjn>VH)}XJOIYC$KLWEAPT?548Pk zSHNfY8@_zl`pvKH@L9VngGMufV&-{azl!}s3#%ce$imSFClg?G)Y*qWc2zP@$sHU$Gl9NZ6i zGP#{Sklg-_ibZW+oIkzMwo{)+V{b4f|1YQ9`Cz{`y>eeT@$Cm+)_)oGc#nb7AN73N z>(&$JJ`DWjg|E(cU63M4PcZv%=-l<$k0fO!KK|T;*9IlTL2fPTQv5eUM$CHN(0lRH zqkUag9w~*bN@w+cIA_AauJ1KkXFl0@!b=&Ko`ydg-YoUH+0Eyff4)-i{nAz=zYG23 ziDz++0@K?cm)1=-?_CjheE$7;U$hB8-hX20R2&=7%VqY7S+4m@ANRa>#&GBxdv0J@ z;jrGmuJ2zMc*y@1?_J?IpMmLTzqnrAlh>8(SoPQLr(gf#8?>PpSp4zF>UG*2bMkus zyAC#ttn>L!%(=4g-z@#l9jX0N!)0knPwrm&Vm8OkI_70V zH!~Yh_^z_N(&_K^_dT+u)2pvU(KAmnJv=mF>qpbS+4Y{(uWR&z`mel)PX~8U{FiDi z=-jN|AD_C+qcJ(Z-Xd~PyWjT~|2g2s@ckZ3V8=SL^m{!!n9^D~hFGE35WzweGxc>KCv7wK;J7-L9FXo z$j@S?Km8&$UcS~nH6!8Tt8cwLuG3y$9{6th6W^v~eAo8e>Ia6cDMkOq#v$jo z&mO&@$C5UGHH&Y$A*5xbB>A18{5N}QS4i>E_`i<2fA!;#4!fR#PXW{a2RlUf%qe}e z?VJJ6Z5WvIC&pZ67Cv;(yrer1u0A#XqkSRI^c#sbbmeDC=fF^x_ukqa9Mxv>_PL20 z>%pE}hpxbGk8`{KNVr#7=N)UdWqvdi?QRs)lj8DA$IU?@Q!*Rt&iP)cniUpc~c5Mr`vj^?1sy8kN0^adE@f$ zk-op4!ryjZG41PlecOhe4ZS$|#Nz8X^O%Ld^Zu1n9`R>3*V;0pWwUd;H(-3i!k7O) z_TC3R%XxqNzm`>ta4$(n?rQ0e{;a<;rLC<$(^k_~O~(G-wQ1XZySLT)gBziULI`09 zIYQDQbQnUMFysgwI)n~6I!*}T_k6vt_qE--@4c(_=X^e&?{C**uRZVg`?{|8_5OFg zuYa%C`*lp}+(nZwd$W4blnI@>AJ3RN)=t007gt?+WNDwbZ_d2)_hCKnQPU_|bO~qP zOf{coT7>py z+sb|n14>^8DF2?4P72#Iw8|Wha%&^L{M7z#ep_UK-K+}`@%tygxiqSUZEKH{qql3v z8rd%RI9=IJj>C`=pgF}3F~DP&*tM(ubNDSkB<(yz{DRW`#Xp)_WItI)6Dogc3=;u{ z33>k!pt)5%zb(oe7znw12S!1uhiu4glRD0Pe(%)BS;%iW4&71NvIFaUwv&9)O#>3o z?U_1W4(vj>01ks5cn+KjsXOJLjXIOt+CV0p4y7E$uoU{>Y*+>tz;Z}7RJ-c=234I( ze&qNuh%6tlop3Ycw#NEU?~@#A`J^1ltj{1`mgm_{j`K1c3D-ku&ke8$z5%IA3w3Fg z{@d^x!Zq+F_zt`ez6+Pb_u!N8L%0!cfq#d8hhM@^Aa!DGg*)Kqa3|ab$)@!M#Dvn? z4k?@UHFU#oU_ZD6j)337boeh=1b={+!XM!>_zQdv{t79Z^&9*M{sBLQk@(r3 zzRG_s`&dU2-UE3v6gZwbIu4!!`5lOb?O*~t0ZxGJVLm(&mP5Yy1jI*YclZ+Q3EzOs ztrge~`TiaF9`=PTX$#T}91HtH@f(Q`z(7AZ2o8mV;b?d!6#tMzVIdp_FNSBsGB_Mw z4SBu}EQN`1IZT3of#Rq39XJ~P117^S;5o1j9bhaJe~&4!4;%*vL-dsbi7*YG1Mx{1 zI2WeFTu47s{cJI9r{_OY^P)*VV^~)6R|0D?+qHz}!;@haJPqc+Nw5IQIp=|XcoCF- zR}621rSL8|6IQ`W_#nI(z68tQ8&KB2sn<*Ym%gLtGZWvys{eN)9<@ic^f|)r{{!F! z#GC;G@JuNE9ABNPpPvnHAsi2@U=myfN5N+xZKRGr1~R5t$#5&gx2Njg;#WJ0V~&R| zcrNS$#lQAINZTs^vf__CneY^t3B|v*4_*Lg!+iJ)ZfGc;gP{t9?9tc3JQ3m>AY{R+veo?}aVQL1`663Q4R%l1glOZYXE@#q_v0KbE2 z@ZT^O{s+#2Kf_DlFYrnoUZBI$E=v(TCzhH&Px_0CxP^!;cA^a1(2tENzp|qP1{zZph*I~(@lu6H1RXhGm z|CM9QQpSE{*(!$;Ujc`}nQ$1K1EpVI3O$g@tGyoSd8E|*W>RiRCkBz_O12ZugKgkd zdcSyn>p7m3y}9^3)ByqhES-xXC z$@K?QmJiqn)MdIVslKY+De8_#nVB-5jsfPhj+KGHBKd!7(`H=e6^V+ES zZloT9>zB3)&^?vk*B)>cVY&XVh8OF2>1Tf?JQqF%rF=4m==o`^yZ9~XM!^(B7TP=@ z<$V@PJZ&G4^m(jP?erpCsN-*i>j_IgdIhTVDX*SiM$J1T=}Y~j5HHJ@oKI38UqPw= zuVFI$7G40qgHz%6&<}rrGvH59&WYWSTUYC6xB~tPrQiMrUxL5GzrsJ@d$1Yj*JjuP zZi7cd%=#?GbamZ49`+#I3CcJV1J8sfLh)OB5=?|A!_iQ-I~T^lNw6E70(-z&@N~Em z#=@uJ04U?nnNY@^VQ?or8~zSQKsOCJ8ggy3xP}DcVJf@;axDqSygeCE>etOadaf8X zhm6#3C*qy)`Zu;~NBDOr?H0-TQ39jjweTo-J8TW*ygvrgcdTgmB5VWShV9|U@I?4E zJQ?nUr$VO6vD{F`>n^Yp>){Z% z1ja!=C0WDZ-SBMqFpP(;tcZ@$h<>1aF38;4N@0yaS#G?}B;o9w_(s_dy?g0Fozb1^gTQ6Z{N5 z4y7HRfIq`EP`;@@1?7H{sUT|et>@@ab9aR1`&rqZ{hx!a;5rx&pNEp)YM2gRhQ;tz zI0wD~uYqsF#jplG4&Q-NSDWB!xEVeNKZGyCze6d{r!ba$ZiPePHYn%g7f|Xu7SZ!r zD18ALx2f{l>xSG9MG~F`PlLDst=o?qT#{;Vzbo{9SL*%d>HXr_K5(!7+|ZNXq1T(? zmU#BskwyN7?=4UU&-Y?}N^MdTs?Z=R)Xy z4)21m6S;1m z4PS(#;4AP#_$n-fKR`d^8A3hZY=jF5zXzXz@5ATe2k<5MA>0H%g7TcR1@i1}(8vYh|B)lDVf_Fgb#CiZ;0w01`!AIbo@Gy{N_$AZkv7xz>GEu?+TBH*+zZGu znf}b?)_G9+>G`k|%!FOx1yIJv94O;h9xQ+!DA)HwI1gR~uZG2N0hDwWLmylM%iu0p z4v!!oGoa)z9?`bo>Ut>sQpPFiRpr^ zFS!0_3svrGp&WyDSJxZPX*Is{Or(yV!#ZsbYn@0Ma{N}rWgxQfjL6VH|AsQINI9m! zyP;ek?uBdMeeg4QKa~45*}ffo5K1|RkchS?Rd%LwoFw9VN#ZQWM{xfE*+<-Iiym2k zV^~kZhv6Fd7jSxENjxSHp5x4QIgD;7rInA+_BWIEV0;@Dj*780#|FhO&@WU^tZYcqd_93whSJ z7~=w5(=6_p0+;Ib^3GGr$rxdEgf%b*Zi8JRW0%zp%6QWQ?tzT4fupIrKCm6+8XM>U z`$MVI0Wc8`f~jx_%z$UY^WoXB6ehqqkbC98m2f1y7LJCC;TU);91HJ)JP)Y%FKO^4 z!rW5_-h;fe3VZ}J;5N7va<6aQ0iz=6FEAS31v|rgU<|w$rosE+6!;JZ{`hvEFv%aRiq)mDfMSoNaCuKl>Tn^>Dz8a2z^P!965oSW#TwTW{-2%dre|a9*0Iz{H@DV8MpMaa-3-AN@2HXs5^!mTS8wm5R z(^>?7hBv_|>g#5BJf!ahV&HACAC!7Yfl@EL!&Apm;|gWa_Gjw8O8P}4anhEu$bB-& zTWjHI@ELeIl>1`YzdK^vN%0Pa-?Bf+EB^t&`U~52fpWhr+s8{{-R=9a5o{>icO`0| z#IwkCQ|{m7IyneVg>tQt>!sXh%k@%@GaZ&exo*n1?}hh4xo)n77enshEI-@~E1=wO z&4k~!gf(mqHnD1F#po95Oao^C0KGdQKS*`KBA-+*Z#koZITTA{)x}bvnER zGWJ=E;8pM@$T@5+f%m~%q1>O{0bha3;9Ky1_z9Hfl<(og&_(^Mg7SWDHS7b`dh(r# z*ft{E2k=|!F$$(2vV6sPFW0T@a0dJ*l>5@J;S-R)qw489_!i+E@NbZNLc5*#t!*Kc zZ!1YZ`1;70sIHF_VFKGuf)n9ncoocq(%!3(oea_x$@&qI^I4t?mLsynQ{{5rl7{*| zG6LoiPK1Rp2~LM2p|txbSPn%S1#!;(jodFv_&C@Dat#T{b3rFa8PxrLz79)z zK1A#FTMzJC>ftC@fXGtGaixA|L8+fh;b6$MJTM$y0khydcoCcrrM%Zc#JT}Wxfa8F z;f+v^OZglfa-~}?$8AX*^{SR{*=_*8{srS9&&n!2+A2^*m@zIOjVJNV;4d(Zg0JP| z+m7r(+R`BM@o5>dg5Lw_2xE|Hes4i`BQDm({+;$l%2~G(S&wW%b|bCn1ig?#L^{M$ zWEE0_>_VdG@EJ%svJ|OCwj=G&qb!IIS&FPfwjnNVvW6fz$b4iavI*IR#GFsPAU_pmfu}MOF$l`3ugrtz));XkwR3b}} zjmTy?_HLvt9b+Jpf%uU5NENaPiK0Weku;a{Qk!oZ+(wYu52JsbgA}rE9ul>Me6fBLvJ)9YI1?#GTr=o9usd8T@z95?HNUP>QC;*kub0I5XgBTJBK`TZ$<5^h75@_P?l0hf_C*JT_B8Hi*dK4dYn z2HA}4_>^`EuniKAq#*@JB{CmbhO9)kA-j;s%c&nE7KukPkwT=L8{$ehA6bUXBfJu> zLpCAXkljcWgGPHK9!W!dNB~)kR3WR7YGgaI8`*V1OKZrL)DcpElp|Hh8e{{q8QG3> zm`5EWOE_)@jNyVZA1+0zks4$x;=Zt@wVZ8s@w>xSlmkgZGLTASA+iiviBuys$Tnmb z5_vW4fy5vKkrX5gDMscZi;*g14YC2*iCEWARwNB6K&;Ow1DuB}K~^H`kd4T8WH%Bu zpW`6iku|j8P*})*V_+6ijLbzABFm5!$U0;rvIW_J>_J>S(6nAaIg#$jP$UJ(L<*55 z$Z}*2vH{tQjHx-o+6m=@e+|dpgT!=fWsN}!k@?7SWCOAjai7}CN_NKsB#dl9b|Otn zQw=oLz~QTbNRpmpMMTRH4$2d{OnT?{7MEds)yJF1T?5ZJt=mOMxaGd`7((4%wg0CU z<@>#5-l^s8?h|^r$K&3!q-ZuiYTb!=M=vVI#diM8f&R92quIk@^7@AD|%eWPf4+a2;jka5XveH-F_+3?xo8Xx?va<2rCAc0l{JFD|nfmXb zDuGFm{pI-;2bYu4{-T0|%7yd|CjL+LlvXr49s2|>uE5nqS!!-6<8I@dB)D4B{GO@I zkyD!QX>?YCli_!PcV^jvbnf6}GIGnN%XQ?S@}jNnnHuh(l93@cqsZ6jG*kkY1IB2J<8pCRFb>*$T7L@-l=4K^eiI0 z`+ui4qo}MRx42KKr#x!{{(qUBJBtJg4l02e`9os+_zLpey(bTF_s)0so>JuQoss75 zUCP)y&Fk*%@%z1gzsJWQ6zB7E6_t+Oxp8-?MWy-06$PHojo&l3ytrg)zH_s9012cO z=aw@WMM-+n*aJ;PcAe3`Pi)ZsnHCpnt52V-(Cf8*o0R2TN#$80-{-Ta-~)OfsBLGb znb22Yeue=q-r2MkeE{a~Dacln4`w@)Rq~|b%)=vdHptS}hWb8ncOTv<{Y&XP*_l<- zt|V5_#--)NB$wjgh3!Mcy6GMCP8cDiZ~6`3<-ik=Us`!V+3 zr`k~ZQ8kpo^_|K`@Z3d=#>sf24xJZQM>o=s>)RZ|$)DuM@x`-Q=jSf+6NTJ?yx5KR zcy@k*S`V*l`Q=43nBc^|S|sqsKfG=@j9%Q$U>X*HNnnIA`< zr{845nMI|O)ZE2{C2y%aRa@20kCPJ=4$kWkeUSIq?7ZCOgqX zWe>We6X!rgxZUb2T_rwzeh8EOXwS~FefT^Urg=3?^Fx^C&oJ5Dn&x9@tUaq~9+Yag zlq=lM^-$TZn&z44#7V}y5&LaNYqCQ<-1eY-=3sukEe)J-A_}fW*_`Efy zd4o*zlr(lelJ^-n8k#?#vGd}5(nHmM*t{&Jd2vj3?It^Q)4U6&`E^Y5{g~$6iR2!l zG4lJ-UO_&hP4yGZ>1-T7A3DjVbo+i|jwj)-y-#}Oi7u=8_N&qlpJ&T7@0V$QGSj>%jh(;5G+&fy zKC>&iuXaU*&lhEy&&)IrN@M4TFwGxhnjgh9KZI$1l*Z13(%AV|x>CWf3ewMK08AH;Q$GN$PEYxE_>a8Di!TwO{ zYXIc5v(A8>;hB(Qt9dRsrkdY@vRT83mpn>2rB0-rW1*DqdMM?qfukWhlUC&E=qvFA zvoBpC(E|$B0h&J%y%Ho?7bsNsELi7Ebjw2Z&i-H4HEW$iog#-z&+LCvx6GuoCHg;& z(c4;aDSZNQ^tME2D^yoY^s}M@ytP5%ku;0vcS2TSy? z8q&QwR619pZ?!+VR*liK8p`0*SpBNj3mT_e<>*y)XWYp^mLlts9Z1vCR0IEis{t;- z=)NBk{U7;$rBr{eZqoaih|h{0dHeP@5R>5c$gQk zg*Z=k;-dIbA%a@8#EHHMMPqy3XJ?C=R&KGx%l`82R^ol)B@2o^M|(R@wfaSawSG~x z*5~0}t>~Co@yN53A=ci$Y*tyhrzA)}O7vpnxv_zzUj9#x#?G#&yx7Brl2`E`b_6>X z`zXMOim9@{zcl3B9|M-*duXbdmZvXAtcYSyh~ zT@e~&PC8qOTXP!e6#11p6DGGRot?kg@ny4OdAb z2c%!{9msl_eX8y4Z70(cC|ZU$9o;Wasr+Ue=_69V&Jxr<_4>FvM{SqXs_e4QE960H zOZF8#t6j9?8GI!15hG>!O6OJlDoFUqFYLOIaB$vJ(6{3KD*B1oH0N?Rt-aGDpgFPv8AadA`AX%Zp$m&#Yx>WW|7;sNCh6gX zHTIY!I*}tt&(VpL^I!5Qc`D(8)n8w+WCuC_rGA_`^Iy4_`LR|(M(_qXjw z+j+7U=(fKsC@f`~t>*gVINyib}8D|AWrE27TkUCJ#>kmv)xzr5>`=I2lk55jHXBHan9XOuLIbMi=&BJlb zm{^%t$iKZKf!`syTu$-qYqC>}m{XOrU{=epAIV$u0Au`6HFQfdM1%k@C@9xCY;Y4m_io^TA z^jf)}u1cal0aE+Si}v(NQ;r_sQ%`u5ffo?fW>X zUZ+d4JDmN0ta6+?j=p9&>4fyPMy4g*h`9vpezd29 zJYuey%(E}oST1w%_`g+trGxu_<4^ar5!sWo$H|#~1;^fbi#~Qp-5>trtLEZ8hTUE@ z9i>LN_A&UM1%F3grM*_!=R*V8vD-who6gdfA9h{3cuck&K3Hd&D_{@s6&>=P1)nx4#A*F3sZZO7}O{M_>V z!kFO)Q3tBS$Z>kr9ec1Gr=hW}c0At4IQAInUEV-j&9rYV``c*v)JqDv(CXnWWXN+a zvk4*YGpU3SomoKtrHa@F2PtPdH7{>(=Hnf4$ryE*UAR|g@d%ye1uZlWmSk2i|0hWU^H;*}Rx+mrOQFCR-Ad?b5w;f`)uP#~dy3;XYK4I8EZi zeaQb$*&N+Qf5ujBzkNHKd^MYFg}N{ZHRNO2Wc$-t8yu5QU6T#bWjiH5qu*|E;=j}H zx!~d53D@O+c+=Bn-^C^$%O>BgCg1NSn;nzwOakXNzRkmY>Y8j%OtwxYTVs>0kjYlp zWP96K8y}M|bdzn4$rjjTBV)3?659z^M7R%OlTToiEwjmH+2k|)aNBg7Y@JNL#7(xw zCR=ZlFL9HP-^SWv|G~Q~SHz}s29`X(>#^rwzW3O6yUzdONwcrup}cQ#Mg0A>*S@=T z;qxCQ|F!FtZybF-7sJN-5H{H+&sOQXep&sW(HC!jur%}PJ2suPeh79yDn9O;6JH+t zRrKObeLuMEY3q(hl<$J5iXSm6x{!-q% zxFTGA@&!?d}jaf4?+aYo9yW}9o14c+q2lFqEpJKcCk>FdWle#GXI4C|yvdB?ze z2UkQ%kJDcJ<+_i(n}$3y@{ibOdgCvTm%9zw)^+4#tt;Z5U*>;u{JFdPy)a_I(5|~i zaHnXpO};M+M{hXpqARRhJN@Ux z68vbX_}k(JCx5fD)x>j3C%p93J3ol6%&Ag8;l9v&x+Ol`xB0M162I=p4^FOrGwMvA z>!Md9e^@;kzZJX;c10{dtN4}F`+om%!_EErjhd5{iGPqb5p3?sQbNR++vN<)`ikfWFO+Lm=HlZ)7^X|N~dw*Ya&pFGw1&%+h*Uz60#owA5 zC!cP6Ud>fGliyERJLu+9Cmz8w)#09_;Cr4k;t{Q%quz0^YFXdrli?^Jn@oVLveKcv z9?O7kI1xJOXdM}`b5wKp%QwJ*h%5|sfe6SWY(O4kxiwXD_jiTygt>KA>BxH|t)tSQ zuTRzo*hJZ6(zTRLrW}7hqV-FZ-bpNP-Kg$bTTWCZ0vuD>TE;`kcNOH63#^2kW`R|Z z(@OcAI}bifI19c8bKqa02Yv#l!GFO*_$#~!Mp3|GDET2BN3TNZEJ%LjJx~fF3*Qt1 zk+2-f_a>e-0}Q9i$H5tJHeuOz4orh{q3CN|0-f}=?n8s=-@3C z1ttA^p`?Ewl=Sb1l0Nn9=qIRpl>GBoYeW1X+Yz)Lf}Cd7BYMA8)PdG7Pv*aAwS;LC<-63U<1dD^sqzW&99*E|8S1QcgsCIt+myOc=~EZh^Thudz5v-r#j~wd zP53SNBHX0o--j;|{tCVfzt!>5PhKI+OG@ii*aAvVfU*e;H89{ z!$t5&cq=>#-VQl;ly4e|U!mhAU$mp6XCZzzRKD86m53}ZwwHWGL&+EZg;c)ULdn+& zQ1XR)6=h?N-=To?j}9;wo&r5kd}Gar)V=aq-3iJuIz!sV>ItR2Plwc{d>c^h-VJUh z+#O0g%XYi;c22!&{fAl~(Z{mhsaNr_CHe0QCI9`PluvwZ$$20?wxpjAhKZ2Aplr$G zp!EBpFb9gytqPb3=fWg-8BBmz>-dE_Uh*Yn)jAB)XRNhR^~cMXTG;35dKk_6SKx7Q z1MCX_3e(`5&@P1d2-!5!(B|IO_gOcwdi2g3CzSl~= zBZ=#U$kJF}RI-0F_UoYb4);YBAYOm>Qs2X5JeP4=+FF*6$WAi+1P0(%cpdx#-Ut~B z)m#qS;XQ=Efzlrs8v_qR*>4rx3RlC=;M4Hm@OMa=Rk<_yZGTsy-|}1XO_kMNPuo(@ zQm6R!QrEE)U=HE-uncy9TvM%%@CJAil<^0@Q7U~Ozx8``^?qH-c@%L4h%6bLM>5_` zgr~#vpq!Ty=3c>?1Z6zQgwpS2y<9h@z>_0vAAy|X)&+#+z5Rty+S85b_si!(rXLh^+Cw|&@%ubKUwn_>)uc|-G0RMTnd`8s025rZ#xhA$1b5Cp}&4zphZMe+#7vv6b?V!!#VH&clBEl+wmB@T#8L|@DhD2V@xQvAQ3UcP9 zSjoCgk8utI=`2I1?Nl{LImd!W&{SkjZ z;_D}JM#Mh-{fM8RjpTJF(s}?sdXRXe5Lt|@KsF+KkX{4vnS)d#v4im0gKR`%2lE?Q zg=|9FpMk#~WM4}p8yph>JB4-t(&Yamt7#qpnergmm@d@zvS}WGrg;Fu zI*76jZ1VrnB2E53n*4w4bCQ?_%=nx9f0Sj_`Qr<<;Gcxw zu*2{FBh1BER=r1wLp&!yJM8^CxOg7s(dY;(H$TJc%dYg5pnKjrx(o4RcmXT%BfRD1 z-V(J+t?SLYOkR#1VdZ(f(@S#w)9rPRKM~xSvaVr&BK@_l zu7$B@@{-LyE^fkVpWJX1q8yrxlF0-lebM8TXGCX__x1MTmRG3ixLrugvFj3BOU%Fj zaIx39X2|;4A?vT#VW-ZPg>1hrWc|jF^>6F2bG(m3)_)SR{>zZ?_aWQ= z5VAhvZ+06w<%`r|=XkD=^~Z&*KQ&~1=aBV%Le}>SSwAdfeSFCJl#un~L)M=kvi`!5 z^|N$1|7^PtI<|@%bsv=PLb9|$s!rfsvbPVm|4_euxkdh=%sbHw2{VHY-@+Z_qDP&3 z>L6kN-13=7oqP9iZ0FpQb7h9MQ&}h(W0Cjvyk3|2p{BT-rtQpV0AS|zS z=UUx3aeYu;o%5@Ld}XJ3<#UBP*Bv{=N?pMWZNw{G1M7_Ac?TJk|6pT|gR?`-PAtqV zD=V5-8di?Fv9GQiPqwYA^Lph7vN@LWtFmeP7a132?7SG^X!XjPMtZU=MdbU-EyxGN z#ebmAG1W^BU0HQOIfjhwpmu4f&5UIYDwpinP`L_eFIg%Xr==cwO>OOfG3m{^DbNkcIF0s=vg;uc?>ChoxQ)Pk#xWkD#`{ z=<-WHaK^Zl_I7#Y9z)Kd-pF>!yOj^j6#WpN_vZ38>bwsb-;$0R48BSwUy*#Bu~{}5ZQ{YxWe5Ls90 ztUS1M20H27dvNItaMHQ;;L_>uq;uWDrNdpeT|a??OGi%4+UF0YoJ4qgOZ(aFdDxHV z57)=)d<|)G{PWfI2i4ESCyBFgnp<`sa>?nT?4yHirRVK zS*W*>{YH3jXUx8GoFzf=BTEa^f#f(f&i>hDzTAAfjIynp{nTuCWKQNmlKeR}e29q^N9)$L~$??*1`n)c(;Uv zpVVO|KX2%;Qyvfc6SBV(ek3G(-PZc+?+*z-7ZN`6v-;bQ)?s-zl={fjVJAP!bl9oS z=XH3CuJ6}$IM|QoVqR#NY}*dE&6UYk%4Dn7SevNA&Ww=}Wk0X(bc64)pXPM@JgUz( z>D0j!JjJ>qHm@%4?90phaMeGmcTfH8jD_gIsrZ^_(&J*s%**?D%U7lA`u=>a*@mjI zwomz+7e&@=TpG0i$uxZ(zH5tbb zeU~eh$u`eqlV-9BG1;Cq)+WScYZSvv09VA%&AQ$8@hvZ${79=A-xmJup$iy0`$+sZ zCw9oaDPlvXIqA>dI{&3npwD-zzk_T?M;cE5ONEO8gA@^1X`+QO$-?!5E(MYlzkt$E=tvyGX__Sss~w@fycCfhla4X4S*)nwagvVAq#IGJoOO}0-a8%vYz(->ZcyCP11-d*tf zd&ge2>G#0Z6$uIdLJyq2=!%#v;p z`(JQ<`N2Dz2Vuw1MdHK#o_?;bNBsxC_I>Z>AGGgw?dKmJ_0Eg`;T@ye{)(IaxbI>A zs?(DC4IBRK=Idgx%Te(!jJ@Ht0T(|0p(LZ(Fx+G@7 z$1#1Tp_gc}k1OKepAKC7{`J4z(8B+H>aZ+PY)?_~)-g}Lw0%c>;$@@0y`{)A_D#z& z*}$7@TpK&bfoU!Y)7%H9IXFzVd8RomOmlXa{0*DtTrk;on&$H8!L^xw_3QQNsqc1d z7x_}=xS3ae$9rRw&8NwR-{j}Gv2#F}Y>7=a!=||&Ot!41IUSx==f#`;{yD>{KKSAdtHq{b0UTx*}eFXLU{gyI)?t?8hGW+&23dbc;=Mi%j8tr7L2H>yngb{&mcT z&h8ghzR|wzI_&k1lK4|j`2O5Zr?f1%wDW7LZ@YQY6_#c4|7x0Z#N^M_H0Q{&;C@Jl^>q{;_y2*m9FG|m3M5eh+qC|*M87(!ws+BY@S=eGzWoc zZiQ-f-F)u&31^=2N1T0cYSZ7k)*0>h`3fym+>QizwXFOJm+AQVI-W;o<#+df$Z4%?O=Z8edc7RK8qs&M$7*chj)daRxs47>Iztfstz3OWmvp55dm*xX$M#f_wHvzOFOXr{`W4Fl z(kA*_wVL~MCkKlnE(MWg1GbIL;OmgfsPzWy1mA=)IxKmX@ELF;yhw*7{VGI%A6DOu zC4K34OAuN5N80HRfYL7qLMh*1C}kT0=>yi8Q2NbTkXHiMP?!T{JLyLfPv2JYvvfRt zSH;V%u52&;OwzeY$KRskC7+uS{k>Ox2bO%cCvGDmOD_9Kz2-sbSNZT%SO9xM59|-8 zLaC2wkaNK*go*GXcnK_l3w8J&IFs=Guo6C~;~&@YPwM!mpzQYD9cj%gM{yZ5_hNWA94=p@0#j+ zr|j2;xMheeb4g$77rTin2dkTwpigVW$!un=y6 zMetk5*brb$Qgd-g1(y(xgr)E}NZkbnz>8r9^utV80WW|vp&wSl1&}@zxE0QZ55T!_ z9lR9&9bN|i0|Wf^jAV{Ycs9HOCc=4eGGvShaBhj6Z{TWp4XlEU8G$wMI`{#+0e%R% z4GwIBH^E)-X81c?0-G_AGqwa;!&{*X-Ui#l+u=#@PB;)Qg9(t=et~mg6`Tg|gO|bk z;cf5%_$XwI2s{lrF9R>bKfyQQBXAdd6h^eL=kjO=8AAd?;TjkZ8A}4`a4jr?^tr$s z_$*uipM!V6b#NJc9zFr9;Y;vk_z7GOTXLa&1-6A7;OX#nI1Ii4hr>Sb9M~78K0| z2HC>zT}TusOb4VFG8D-{d`JLUg=|OmAiZ)phmf_%P9%~OtUb~T8H$L_bs8){%8~g< z6%uo1D{Bp0kED69jfLBh-AL;^&OhSZa3C_D-(z3_vYg+Qa3Qju-`kMLskC!G`9_8m zurCrroMYP^&+l?%1F{_%%CQTlu^ws2raY7NjxBgw>L}F4Tr^&nA)65wCw_M%1KEV^ zM4}i3Iv`0%7P1hjLY9-~HE;v61zAUU7i>$rBq4>!zHH8`*=8wiwhF0196R@2{9Z}f zVklD*5^CojMf;0Qy4a&Tw&;!>y4axaukHErGV(lyyfRDxF_=)Ea&%7>dl$2LFQ`MMV!pfAoDUfb27B0e+@)Zkl?urvM8?) znTISzRw2Rj6znG4_EO4^#3Nzz6cD!psYaZ63ij~ZnWI4FCrCn8tfbDN50S}t79-1% zHHb4`!FGP{Mxp}b5s5|Oku;vKwiACC5ZU=Qo&7Totkg*???Dwj;Zd zsCl$M(j6I!WFW=Jd}JxI0;xu7kgbT!dk}dQ`yjDM5+d^-6e6K>AXF1qgKR^b`48G& zO&$?v?t?6T%lrp2H^pKkc>aUUgm)rx6Xrs?Bk@QYQh>-@2=kC7$Vy}#vJu&i>_(#I z(+)^?#56C$-sVJTy?}BeGB1YAjgW$5B87-dOtu7Bj;uj8Ae)h$h|G_$RIbO!RwOE} zl~sVOM|z#bIE?H_M8ArW$CffxXv2B&!d}{2yrTd2u@L^;P)v^dHt8 zt=mOMxY27uONu9mSMC3G_J-Xj^l*>&l^2y1%|>y~jT2yB5sI`{{>%a^KW=YxX9U{< z*O_(V7{*GB%R>Kl8v2j!Q6#nx^TxcQ(yaXAKAuXCm0wa|^&Vg8?mfQT-8*^z4<9<8 zMM56#STUp9XCh_!m;~WFDmM$=#Nvtq&p!7EF7<)z6Oz?N9WP|xtmG23PE(4?%F{gu zS6@x@e>Bbi(KP=@SPh6he`VABA5HUrG|m5k|D}CRBGokiN7MWtP4j;gl~v>xyVJ`n z3W~h$Az4h{ky~C|GBw}1!R*W(U+2c%ApaNU|Cn4*eBaBjOaHhLykqee7o>Sg)m$d;r1DNjl{+`z zpIA{=o>RKC=D4Le~GF z!;AI)@?k21W8I{~Ep_;Io!+rJ?9$;5A=^*Z;YE7?TpjL98RhsF>u?*r|2!RjMQ?wn z4!^3yD?-AnLiT@Bhn@UAr^C+iU)5pf_%$K>|3inJlKv3iBUWbAx<0-;TH$huOJGJ_!M}PJ&cqldFv{U$&L|vmJop#TE ze(OH1IQQG9U;Ojr&I>K;Llr-9`sZ_Q|E#e1^A2C!Hht6`+xh;_Nr2zSM}~d+#rB)h z7gpV#m+|yHf5XQBuhCr*%}S5>q1g!+%=+-TU++siuLoz7$=2*}+kBa9?k@UX^7%qm z>hybdy*p=A^H;9uy!EoD%zl`@JzBQ!W&Len$8Q%d%$fe!7jM0?V+ZA>|GOf#{PgXE z=k+fc{cV?&Z!TS$^`qJEl*zWsWK(9cu`=0Gnf$AnbhAx1Rwi9*lkT+1Kb%Qd*Y=TU-%#F4EG1hjq!Z($w2YgZ~zl@?2e-H6Pplmk+%64O*lz$xj0#1QnLTQt);B>eh`d}suz$x%n zcs_gvN;=r}sB~U|(oSzfZu0|Q>3Gqdf1Gf09f$D;YTnPN`BJelW;P8 z2~L5pz}4_I_!4{_z6)u)z(-K>u@%bxU+VZ@b-cVwlz8cHl;3&3A!%9C-=g6XiD!vr zJ0ZiKvN7uiPt@VgFqv>S$m6uK!59mN>+nbzPnd121ULzffF)42FN0@5`hwU#1@3}p z!slQdd=bial27W}c@H6W3M!vbFa?pN3)@jVxity!D60IN@>}L0RsQQZSCl`$(;;ml zHdUgwE%V<6woo7Yqfain;%kSus;3_rsvGI(QU>dji@vv`cioU~wdk8Wy49h2)tflp zzVx4ib)QA&`B3RKJ37sx&wQwLnfIp0d@#Dpj^489DT~grqYJ(_J#f+g57x&G*2O&- zJ=}fi;EMjO=-USC&^r3FVY;*QgMI1F?oDsj(U%onS<#c-jJN}wpGX=~fQ0JAZX+)8 za?U9vR0p=aw3!v`&nr|1))kM=?evttpMog|7~t**8dx<_5bD_ zZ9lcKsajg_zZ-fjt6o#ONGLECcxT4NU26Xb*Td1ffjYlEo!Q^fvl0Cm=U8ozvA34@ zda|@bM2Duj{;>**%6!GSv-WzdX0pHN^z;lmmZNjXyF~n2r5Ad6A0~QBHFo-z_-_i% z&nlfCl2G$e@vhG5MPO_F{P;cTMYBCjJg`6h6oShxI*0NM`g}KAXHoL9N9Uz0d696d z4XU0kXTEGlM=b4Fc4QfZNE7u(ByTQzd#7ETyiFd%`q2DE5oa&%+WOj8{`%?sIQctU zhn@U6ZMj9~Pu_txM>-&~O`5%ZUH%IEximvq-lSgar7my5Z7FqgzCQL+T~{6*UZ&g8 z(P8zu?3CK*6eVkY$cwLjUhqMeSX|^OEuY}Y=d(q4p7idZt}oZmQ+RvM(s^=p+?+f` zM%$@{=4o+Qp6sgHk37}3;lA>8dq|#~He0OoByA<gudX{tia~vNt$4QEo zbt)2tNSh7f`0o10&ne5#Ezb433p~XhZj+|*1J4%~`8Y1?wqNI5@OU6&V;|9*bo`10 z`F|N68>E&QAAfGb$oR4Ge3Tl@_AY1p5PvTX?-L`#GjsmARBs&ERzkKvMTSY4W6FA* zk0tSTIfD)w7Z(%=>zmRS?0mPj3Mam}oRqw&NsLpjl=BD?tzx2z`?PFLcoNedH z>6c@qKrE<6s^v)juOd&2nb<3WDH7`}mE+=6U+~Tf%a7g_)Sbum^K)kO5<9)xe%YUP z9Q3j6Xs4w)1o}syU))PvVNxRfB78i%#6GUN z-buf?QimNK_nURtu^D(!hd)TQ``Ke5>z~kJ(XkIMcR(%{EUOVI_ew;{U1M(_UT(as zdJa*!o%_10hf@!E{))0fTen@#VY!fF{*me}u>JCcUVnD#@;EjgE&giXZ^`|E)K{zy zf2iwYj1D{Xb-oTe^_3s8eyR>THVJ+mmg7nN$@nuv|n{_njhlD%p@JTv6NQWJplaV?s_r|jQ6(Ql9b=a{% z*{H*gt-;4S?ARoU;ss4;iB6HEm#o7*bov+TuyedQIxN=++5TD`mT^?V_vx^6{J-k( zRXy$XU+S>4{|`DW`v;E?-Q@;_jsb>PeO^AuyZ&thGUTe(k= z_S~q$j!n*oL18K9F4Cx`V28?9#iUzqvSBgloSSS_OuFbMopX~-N@I1=KW-(ue6LPf z{`Q=ItbW}Za9YOvmQQit(fvq?f3n&9E^P+<{Qjlg(ykeJqi+rVPPv(MMI3kgAMSCJ zDknyCy0Cdt$7xl}Da!ckig5LfyZgfp)8>}O4W9kP87b#7mU6x{G!MB+N4>GS=qB44 zlfQ<>+SL4S(`i3cHa;euc9V{JV{L*=I^oxGUb`Y*dE=)oy>qtS*X;he?b>{?=5F+7 zRQ!#{q|RM5`LZ{w2ThsKsr&J#6VE{FiWvFNXTN)}_>m5~o|*WU6Yu>~3VJ^Ok@zR) zw46I);n9!%`dQK!_hdfJ7;CZ#GUvr@8P`< z&#SJ8@~^(iI5zLjo38)%kMf&t`bU7VDq7-upB8)ThkySeFC%|VBJSi%dG+CS7im4))=;@saxhSHwe0@4L)9 zb#O`h2Zj_pJMKg7*-bV(jnySK+2ELLXBum(c&Ka=O}2#hc9Qxzc$=5T+P3^(w_!Ql zwkjr@l*Zbgm~1DFehImMZO9hVWP4(=F=?#Lh{-m@WK-E#+mJE5*loz)oXG~nWP^FQ zZ9_~po+g_SlZ~gzk6vSKNldn)CR-Jgjfu&&)MTsDSeq1+jjG93#bmo`vSBgVw3=*N z8f)v?Seuu<*|4~ImeJoSnTL`0g50yqvvFHQ7H++jPJb-F^*2UKzCFrzN5B|Fmag_= zp3>!)SB^Y(sr`oVTYn2w?@nYtdFRv%k%dR(fRNj<0Jr~2*I(8#wAAkJ+F<8t5b>e= zldk~L7ME^i+t42(%D=<+P>!Fb_m{`g(EUj>Amtqlxt&rr4)PezezoQH>HX#TH?-Vh z`#`j~%MNf`r~F6AaizW%?`1z8H3Mv-{PoCw@%ng@-&J})$wz2@N9g^MpyYQXY!652 z{nPkeqxYBZLbAWKE8DAO4BIihiJem5csLf)cFKPRb*^kUs7vL?f?Ld5n+_?D>vg*w zT>K8L2aX#cTG>2Fc_t8+dT=B9JB0YCur~1Q7u>&SbG2PO>sIOXEEcp2eB7~szjuYs3C$|X}YTS#Cj zycY6Eqx@~$5AP!U2;^~0`E{y-&lA27egtQ$z{t04kA@BABl~D5iJ>`iN(eIH?@sE+Lt|*$(Bm&tb%Q+dL^~8c2DGeBJsVDLPU(zn(V3Q z!v*w1B-EbDv6FJ_stP!1Otw{GN0o$BAzP9EhAoxYa+&O@WPbW!e+0qyR5Cw&L;eVY zZK{@j%G^Mg(nlGv+=%!iI9R)?b)3}uvaPCNn^60zP}{2ihFw*#O_j+{KtuLaS=77O zRE7EmXvm&QY^e^19{{nT3Z4Id331DjHAv{(|7na3K4dYn3fYA0LfVgPWer8Lkh#b* zqz2iIbQsmjibpDu0`5Wc74u3#9Wu?z5OD)^C|BPU77@^)N(ovqMC_8{! zYjlo-TS|^vlyB=eW=*Il-5)O?p{3CFJO`DJU`3JxNoYX-k(IvU1MG1VJkv&2Hom(A z*JG32UzT)e`vfkom{wF;mYQ3Nzm>)}NpQ8M`8`~rJ*D}L^E4BBZjmJBE@cPOxr1|) zky|!h{Kp(f2dy0&o96v*viocBCM$SYt#c4nd$a29J*r^;T|70Az>NGMv3-06dG6km z2e^CZyL(S5a`(C2BJ(BVojdgbCRRi5bb0MvfYvI5B->Qu4T@#Dt9T z6XdQaoN6fPw~_kQKH0j0uwubjJykO9sN-%<>3QTGi&0wjO2`zkxAL<8RWkm>pHkt z$AjGwR&IWV*Oy)CD^dG&A-<504-!AZTVC!hQLEIt-mI(S_(xcIUhnjhT>o@?ont3C zMy1!VpM-JR7GZ~c=wO+KL?H!8t8TngTco}TrQl}GpI$x-7jFrEO#9>Fur>>d95HKL zZi$C|LUl#SnqJ(zahLBYEuw!uP4qo&uL;gP4>i9RQuRgB=sx0osR9$ z++*z|+v${#htKrl{iwY?ozr&CHnO0od{U7I^G-31tKgI_E$6C}f-8lveCnh?oo!qd zX*&6o{H)UXc{|q5Pao@8_3S-R7xF#!Zi}o#W{%^Vti63vS#qgdE!8pSv(8ysJ3s8t z4NB*HkJ2-bQ2MYmn7LFK4z;{wug>MmIS zSbZ2J4PGy+Z=ZB~%N5Hv3;US$P9Uv*9CkdZ7roRTuQh2n$8+qTjv>xB&RZ^%5Tq4X zl*vA_PWtx@&S_s+zCX7-zc52Q`4J~|<+{a~jC2GQ9Ih_QUhGuXb?kdn9i~^iHYIVqJeu z-@GI!EO~V7kfP+IW+|qH$H0-WKY3iNwvVV+pT*wX0*Oe-wrz*hNIOLAJT`I;$ym|`J@#ZiGEyhlYV;c@+e+M++PHyy`m^KCsEr#$u0rGb z4Uo9-wu+8!%`v6=+gSx-8UUlCUBt^HRoggumb({_Mv#ifL z@%{O>NI8##^BQ(v5T5M@Hc=%g1#WI=>>3V_=9aIRJcc&F0VU$DD{N>V)Y%4gW&M%- z2bc9iT~@a!p|MEuWRWs2h@t=3{VljnXi@Hty``bqcjD_Zq|#~QlJvrtx;)M2IKg=u zrSr5w=V_?k`7Ah_F>+N z)R`ad2=!rrZ zcNF!nbCwKdEZIm45czD@f;i#J>A96n_ z_i8g}f39=tym6jomg_wDDZJ#N6c&+(v|H=dM}DCvf4W@k<$XUxx~hxdJnXA3Lh~T^ zMgjX6mUB=0W>7fzejru`LKZHADvwj(eDYXxTfIE;j@DB-e(D70jc-_c(G1Q~dp{8T zyyZMo%QH?<0S~?Mtl_WUX6tlbULz$b^LpfR@)EnWUS8xWzo^tRk=Mp{jfI{k`;!+L z1LgXiZ$E-df~xJD=lP-fLLp_jAs^bt;RHD^h8@)LVUcwZqu z(s$&IlH|y)DE0}hAL(;?*{}MM@lg8L#q2n>w0}NVWA%(Q$S|TSQf1(ctI@aA^H*hN*7pEhgaVw}E?F7|-=U%9J^s6d8vB^G@`;Opn zKWfZ=KE0RYI`>P?IRF2#cP{WfmjD01C&x%5q#PQ}snDF)5}z@0HVjkC%r>@~ZEeFu z`p6*_nuz7p9110k6rrqADXI~rs3?_hQ7VnJ^8FU=kaxbl^`#4BL6yVB$irrM zIA0!2*&j0U(2IPC?4{}lG+_LumzC;IxMlC^02W|e^yhqhZ&C5NW$%7=%llS!DUtY%;dCf&Ga>?Fk$*VN&k6{qAeCO43T%<(c>1+&_ik-*LRNC%5 zx}V*7oC1&M%cJ@2pH%$HC2fu5QMz*x3}O$_f$=O)dm&j0h;T(IqsHk4%gFug=D#QD zpO620j56|XM8aH6AhDm4okQqo{zi{+w~hJpD_}^-@OT!^J?yl*&IP#a^p~V*@+`K> z0Dtl709t!HQWXA7I~3U%fpO7PsH-{uZ$$6&&S!^WQ}|$pd;!g~ z9W$Z=-16~eW7OCrJcAyg$j)fXkfU`xdcRT5K~lh6Mi)ux=`1Pig{p1yW_LU*-TCXH zC09kum$$lh5GJE-`T9!SEaPmm{v9&%C3aLUnerNp{^zKAVz;L@6~RDS8Mf3! z4;|RTF{opptDEHT^y5In4u}4KNGKsZW9dXJK`O4$(DTI>VHNKB8IP1mF>T`YCG((p%Z_#yWlA%lS;AC_uXJaYaUO%NARw=Z%F(05R zKND?scaLdsn+Lj9lCso2f4MO(x!23W{jEM(gAtn~{q}%O!k6?tTHGo@3cAUvn5O-N zziX90svL9hu?c}4JN_RnOZfnt*=~i3y|mOLX@ixUr5=fVm8~`Ek&M4(K5`Oe9vzyb z<}GC&(%bx`^vk@>Pwqk9{`eF8+ zqFRz^E^GamhO7=LTkEBMn4DOq%*|AemNTO|FBf_1>{rq_WF zDU-p^by3-(%O3X_8g>|qacT8_3#}=Z<{VooARsCrX;jgRi;3lc?8*~Dt+`) zXMA))d^nf5XJQ|9`AElyvzff_x~uDn_quz+OWk$5>2+X5V^#7=yS#5#6 z-zc`g-fxul&f0G@ZNbAOum#e;C`y0PTTk!e^cN)-&suKlVbSNjIQ80`cgt2iu7Yjh zW5}_{eZ>pxC3ssUg}HFh0cMv_5oVgM$PehcPjrV`B*fU%!jo#+NT^ZeB28k z0UmsWC8lK*`c3sh)2C~$#iy*xzd_F02sTNx*d@47KEfqeWvdy^;HEd8^M?K=^KxIhw zAJ2i$oQCF{ywVY-UQ8t!l`J+4V9M>H^RMz`%oT{7?=<)iaKJE^RnAX( zle3qlPeks;)pNekm+aTlfY@cP+-$O6Fa9j^$L5;aDTiWRzAfaE{rqCc-V5{Iv!qI- z=w(vWd?|mHGFfJn$>~r%U&i#fvX@Vhul${+PKAUh-S;uF@!@O^crJ7%SgKW#_0ry_ zmwILI(@VYbwU&|FNm6rv?@yMv7b1h)Z8C3YssHCSTSeE$qS`F`dWOuKInDOca$bac zu2M=XI$4JGW>3Ju#Daas+5MY!qG3pAWWjKuGRu6aC(g_|meWNQLxDMf#gv2p)6xbO zoCDBvX>9-tZ1y#?XCJnk?rI?JZH%DH*84a-OYu=~4$bZ6opmCpCyljrU#>ZBF6kUv>axP-iQO_i&+G=3;KC=-q+a-rKgiKtYD$ntRq-7J z!+Eg=+h+}1zNx!s{dt=D6SPZgx!3yR!+iU2c3brVmCc85AI?T3_L}L#w-0BN6QA{1 z*BS5iI9JJ|U_Exbx#!bXDu0F7@Lu17#tLr*>zmt6uWvH9)=2p)yuR7k`S+EjrS91KfWGREwGU|4osz7* zK4j?98hK%vOZxs-Kr&Y{l08(;rRJPN@!nILSoD|L&fB+_xfSbsY%-2C_p)T6?{ZoB z{-T~&zP${)>T{D$3+HB}nQn((i zyaQ?SznpT*bG@%uIR8G{eIL$dci=*Yn=%Wck2i}V8+)7QYrLuaS;pMvJ6Y}f>9UbT zYe6!FrsmAvG{>8T%f@B{DPj*7SAO)A^#8)AeibZhyB!jL%FQ-6qTDR`nP`-CQ<<#f z68j-#E#v1El(qjpGe0gnVq?@^k!(M!dKf)WO?BFSl4%lYhYBk%sb3!ly6cxY4_B=G z8v7wdx6QhF+Q_fWc~*p4LNAa`zN>D!@@v*Tdqz!nBZo4E@zg&{dAaPx7%%xzbkPqoj+IpEcMpxJ0Ft86)tPup7ox$3vTp9MOBWy#9-PioeTZHx4c{X1ZLigHP36w z`|E~{_K(!lv)brY4?0O3tk- z-s(X{Xu>;|0nge1JrT_If_9={}*}cm-)V2!T!3bx7NBSZo-qd zw#mNcWzGpZ)he+%)4`RWGWEUY$4iZ~OWBJTFLu|=nV`3P`mCQtu)Fs4CDZP9yGu{? z9zgmOBcW5GZy#Tb`pG8@(mlV=;$B?!U6-W1?zYt>38&nQx@2uXjvD!})|&&~>y53- z+sn%KvtCXSiE*BLE8O!wD$KTZ{{A##zXaFta*D*Yrv!wk(yEsBS@ea!HnDoThXkM>NOdjb7W4$Cc zAto(4BP}K|Bi#|EdoJ**N|?rF{m>v}xR?q(+ zqrbdrxNxay!ywTInJUc+(6oT1zVbgzf4eF`eesV9z>WT*X-XRJ(%R?DrClwmeuz9m z{QRpBM5`Gm{|nB2{>nJlOTW~I74_kK@ol`><@J%E59f=`2eJ~`E1?w=K2+2x=%kmM=XqT9xNPq7)} z&0fw#NmKlZj+>XaezcvxJE^C>Tn+5%U&(KJW z;&9^D%(!hf@gl^pjE6ZtSXw&oT*;8kg^q%ml7He5 zJq`!WOY~Tmm%EKI_om7_j(0B;TP5pmt<`JtHaD5JRBcRJk>&0&esUCiD~TfT;>EKx z#+6>m$RlPZ+*KL6-_7&l#Zq#Ys@#fL zUo88;3JA^O?jfn-)E7%UMUKBfeQAAqUyw^>(0c91;H~MX!$+iHA#{FHy4hjrv|%j4+qAzTd~< zn-?9k+GktI*wxPVGumhOQKHE7Zwaa9NqGOCw8rCl*g6q(uX>gs&S?8rkt`;i68y^ww9 zoX@kp=l5u#{l5PxK9pHa!Q@v|1-)0}^&ze)8)YR~pv=|w( z%6{)W+@%>!ghbx?Jcm{1Y#()sl`e1d9oxC%@x+Db)P9KwP|hB49Cp9UT%5T_DNo6B zVRN}MuedyE<~QrvBxYWQO^{Ifc&-8{Q+7|%Kh0U; zUV}06V)jGr2ElY!mcUzH5Vvs!l#(0ayYe&Uys0}c`&61Lf3CcETf?{K+uaV_DqvOVo%boXSAPtV{5Uf1lQWnH5{ zBWrQDwyxbnyF}v8+=geKUs8-^la}%}V?XyQi`ZfFdk?!N>0;_csW;=cIp}P_O=H>r zs=s4c9Q)$RFHuN2RMVqZ|D{lL8M)Ut4r2Ri;4bp-bd#hhb+T=+1Q553CZ=1vAaN5p z->cl*?-jYy{I8O6pqdvFexv^#{3`j1%+pobt8$PfMXz>V>eR@t*!jT;oWm?-rN1w% z*A4w!`Qj$!Z`})My3J*cJ32y6J<-F;-T}3@uuuG0^i9>N@8G5Ab;@IU$<}8+|5{cd zHLXOEoAu92BvKVwJJa_9?42so;JY`Ly7)&u96alyM^wd_OEWFfC8?iZ7rB0VWZ~aY zUQ}zzW6|pLzcr8YodEB4z`j>j>_8h@%c9r;>t0#Y4#>Bt>~=uyjknkVv7tfcTEAt_ zloz{S%sE)DlViH;y&G4} z)!Wv_di3hQw5_^~+->U)OWQhrmDvXlR(%^O->j7`H`T`%IX|r23T<00xh>FtvA7qd z|6=ieo@hK}>~34f|2z0~wXLI`b;-Pq6rA)i?c)xqQ(gKLtxj3r0h2nlpECcodBHj* zZLr#7Y^hU~`Mzkbm+x?Rt5fIsCPKl|JCA4Ae5KE-cb*7}otmyazGH2vzFhaZ(FUKI zDWyU^HR|l6V5I=+>_;B`VKo#h?lhylf?rT1#$2Vv9H_Ruw&Gm>C-y)uU$;HjYq1AI z_n7_awk~@xZnw)#*#ps$ROME=AVKhq|8jOzr2l*t0$Ga%f4B#^0Wk*#&KiZDPUP zx1+adKGo7ARM8^Ut&>M!H7+pUQQbOQuhZQOo75WojedkS!^0-oBC=Z>+t0RMg^bs0 z>Pe~pVncM9x^0NGFXni?+bmbvyTDqM0bYW5xIHbUUcN z^H}m&`QBZpL45U&)<^7|X6D1TPWLa%i|VYrV)XCZ&(}-!EW-%L z$z4+IOQc`Ab-2*_?|xt2t&95Eg1UZrzISEnYI~jaL zWa}|l`IrD7{?DtjvhZOut^~8M0bLA!0-n|C8kTd`nmIx7N%57O5yOU z#FS)i)ttJy#~|0pOI7)S>uRVPkpw9ow62^J+&d;YW@LPtS~S;X&GF81%Cq>l%U9ft zOT7;$d|J;`Hu)5u)PdfhzOO)^``)@h4}CM0kfj05AFK;M;f3)dyAI?uWBjYWtCFN1 zk43(&b^Oz`mDQ=`BG>URxMVG&Q*O=OZc6^X@*r#c$$GMCo&Us{bLTd22IPp*NlB?O z83_`foP++5&bxNS?fUbR#`DXe`g0kT9(9`3L>A`zMwtsG22Fbe5@Ak-9%_Ir)cTli zqYSH}my74*zv-@e_=#!>QkRjX9%ybEx!XAFH`=7kM320!^H|q(gm-fdqt_w=a9Mdj zRnIH$9+Tsq+3@0}K#q!*r=reTTj!^(^}YfQ-`$=#t9E|Kfa>sivwfpHD7D zonx@hCx~3ke&sPkE>=DLoiYu2!b2{$#>HN=wx0`>aMAR$sADbbxJvS3e%of((|Q?K z*8y9mY46ep2wLmz)41Plv#P6&_w#2>KBQ

a~z|K;LU2Hq_f$*XQe_Nd6`o{eZbS zdd8Xq=&bq%&U@r9{LW&OWfCySmp$%nbuB5bK1k9@DH5+wO~p$~P@ zl8^MUF{#D>w$k}|HQV1@-fIp>y8kU~gAM4!+uu+RyMK*F%uVLAE#k zLYd`Vls3f8dQo)E-i8R@_V!}EVNZje--FXSs>B^&*ky}6Q) ze__vc*~`qdYpOl5eFsRn*}em09S4hTHs2>rWgS^AnK%=fw1(CrlPuOAXmgYvN6WWT z(^AIi-^wYObnKP4gsrlgED$|`ZP#_7vXVW@5;m9oo96*b#P;)mMSic#8lks2Ti033 zqDkufl9JC)AtXK!KFEIT!$peNwKRRvX4BYqDbs1T^HwevyBFnP#~Q|WXpXJX)kcOo zH$(Bz2Fl;5Y=ZBzCN8*k+rC;~BK^Mvl}YMSHC-g?zv#cN=kB?8>)zGcxnd_|p4)vU zx!XQZp<$Cg8TThrlHv7uVkwVg4)@o%-K zHSuG&r!prhdpPXpt4o}+KUSsPN8T>c=Zn^&Ppb>Hz4G-r*(iQ-)*FcE(wp9k!L1yE zEr!?Qc-)I52z3O=07h!jBH-wZn32k*zkEV3+B~bz+^BE-%$mw8lvlP{UY=_z94VQc zn4zM)TxPEMii@>ac41`}DBlH_a?840ZZUE3X|kv>AR{J&H~Ji^H-=dM8|#|duyv); zx7q$Og~;_eBz+s1DtLvyO@L~%3-)c?pD`^#&!$A38FSp^ssSY%Xvkhc@+P1$?*7bn%U*)NT>Y80YTtmYnONL{B_3&i_9}mty#%g)|K+wv+Fe&E{x93HAj+$- zK8$^=Ec&6`jPpT!^|FjH~4d!{QzWOzv8}k(1HcE_| z))}e*b%HigZ?$!nF?nz6k+{(*sTn1#F2=XuN?QAo$k>>)IM?^`r59ky_DN{d8fiwCNh@sR#wsvwf8q=T;ItkgJVV+Y{s9Yw*ea8 zgt;QU4D|V3bzZw|EdhV_c`M<~xJn87TFaKc^N5tBxODtTo+R(y_6c+_cwDhbV$-y< zP(|nzG#MWK*DF1-@F>mKz~s0T)r2YjL@wraKK_IkDI4kU$Bs@*i%-sw2wgmi`)FeC z6+b3kDua}z$Sep-Odk+4CO%HB^Y+J>I1t^nX$gx=aeTN7Zo`J!wZe<~zn>i=-UxIP6cDBA5PuBrGCh^4}C+0)LoIWd7ZCrm}Me+BSs{<>+RJ9jEf%; zGdf9qCqlcPvN=WB6!qc7;T{{jqO|Lo)8#?;<@Halng5IZJ&uE|(3n?sGBaAn&&(#<}I7 z_Kd`jbqQGVR!2`;D{bVZjrnZw-h(<_agOI+!gMT&UT6*r-^wIJ_n|j#{HDIS5#2{^ zC0F0w(9F1O_My1(iQG)NPS~bPgJWm3j@+&Q>+}0CFLHIKqsz5hDJ4P`K{fvCdG-F? zjTL9kuy;qd1x1zj2+Gjhr&G`tcTP!VeOKJJ5^sItjmh9E_rvw_I*6NnKaco*1$VM0 zwtSozfx5VD$8B9BO=IvLn-Uk#9?vnn?w^vz&#GP6=nBK$tT^>KHI?p>b7#)IN?#@} zCL>1tiaxw=l)t%O=nLc7+%I(0)DJ^n{xqJ$P-+Q(9qk~xtaUY>TiBi-H=a%VBkiX6 zH=momS}=TP+w+UYv*~}gQxt6jbk4U-bhN!D1|C4#h!sd{kb#!FCw{;-wle)H_ z8P?c+lqfReohoCA$D`gGSpnQ@|K7fPalU?=RZfTA&|_@}NWY~Ol!}~!XlMW1mfULyROSl?7j4V&R3t!cEvgl6ItD9p6~FEq^7rx5+9~p>qZ?vX&!hY}MVS@9I7y0ohwS5K5pt0=E3u+g$z7FZh-G1Fp;c;Je<- z_~g&t*jMBIEs@C{=I^?heL~AP)XO{I7ir<-l1zx1FTwbFHS@omcl8En$$3NycT&cm zP^J#EOl|%A%jIfYyTG#9UNkLvIjA^gE6GJH*TB}ikEPGSgy-wk{$YkrG8Rb(W3XRN zWxoo%tN7n#x9JbqzgNJNi|Y~_rrV-|^FQXhjpbe!`z-q_f?G-;S&vxon#-+?xP6H3 zk5z8&^$1s@?r(!#q%tO&i$A%4*_KfwrS{y(3Z9g)zq^cEn`QhHb2*HUTzhCPm+`;V zuIcZe|D$Y|s@pOIW-g;_75liw-hYvPx7ZB(m{G|6KgJ z_Sjg)JTh0m$ZSt7eWZ>-<}91MRnDYaftfg-gB(2uw+>5*6?a)~7|oo$@ey2^tDkMg zX=|fP5U<*+AaPH-1aXVemAJ=Wg1DLPRB@+Xg1DuPY-_ZgC-(5b6^QYWc>{UJFq#{G z)wXEnJh+bhF8yrL6Z4WWqOJ?>HcGxvQXO~uT9&z1bT{#*8Z*lhkIWB?E}Qei@+|RI zh2m0T)!d+@S(kqqd^wq0HIFEIt>)HICw+##;QaQ4kHshBN=V}S9GXbl4(4acrkS_2 zco~ZKj~~HD89D2_sI1Ptz{ZyJey@Y z$apr()Lh$g9uN*VOB#~-!-t{RTIjIu-#X^D-rE+h?6bADpD)eYRvLv zeMo=SFeo$HDa=<$h&2f%A2l$?uUt|u^?dr5l4m(TL(aP}?XdORC1yM8tuJZXr_?Vc z7EP<71NN3Pv&BB?JQc7{FsAe9lBiyOMo>E_{-ob-ZTrQxNcl+{pxZn59u9AOn)@Jv zzS5y58K9uht^)*Fyr0X}1sQqqkL97=xpa$WweJDL(MJAbB~G{+AjL(xe)Z)QF+ z_|5#@inLW-b$(oZ2063lJ5!e|df72Lx=Y9C)B*8HBMNpGf>6vBj!=h#x8&$7NT1_? z8Q!LgMT|rBBPE{v62>Fq9;98ZRAu@h9=NihdeC%e7VULvt%_0}!{Wx#t4oXxkXJ4e zW0Df@k53C=&t^cQ0wtvjpb?e9-ftHj(dFjWbD2L7Jr_H85_DceJ?bap%yUmJY<%s< zZRb5*CuMN_cVDj8v@hYs-|xtqadlri^=Pei509_7>fomleA1DK{rx^4d+mL#YBf)P zasSsJd|vM5sf;^`%ipinacyd?A+L9j?V5Vc(MiiXYg+X(;{ICqZWGrA+%jXTkFuXr zxo3R;eZTHo;d7ek6bT_XGnwQqi%Yu!`iv;RQc?gF0o6PJ5lKl*;BUu zvVjNAwz+P5h5n^K&85yL_s+euyWY~V%KOLKy%YLMu)Ih6{4EmCi8bZE^gCL6@1oNi zBC5CF(^At;EC0V|wE1@D6)#nIJR$a(4YStKV7zs$_+QfO%GgIn9=&bQqWh1|Xglvi z#>4^QzNg!ss^3Iy`n=!u_gt5=`{V#k`%&?q`f2xj7S;0qKJ@sieqT;%yp*!1a`^i- zfByEbzCHTHfEhVY4UgFPG~e{=)gBR=Y+8d&&{1YWqhe)b)VyV zTuMIi%|mR@Nqq^lz;&#P#;y&fs z6Zem65PSQTlg?iEQ19R^?B!MNi}NZ)h3q=op?A;7poXhI#_%6d{J(SOijT%0UjLrf zs$s)ELrH0_*Y46n(|37~^zRK?@=W6GV*_N~AsjD8>wD#AF`xo!N`}4dRuYcZsXM@S_Uv(Fi zrjv>%`mTq+UUbD{dwL!mQU9MwvjgG3q4=-YcF6HT8**~?ti11&BUP{ZRnzWQ@%aC} z{iK<@ zti88M|})``nNNUM<&G_-}uJMgX_=Gw9l0Lz6}rf?vj+*V|xBrWihf`sr;|FE$Qvv%g+9>V@`_}UB^d7vRPKi zZFueMK2aY9|MRu8``fp^u_am4<|+5~yK?(%==S@Oo{5RC_;;9uY|d7e__qzNcF)c} ztxw#zX2GgaA9eVH@9-fDf4^_bemiyImC4ONniIM3?Cm!_O*{OXxJT~)dHR6JYERrB z-MPctsYkG_+iw^5p`GSFxS`LO3R{;}Z+&X>p6!};Qjf=P#h)k6ReIsc7O%xUJ^MTI zdyVpcJnXjU+;8@^e7aeUWgBPriKib=gX{12_WOSxY&PuBvQo<@)TsLH2JBm?a(^rE ziTl5t*0Of*BfXA~*+1hfd!Lnj{+c#--TTw_y}hH<#7Z~T9*usMr@!Fu*KpLS6`7+F z7hiuxt*o})wr^uzNX0X|a_R_xerL_){l3Rt`JW%sw)>B3Dh%wA-2cs2cK`k$b56=0 z_FS8=#kv364?F+-;uk+QoIXO+_9*#RUlG|pF(G62kn0aVntAxQr!?(GY^A^7pF8*6 zKeeL&+nw4*_YIF8K9oHW^~F8?ul4n2rLO&ReBE!#H~(?K*P1p~`EPZ)a`T%amPc*P zt2Z%p`s=r7+Ou87f4Ns*ee6uw{cqQr{_gutp6?mP-h1U9|8)D{`MrAH(X>(To`+jG z$5OuNmcQS;pV}b+MUAVR^WjnsAxOY6UYU$l)gAa}zI$5joga01-k+g08 zey65C*Rs@=FAVzehL+iXM?U?HrhTLMY}xkRUz?Trv}U76zxk}jSk z+s2hzezY*8R%EZ;Nq%2{!T3?RxBKL;GwlZqZ@GQj<7>`NAM>WBJ*ezw!w-{_HfHqN z9djhB%a!#fP+no(B)@l82z9m!8+&V&>QRlp>il32zFS{b+-nbBS#8jtp*nf-|w$djpiSCa$BwED~vgw@X1QjovZlQK0a{m%~4ZcT{V5g zyMbjIA%}03`*%|x-SKD7+Cw)V-86sm;kr|p15oAC{f=b6hxg9uxO|)ccc1Rw-$v8E zuOsmv4r!dSu1&dLHoki(d)JbN>u3kNi~C)nb2f&JyZ@J!{d>Nhnf^;IX9KGG`@)&! z$M?-1=D4m@lNmEBMm|H|Q28GkQLXp-PrI-A`}mhjn*^^$W_?tC%kDneF#qwq(74J$ zH!XPMJ@Q%~S^N9_*5>mL%gZgRF>g}T$BPe7qfP!&*@27?@9y32xuZ3Q?vAfMFRRLF zO^ZGouv;9twq5aKLa{KAiqiY`S`b_iaTlzP6uJh-^=>MqrwW9SNo!z73^$S+D zqaM{3_ZQzRA3R{`wC%5Ksk3mv>gfH9fmFM*EWdTxE_+VCG@*W}lRNgTi`KNI%Dwr* zTQj$;uQP4%56u=V@Av7Qnl`(I#IrJc*@Gz~+K#IEOmN)hKA)k>Up5i z+VAMdi>iK&y)ypD2X|gQedqDtZ=C&j>;g^eMHtp~D!=mP(PNIz4|YBNWMX{J59lW= ze%9vSz4!F=<`V<=y)b^>gy+83wE4>a&o8`F|EJ%kEp0M4F!abLgQ#C$EBAv9leDJC zY9(B=cT_^&yLTbC)G88xvxY(QKKtVL;SsT?Vnz*}(Ta9Z#ozm`-1X}_yw?0&>bV@#-q&!5o0rO)K= z*KKI!Hu=AttNZ+Y5BIwL`!DWiFQ(GBSG)D9^#0AqyY0B`+MkzJoHA3>(ykQ$Uw!=W zV{fJ{sQ2@*kM>3PID&1vzNfe+wd?&%(9Z)?osSH9@0(ILV28UYdvf#Z0dZ$PzIy83 zv(9OwLqoBvr7Ma5>0gh0yYB8gs@(D8)U)fWB!$tRQSn^)#ZPa&cj;Q&X5&;yS6;NPSg4-yP9|C z^Dkcfrq1R{cgOzcj}7G#Xz!H$zviiP0euE#4)m)xv`kptkva7D$_qau|C932%xin! z_riy#W;^23Z=$_xB<`6R_dYUZ;&XL7F1zboX#7)u@ScK-XWTdSW-my7ukwpm>>m}O zUH<}mh?W0G8r@s_ll7fGxhLTBXZ{)xKs_qgSmL>D&a8KaO#U_K;Wc+Qy{+kbbg)_l zaX)!;-_h?pwf3r(&vtz@YhpC zIq&bb=kD0nY$m+)SMhJ_G{40=+pkHVu=nmj%K z{>l%sR)VeZ_Zzk6iE@i~ZtmEz+8g_>>%jrM+7cB{vy=O--}=R$lRxY5M#lwvlh-gl zQtsC*IQGk+$9A_ayZPDq^SeBa{oGet;yE++`Q<dZJpAe{p&O8rw$+fS?=MyQzOo_o56RllzaZG144qjO&NaR z;P=T}Z~5y{?0~B8x4)eBWaT++f*(EjefN*c4eiDNT*Y6t%i*avG;DiM=GNOo4vZU2 zJql8GDKX&rH$L8--)PolcF^N{?g1{r;B`SF*Y^|4E#mBjy$yPg#Th<&&(>D_G|Ckqny~V`pS+C ze02Mf*Zew_kA7`vwTO(JZE2^JeO`08&AqR_0l^jMjY54Bnj~z(a8~kdQb3v~*qyMku-*m&|8jEiHHG5;-HIZvR4@S;)l^mY_ zd-|8v`<-gBt#zTy@wcO{o{9dPRr=Yvd!OG+-Et(X&W>I!hP4WQoc2P+v-XQgH*`8u_SC7aU#B*j z^u|~E-c*0TkH4&*YfPKL-5&0-1pz|(apir+CO#kz~p`-Zs|-si#U0Zq#JV7yDCGPoK&qT%eZ(Vp| zr8Xe<m7vor9ofSX(XaB#OHZb-u#`=TkYAc;Tk zsqd1TXV&_s>aeSqbg$8$cXt&3ai@l@9KQUe zkvsnG9X#R0!^mv8^8f4jKH=+nba{SsyH8hd7&2@v^B&55TgPt4&PDsr&pD;t@Z0Lc z=<~eh691fqwT8Yu^q&SD0{7Jwq(wnn-51U={o84rn#pZ{K0r%f6_J6Qhxd~>$_PsdwkRDuc`I%^d8j58OlAc?AJ5PO{!HVV^Eddj&(!P zwc)D2v1{xv<5tfdSLcZppJyMbHlvfK9ajFE_YFCd`pg~vcdg!*`OQRmN%dE%a61~RJKh6Qh?}I>&gmT6i z&ytS#%`wuc!F_q!y(_>#NUnUQ1O<14bZ50apoGhU@{DjFbMGjlzo$8cd$~|`Cn~1V zRd*sr<{~vGMXa7F2K9^xv;f?x@^X%=Q~0CkoOgj#Qzxn=bNbGSpoGUXYc0T;U`ucX zNO3q<8qdO4B$NYlWP>#aov-pBrbAs@DZ>bDE|9^;=eyA{$s%>!ExX` zP~IV)56%a(!G+*c;8t(}_#U_rq)uszz0Oo_D-@8H4p*>&(_%SH)1w&c2)i+Vq`|_J$ zwlr={A-R6WpTu_x3;_QIMR)%(!aKNk&M&R%-!3rUX>}1SNk`KO|pQ8qbn{ zc@{n#koH?S6%Td4(0HW2NH~$J#4Gm38c&uXAIX1V{Mh4>bj^4~F1bcLBHI9%w#wz9 zih4Ot0ju!)RPZ)%8feP(gb}`@m++sK*Ta7XO8C#g4&Xu13?KBQu1BF>!Y{9&hkpi? z@Xvw{a1|)w6CkG%K9PIT6OnrqBv)&GMs3-5sLKx z`-8o~5nx|X(sMv3jP%5gOL|s4piOd$o(=>>x6oau$aM&K7YM0%WWQthJU!poN)?Zk zV`=W?LZm95`Jm)G8>|NI0>#cTympc&Z80cim;;UkmxA|z;x8Fo0Zs;2g0QWv2A=}g zfUCe4!2RG_@Bk>`z5-tY{{&wF%fiz}Q0&(xup0O(crCaUYz4jsb_BP9@-2!yuow6i z7!Ga+hl6i}@t~x0FSrw=Em6-R-$*E*Oyi{84T*e3|9e4l)xxfee5uMx4s}408#Yw6 zXZ65-JTuO9QU=-$AVUrHEb)tN2+G#uf0uiSU+PB~Bp0^UDf-eEYzOuOQ$TF5e120K z2(AYsK=P!XCEj32L$JcP=(ogM8f*&5m4SbG9u4|~W5C|_%mqom1l%E>z7qt z8?Z~l*UO;r^$IBYdKGkln?dT7whbSU)FNoj(_>>ZBXR(4k&ha zCs+gA0g4@a4-^@{4~7`OoB5W8RpPh<3P<=NfAK5VY(ysb1b96-2MjQtFIMA2jO}Ll#=?X9ql1utmQXbO361}`16uwos-}Q98g_Hi3gp>Z1gqvas zmuJYk1@6MHHNAz%1!rv$NMBspO*1`>A0?k6zrw;vJ{J?-440Fx^C|K#ES%`8HC%v^ zUNr8~-dg#5k#bhvy{lVq+@*?N^v1bVmyeW(y&bJb`zLmyJ}7d!(b67XXt*4sJeaccD1XsY$*bsT zBhad+dB(W5xZ&~{^h=x_e58l7O7C{inx6kYJ)Gp*E|)%~bw2xnqHp~{(T89t-^icT zdkI$>G}}?SEGmDSK*`^$U`uebC4B0KdU;=Hcn6(#$!{yDu=J(8C4Fhn&Gbbd^0(^! zDsi{xdm#RC)*?a4(-4F2l7w?G*&_TFN6r_jw^BYi+w}a2oh(c~(*G0rh`yQfDQWm_ z#N}ktNb-9RBn z4)98_8+Z-a0~C4p1kLu!KS#F%-pWDBU3ivq7k#&uyW;}G6;{7|rPr9WQ;qcQ=H9=OaU#MP{BwX%NoxfY*!(QL6MBe3auLw#% zp%Q53>x2<5*$7t(l)jx@ZyM$F)_<}8@VE7P=#Br^4E|rY@c;jl|6Iy2Z<($aGLJ6( zUa7Y$q;R>8qp#9#l%pRq0Q`;T3E=M_I;~0neFpe9NHt9MQ9fWlp*88t_axeO9 zwMU=Pf51um9IOW(0L9K81ZAxF1t|LMfO5zzQFD%?_joGcF7Zg+lX#?lNIVIkH6H(G z^mw9hFAhJ_-#6pQ zPD`*g*b0>Sz}BGjQ`&-|poCNMkjNYB?RqCFy5ysQ_!oDsyYVOe`gl;}FaqobCV-+J z_kbeDd%<)t37iS0fT9^gUXY2bcvH24)b78L!+1koLB9C$TpPXud#WZKyj zoCF4eQ@~rn$3U644e!3RL*Ftx|Qso)c!tTW98mx1%Z*TDtg z+u$OQZj!bfl=>m@{R*xI{gF>DSPNVaHV4)3@a@3QWjS6PIp!JlVGHstOdm!6L?30m zE&BK%DEhbx6n%UF6n)$Wia!1Tiau7RtVADKLst422#P-542nM928uq4UWqzAUB z!Jz14M^N;!8z}l12}*pj4lMe}TC37W)=-r`vc_3JAM-xa>osepg~~A$xriKNK#`-^ z9+Bf*P~`X&D00jLMUEm*k>e>)b1yKBFDX;$ngj$ay$i! z9BUYIWNfeG*xDk;Nb(>V#;bM+5;^kcS|9t~Pj7FJf@5%(d9nwVouMdiU$!{=}^_-qx8NY?oIZ*ur?&Ts6svp!ElyMhrx3ee6 z*xwcYgb`lkB>g~ZcgBYCi(DSdA;&gJbcBZmW6KP;ffW*c4Sy&~>$cMf?eWQkFq$bpEPx zFY(KGH4u^u8}1aG3|5f63IuE`&zx+s}sM}3v0PAH1u*2 zD0;Ej&_@YpoCPj>-aNwP;7`hKDR?uu%o5Hxdt381uT{5<=ES>p11RwZfKra#Ama>d zb>4*NLs{I~LvmH6yyf{CQ0i}OP}-MzU?(sDlyZ^hOBJ7SZnTy|I^Ot`dLjIE1%*E; zSK%iU6#f<%&nADy+0L5S#lqqX<9CTK#RxC$fy9?>Je%j%Ny8|V9qjrFj@V)rDR*ga`? zegv_}+A%|aL{|Fws7e>rJbxwJk|4Qc9YOSszL2v8NMFMp{B-74%AqvaRNT4#sh~Lp&wy3I zv!K)m?MglTFm8==g|yAwi~X(uMnG~2|AGg=Ye30IZBY0R0S|#Az{8;QKfVShgTlA) zZ}J(=y>T{>Iy1=LPB3P03g35v5^ofEFE|vO3o@2)egwvWr@#@QAo((Lt>mcn6AD5tROS4Gz{!yviJ(~iN4RsjqG*>kDN{VGt>uMA4Rh%vHr4R{SG@oL0loDriv z!oA3;4$dd#H?A0d##tK<6S!gRszq0HNkUW zEwC)|yaDtBTY#m&)`ojKur$w|!7`xKOYtx1N~Fd)Dzf)frP~a5nG=yq%C$FmHK=qC zL5o2W|tI6LG!|)&_ThjJ;IB9_n>WtQs=Oj@2=Q56w{yDZ%YYRRH zivP7BV`=9`Q2O6nLFs>g3^E2(XU@Cgm*QN`p-yxi;btcC}4lBk)zQ6}Z_5FXAKDC71BP{!@ipp4t4 z-*GR9tx)6kCqWsvKL^UVJr9&|`^TU;Zcpd=FwfTU`zfAf{4O?C=0R$LGJd}SL>SK2 z;3O~@oD7Pco&pX49|LJK)Hq)3i;Uxw!SUckP{#2OgEEe%PoT!}D?k~?Zvtf;FM2QI z_14*m{41IoNfHb~vqo&v82SA*0sH9taKQR8~idl~nOoHHTg+o$TA zsIvb@>{k*b*9@{K@|p$Gz0w{BUjwtiJP?^WkAU;QAHn&c#G4JC2A=}OJ}d-F3EyB@ za4{(U5+LLIq|$aP`*tNLZIWErZl~ZaptScvU=0x4qV~BkccSLKT7mE&^WJLR0$Z=< zxtLQ?_NyHz>79VIH*`H^4nn0T^;z;D*Ao2Q2IheMz-1t9l(rna7hDNW1ese=?a^xR z8J@9O&R4mXxd zZ5!AFd<&!xqTWYJ13%(<9GDNz2KRtZg4jmq8gMW8Cin?x%K5~bdcJ>xKWV?La_&!k zmiiO{b^-^2gTTRH3dr20YB%lzxATn6bnXD}2BjY~6x~ z$DgDZ2TFSJprkhfi~~o4Qg0JL=?C2leh4zx=iCD(gP($_-~liN{2IIul=L0Y2^b}5 z^_@PkAFxoQ@%qE~Gso-QxHrC6Cw&JGyJj8d-Nf(b8>bAzkMS)v*@Ld+QUMg(C08Kj zCG9{1Q2GZA!M0!{Q2GarLHb5o6L1BHE~$Pka~;l&JU0a;{~}xC`)FDf?nVCA_Ucjm z;jGO7D}ypVk#JHUjqjDo-h2-|k@1Uo$pWti(LJ?(H5Y8k^E^<}o)3!bvcWmvQ{ZxN z0r)()2$b{!Ame*nVlz~FQfAd4xvoO|;V4c9jl*;(8#*zmf>!&X3R*8H392?2xjaQCghyyQ${c|49tLGW+g?Hnaw+G>Z74 zVNfs9$ON|&XL;hx;yw@p zD0CXCmO(i~4s>b;v;x`$P-1P#cFVp4CvuI2Z?obDsewfYZS#;0h>*`yJp0a65F2`@LZK36u$Rl>1YVgZn6`5^@cICUD;x z%mMSDZrmRN<3Q~JWCPBC=H6XSi=xhFL2IBu>S!1=9XbRBQZK`xDb$TT?Ab{u7@L(K zwu^F!8b~@&HzH&mKwG)r1-0fr42ptMAz38Pf>uBqpdHYD z=qPjwI`$Q^brJ^@1UaB^C=SYmv_qr~E`ruTt3)nfK6C^+36-8iexN`o2y#G?a(@W9 zftk>BXc4pqa^M~=zd>7h-V0@Ne*`=Qm468Rfr20hlqLSbVNfdM6gMab%7yZveCQ~2 z3Oa)SN|WIS3Wj4+MP$1MA>IFqX zNzeo+3(A2uKs%tlgxwFGfMnyLKhzjuzE1(U~4ro7g0@_X-G6}bzbo{4O(88c7XbQ9f+7D?{D`<_O z2xtPd0}7m0LE8?Mf4G7c3{8g)LFK1c(1M^y$O)~24nmb4sQ_OUv{YyXv>&SWXa%hs zlnePk#yzwMIspaFfCnfK(q>lBvZ2zmh!<-8IR2pR&=IJ77HL9B&?e}pJkPG6WkC5* z?f*kXS6AI3*pv{1^r{EXzUqC$22B`c( zWCZ0xGx#XbNhokJ@j-K;O-qR9Y3`weP;d^ifP$9Ne}VQwwU<@Uc0ozY$s=?Es=0!A zp&Tgu8PbJLK;gXfya;lvL=I5ED&m2vttM_L4$6YILdT%i&+!cHhbBCa44~jO#0wpR zf?psW=m<1@E#(GfzF0wPnhUKX{`LF@`STK4Fq8qUfObH~plTbqhbHiHS?VkJ-v|$z zaDNqd=qTjBnfyW#kQ2&<;@Qr6fnCr;JXEjgLxB$%s#liM#pcsPL4r@o8P+5;>?nYD{AK=$NGD$?+Lc{o|A5 zjESgDF~i5*k(L-YI4veMH9oC*%5X+&%x_exQN=Gn*48TX)aV`kfA7TDw3PIe5g7rE z`!@;bo0^e0D)Iir;b|!&(_%&i$d}2}quj|2 zQj7--$QT`$m=X{iHK=pc@WkY(*rew1nekfes5q@z-^_q!eKP`@buYR&($iw21}7$S zkbOp4N>X}M=$(&)JO^MBKO45bI(YyPA&Qd30(zyQdBfDf4UtO$nj7WAIi0-|+L`UEj(LJ(vFZIKK zh+gJ%sKp^VdO$>2=jg$qeIlXf0yW9-8)4`-yS3}cJ3b$-KTFK<)u&G=&&x~ z{kwDyjp$HRY0@YfM$0l1~iKZ4``N*?H!pC&@4VJEhQ~2J{2PrlFCVTsiNrhi`Ppv z`g-+?A2KE*Y1D{Vvx9j75rikjWN^&Sr~zR;FEkbjI;LgwAWQg2jc%LPym^$p_a=7M zV>A()nyMk<3mOu*hA3u1F%aSVo%-4EQ?8Pyf@ftlxrI5*1M1y!-N1!}$dN~U1GK8Y z?%V!fb_>Zq(y~?R6Sk_Bk&wuGi+P?@y++LMagaMpDax%pxSE(!V>nP2M>+e*JQK?y z10=3ks2ns5n(Sb{be3A1w~ew4#_(h3O~!S`RZ38Jo8TxuZ{}IM!h2$z#B*zv8jtJy z1m<7GLMAoI54)G@bqD9gbBuW!K!fJ*h{t zVW)kci{tA&5?|-j_&OKF*Eu4-&INfiNci+TU&`0{90AO7cs)NxxqF@y4P8_50?*_$GJ zQe-d6zj=?E&;4o9to1^b5N>-Y6Uv5mK^JTPnd~t$_hy;%78)DxVV(tl%y&wTj*6^V?NcMAB_i~h;#JWEu zdp2ahhIOxo?9(v!W*p((x-Y}=kiH*7_F$NMF0A`3yzQ@$eHF5w!rVt;?wyc*6S8MQ z_DaY;3E3lI-5-&}OZw*Ch(P3H-xp!-iIDve<~|7P{s-CnVD5J?_d3WP2if1y9wcHl{Ytj3ba~w`&0~)K z^17ee1|=rv^19#Ub-&B&e#UM-`}VpEUiWK$u^0U6Yn7_BVts_~3}{zq(ZgfnqGOVh zQevZfvn7gcY%*F4G1dfE8Eb+J&EI)hR*5jiWvmTWPidD)R&*>R4Y)?r^693{ZVZ~ouVp@Ex>?Yt| z)(G1g`~}KH9#>x-)H#C>gtDI4#pJJl%GkamdZ&y|SNXE94NAJk#jK&M=@sNno=x7E zmMf5Uj*&LgZ<>tqg-=O4&y_ZEDI{%?fpMKTZC>+IX`5@cm9Ex9G6$(H<|MU`C>KXp zmG8czGy0C`ACs&K)1GG|h=3{&b8R+{@UihpO71lP2 zNs2|;6Ne|ocP4bFl+np?F=>hMtojzJ3o6f2#x7lmPa4rZIWFFw*IwwVTsQma=iM{{ zcay&V9cCFzy8Y1)Jw3y_3S+rf=}BItJY~%}f&DS!$-1s9`Y6v5PRf&MTJ>Dbc#Z`n zj$`M}og2{{Kcbe(&#hJV>HKIFTNEs->8z>AH4mx?Jpp|T|Bh~o|FFdL)TEek5s4W| z@oMc_(lRe^{ENKo{F^!|{0o0lZz3C!#}Vwb;@--$!Lq7fN6Clsmy#4`cqPBLR_Ukn zrt%`sk;ZdE2a(6ERbq|jSsnG~(Z+LC@-DwGGM@L5PkG*CJb!9DZ@2m1VLYc0zv!Mz z&#%!X5lop&9cvBlCyqn9|FE=}v7JY!rKd%kgzTbHA*4tu zNhOpevKEObl!{V`=lwbNobTMZMp>r+^XqxKFCXtYpL_0EK4(Aoe(%MW*odcdmF}P} ze`8C@V*zYW^1L>S(r#n3$=aQuZ8%T6jSXMaZeMM~*R|W&bc1%^OjZRJI1_Nom0ZT~#+OcBWA8`2EzrRLv0 zgCX_NU5}mPK$xR1ki3TJw9Tw$*N%ZWl6+n6@E$(_Z@XM3d1=-fP=w^|qPK+C4+pQBNnkjvDuP?T&Qy6YHe#Ie3?Z z>SKAwgtEna+rPF2<1v237D3`!AODms)?L9C#zt;itk8Lr@k4Cmp&gSA%jEr-%UzYS zmh)~~EWg#x*h(Pd%`!y#%plu;*np%#JyQA6iH!7O3rGGf$KT%Z(%nv_+@&o@A8F=q zW;}G}se;2F^(B=D4rP*%lt|>U^rMo;t~w7U&vUi=FqHFeYWETCmbN2#mh;ZGFrpMn zj`>JFWHussmWd($CC}~uFY+vD_O;{m)@hG+n>;0Gx5?8O$9c(T3o*&H1AdeWTF?N$`UW$<9fh|UO9ikb^em$yfgiI zxN$CrJN>?)s!Z(k(e94IPXmVBAxzLb~cy~>v6BEBmHd> zW8{Zm;zin$_Ugt}wWpV`>X-}Z0YPSQvD zipBn-YzxYHGiUg#dHL0pt(kLGmIWP$yKIx4>67_Zt9bc6%ipE(n#%ZjmkpP=Y-rNB z=?ZCF?@nXuzTQ;+g&nUcjptlxyl{my##hMRj=tR-ZA2{}y-ED5vc9G?wz1>zw&PCP zZQ8N1qw3sACd0ovm;$MOKGOEj9M&walj74860==b%NVVXYf9tuI!!VbN#AGEG*t#1 z4oQe%{V|vO2kri}z3o4DxUz?3){VDm zcS(KyUD|EZ6Q6{Q|X+grfgXh2M~s!uXER&|A)QSoo;&y(zxq+$foNqwny z{?et-D6_O!eg@<4>yKV8jJFe|Y+j+eU8bf^RCBrIxj<}enL5(jbv|0Vr;`S;jdu=l zyQGH6f(?r$hV^z6+PUq&6`Of!QfR5@|E}+L)`j&t-2Gfv1lfyxE0Oe2=?spEQB^^O z>FB$zxc*4z(gc1jD8IW9+hHPmk4CMq2dee8GyZCoxqzc5QUD=Z75`y7ekt>8>!OsM zKC<)=&iExB(@$=!V*Bod@vHM^U3ijw1`#oTwv0=RN*NLs8X);BitlUhSem{@>R74@+O9p~*ITFbeuU^U*yNM?G$1w#>)H0}b;hoHqBC_* z!X2Ug+B+BazJ=&VqgQn`DlXpmm#~Lv|NOW-Uc#3CVW^#V%e2dBF86Aed%Je$(f!jY z*ZDtO=bQGj>$(ZQt9Hxv&bpmeRZ?Wv0Zb*sg!O1A_K0l%-D3Nt#HJ3&tcQ+ru*APU zveX0T{7&+3*1gU>jk!8KW=*?9yUjZOHSM0F(`)9Wo9?n>EKA=b{Zwvvn!0qx_OHh` z7EDY6#HZAw{EiCiNdIO1l%!SisC2jmR|;rnr;(^-GQA578CJ?c7_I zb$%(MV=ptFErpAJVD&zZC7~?5~;E%5@T6 zW&F6uT1i`e9go?U7rzqTDEd9wzwMino;pB>EB&l{UpKq!%U#3urLH1OwGOz~uES;y z5UJf}FLsD_n=yQnb{ExcjO+Z<+HK|}(_QE1 zx!fDH+l)VZwcE7OCimItlRZqye}ZELn?&~9U|G}rkImwTLco4xpn zF83SSZSwQ8b{qTn_Oa7z-1S`U;o9xZugiT}yQL43{NCiT!!vs(MYP+*pQ7ESeofYH zQ@>_vx3SNB*ZIY+^B-%svDXgQ`F$?;S1$Ka?Kbv1rQPP`4agEH@>ihaA<@p;F@d$rqJf3jXHzRn9lgls9sD(uNr;r$dgb3o1~+-vi5e@06|?=y|I*LvBeyW?oVKu^ z=<qHTr7ZCTUv02?gE_dsvv!1W)a?gG$>-l)?E@tKRYsUnW_FcJCNS#KFh)Z*~09B@ne=_0sjFxF{o&9V zfAY>yZTosAACEb7R7q7HuVm`#n)K~<=uCJ~Pk6%%Flin%B2yQj!#m>D)oyHTFl40h zSG%z{&6&DJCcLJjy#5-Qct<*P#`cRHI%E5f9XgXY&y(Kp8k%??cj!zU&pUL+R+}6; z6Yoif&cs_}bY>jJ1{*SU4UE6yW4!(v7=NLeI&a+=>(Cjy%yZ~WK3;L?Og>gSbS59~ zJ9H)=+Z;NRz5@=OvEOlr&ZPP0OkF)wzLy+2Q-|bT;dcG2UC-p>ltX9IyfoG8udd14 zEoqrLlaF@>d3Ci-ntzJP)R{EP`^4>d>r0YV9iQ*LRy75s+n=cuvnXAze&*UbUY&n` zqpK}hQ~pk5>LhDQch3N?KgovDP0!S+@QTp?wdBT$P9J{!yw9za)K9LIL?``tI#QC= zv3Yn)^uAubxq~f!{M6jNnDTG#VoUsm{Ca(FukXw}T;|O)PTT87=UPza=cVv_2#Y0C z9&+t${F%8uL903ZXnifkqudjC*Si zebO9z114Q2?~*oSOG&HP)~wN-*SYhUT|M|uXP33Hv8nr}?wY!6>UK!0R;q58vJL5G zyUlsy-&{Xb*Cpdl;l(ggFHPC>&+@E=U0+pw`U`(jW|H1s&8a7jy>1gnbh4eNt92(t z4OV$Fbvc2XeSeikV=Hr=iAVA#b@OV&F*Zxp>2-&jQ{m)P`b;<`-&dPH(^gGB*HLzP zTT*rj(sm2`NqJZ1!z#JelN!?J*}76n7p;4ZOufI-%MOj**_6@#%X#(QOS1I+{q+Wz z)E`N^^ySG~C*>yT8p9-DkSdSHem_U5vCT5;&w^35+pI5#X!p(Z!LoiD?Ky7_~+HLN!^t0zH-u2>U?VhKv-=W<@X{Qq2W_HvhJtjXpwA-vF zOWE@k%dD3xy4=-W?k3u8*8lCb+k_Xd-6p;Sd!FMh&k@>f)~`=%w+U~ub{l)o*X{}} z?fl3$SR_Bj9`9)P8OATkubx*~&ue?+w&zdY_{(UwiNB(DoA?{W+2K#t^(S7tP5m3J z-RAm7UFW~j?%4KrdMes;HLHpauZwn@`aMaz%jx{Bb-BNGxzD?<4`QMt_K^2XN&X+z zZe#x`+HLapqIR3|I_vWPhwFSqydA#DFRu<(@fr7e?Kbv#nf^u6W8C*LxQW}ehZvW8 zBy&YMZ|bjngGbz^{%&!d-|0I45*?ZNH~BlR-6nm%YPV_sUF^BN_ul(MF89;gT|k%D zOzoCu>BPPZUFSEs&Yy6d|J8Ngveyij3BQVVoA4uD?tw11d_%^W-vioh@_WJMKR**? z@o&nbtaksT+snPK^G~|Y%eQ6ZdXwI@+HKNXa7fnh%WJm@zp8ed>w{eW6J7oXx%|KE z^8cFa{ASnn=e66UuR4<_ ze6vR4H|_BymwS!Nz1wxYpS{22Ex+5e+vKOJcANHGOS{cI|GJN6jX%=mzA3{#Z}Qhn zyG{N=wcDgW*5w}TazE{I&vm)iYPSi0t9G08-tw589+STY+HL&HJ4k%2%=SLYs4$^Mpe~NY+ z`)_yoKcwBp{-?Fur01>?S<~Oc<$hATjr~?>x9Jbw({5w$;`W}JWzrL(-RAlY+HJ0v z@6(8V%=I-#*=}>bhszzK-NyeP+HK-%@?=)~1&y}d=KN^wHt8w)RMz;)Yqtr%vv!Mr z=l%Ibtw}V;d=g&(&W1nJC;Hoa+q{*TyYjIqvQOSBJ}Q+_$G)#hFy6!0`xilT$oeG@ ztau0a6y;r(QHjy9xMl9Ui@pDK%t;1C+o8!=(n9Z}o3d>--p-40Kds$nY@Dv$=HALm z?S7ANC2wbmYcLx>m2c)ghR^nOe?~<4uA6n{MJsIi*~i#d{(tM;lW})SdN!r>-dOeH zLbH<&+}!)M_@7?n_ksbUf9#e~N#FlE@tg6bI)2^hvu9u7enLgje>*;JOw!uP5xbsz zAbnrimW;;-D5z_BS7rX&#DCR<^NR*2#LX#_yX?dU?Ki&5_kdM;&hKnctMFrchx-j4 z|4cxWVeRPj!DYuj z{ovFoK7mw2{69R#=R%2@%lE|8I#ud{P3xOj)@G%@efnL&FKrJEzGd^JaorlO>TX$G zYl{Dazn*^K-Z}~GPT$_?Zzt0nv-*>({c_y)_=#S+) zHgb5u#9G^?^qO_C*`4$FzH)KVhpmV>w07mnB7u*riU^B1G==9FONhSX-2O@FM-Ddi z88hYCw+FVxZ-`1yz8z<)ZlAC|IHpLzoipG2n6zB!U7KItB;lm{RGRi-fwql{S01q{ zU{k02`CfZz(eLV5FX5fD%iei^LD7qJyzq2hP`Y%5E=!a=z-`U?`OO+=!-+Uj9 zc&O6*{=V|(b`PC+A+gt}nY+qtY{WORls@oe>G$tB?l*DQ-Fv35wr0+@te=#=ZkzWGOEd1n=C~Q!smV|$@bh)U>KAS2&9JY4a=nefzbzH{SycOmqO&WO5NxwOTcy6Vt=qon3_jHd{ z^XKn;@uAO;7Q6W;zR#}8rCzDX@eOkO_gYvp(f{998b$?>VvL$+pke^4#66 z%FC_xNAg}`75>sc7oOfdDKe;ZuIgjQ73%do_9PBppACKH?bX!b@r|<=^sA3?B+Tzw0&ygaL-cep^De{?!dYGHuWEt7}#LwiiVxK z@_sYbUp1`O=fKYSKLwYZF?EK|g@JETpH;jG)vJE=`_l)Kb~Spl&82`hu}uZlFU|XX z^p_>Np0E9G%P~!>oNdWS^g$I#PoQt}Zys*-R+%!NR6CYXbld>T`m(y{3!Nyrarm4^ zn%ps?N8yK`@Ab1~{a8@++usZe3}`>1?}3BI6W87S8{_7yB}G4|VC>OPdKVqN<@CAR zCryZ+X;~%ci+z2TZNGolh0(Q!SKht!;c3HOKF)JgO5gduz(WQ?z^(X|IWK$UsU7Eq9*YlbbjvQFPo;+uHE+G zh+ez{PSukee@ATdTg46uJ15^XXUp0aEsDRlyL3nSG0ngI-LbE#@_l;w()~TVKhy2> zhaGyCTG*9(b)|R8?p6Isn{U_t@Iw46<<7p@{q52VUhc$mmW<7`$C;;o?D6!DdimDA zFnxNPdE6{~uZXHwp$jffnAdUk9T_F6*7)sEQ|4`|eqQ}MXp>dHSF>usw0&Qk>l+?@ zJ}RNl*t$H|e2avicKmpF(Y~`Lk2`%SZSv%=GA!#4<-c=Hzo-6e^+)}f714`l*4)6v zu&Elq=G1C?veTQZ>fZFl*%4#rk9^j$uJs+aCsn-3dpbNYyR7f=;M0q{e)(9n1w7ND z>`?RU?lSAX`1Of>&EIP=b64UL%i5y)+bzdmEZ3*jvi_HLeb;Di^FJeKU&;abzdLvO-KdY}g%%h(oc{2?cj!*ta)LH-rFZB~QvLahGoE`isb7PH zQqMPvSsSvCu`!S8w?`l8|3QTv?flxE9C>l2Up(t6hH{H-eDe+vYlOHNj~ITf7(|Xa zybD*j5YjBHMUY`ep1sfL3>U+m@FnQcdYX#7TO#8T_$s98St}q*VQUqXcqvZvZV&a& z4~e%RI;yog*5FV6SPRL5wGJ{2TOUJ)59=LR1Fna6Ydy;o>qFeZ@FN(a^%CD`M8D5N z-Dj8hFr_sNk>eBm3%5gwXD4LZVtor4=B?e3<|fa-X9U6huq8YI>B6ipU>A58_J&7b ze<;^WUcZ59+AZm6j|8=~*N+m9q$eM2ipX&a|H9Ld>8^DKGK^S1Lb1p9Q0yRX32!kH zsl!{s-x6LiI2)0pnU9r$$_j>bCsrF+26lv!md>yv41uAr3ygqWp`^bT918D+888Aq z4)2E}VIMdNM#8x;3NC_u;q%%}oltH`?|ekR_d~r8MAGYrZYm;2Kduud!U8Y}2Em7* zq%##t`KG~0I1r}5A@D6Y9BzS+Ldw?4fDBF6;}F|fqv2UN2HxUhS>qv}?zSdCc`pgS zJ6Cp1#!nCiLZ#mOA?b9s4}Pbfk%x27LMfj)&>zl))!{tY5YC6~-~!keJ_m=xg>V#H z1SiAiq1b0Ra#+VJ@63>R88)Q-spErOcD$RR)XyzY+QBC<7;b~%a0iq+{uz7{?t)Sd zyCH4N`W$`$_rN`HFZ>SfgJP%s@MhxY(;*op;6YdpegUh&FQL54;}Dc|2O#==5|-pw z(w!StM&vkxKjBeGb+u0G>w59Ge%FKbvi!|;`JuEeIex;Q^gHKaMfe+(^8X!%!9U=A z@B);2@F#p261hs(dj8b!Q&7J*lklZotwQ9;i@%#-ekkQw5VnSeU;%7ponavY z?+S~st1rxe(NNye5DO)J$w&|dgUVVdZqny$FAv~P>O(S=^rgcN za3Jgshrk#(6lTDO;W#(~O8>&e84KWJaGBOiyz>$LjsW$y#Ov%&p2WY{WjvI6G!fnj zC&3zUGHeN_LaCR}z>aV_?5xlCfHQGR|2_xC!nrUF&Vw0nF&qIG!HMvBD1ET#C7m>B z^SgibdwNNyq^l_+$5Q->eU?M1k1L^E^BR=#WfhEruR{}_{vCd{;k}7J32z;g@ZNzE z-n&r3TMs3?4N$@hLiBH^EvYw>zPzv=BFBgL6MhV39NG*k!!1zk_X#xN=-;nr8_o{= z;oaH=C7j(*!ucFZID4T9NB`D5+i(uz5AW6?DB&E263$mp!ucASaQ-S^-{24L*0)f? z`3_1rC!vIM8k%sDyV~_TJNv}tvBQan5>5h?a1x<}lMGEb`uEk@<|`F{c((>Z31<+L za0WvOX9zUm=-)tR8_qEN;oW)^N;nKwDxAllg!4F*a6%FNJ7v}9O1VpYX^qG+0)N8M zuo8R<-T}u#X-A^33n#*R;3O#FMk4yR#@=uXpp&slj;Z()&V*IqbQl0vVMRG@C;-wWPJdKX}8!xY$XFfDvN5W>>&A;K2DD2 zdF^>%3s?tt5R|fS3FZ0$$YFi``}{3-EC?eIIojY)?Aj5^_}djqf7lHs!Z0`(c84Qj z4=DY2FE|PIhA+VTp~NS))xS}-Bs__)C>(*vQL?aIKT1KVk7b}QEC+AVZmHMeF00*@ zwOi_^_z%!-sh{GOdL;f^Knb@EEDfcfzYR*d+KU0{@CEx3Nmo_aR1_Sy<4^v)6BdDY zL4Q~aN_z-^cf;CH>|7T%fc0TxDE=gV@z)xPzjjdkNxc?-Vh{1x3yQz{q4@Ja@fQun zUn~@VNl^TyLGd>Tia(hLi9eZdioelN{7JcpKPdz8Hx-J%=}_`D6V`xBU}LxnHh~*p zQ@9bfgdfA!a2sq7cflaISG!F)>)-6E-}1W4`5yd>J-a|Z*bSD3;jo-``)l{@+I^RH z*VJz5FT{T%?GDoJR#3u~aXl2uINlpdx_pUL|Hjvn-~LLvWImlo62sxaUqu)XrQRgK zAeang98G~zZ_=TZ(;z72Gz`YTN1^m1kHg9E2`F|Q2WP`6a2b3Cz740r_ux$U5u6V{ zfs5d7xELORFT>Mt3A_lG!COi5tFSD59hQe{U`4nVO8@dUtPUj{c@N`CcsJYtIk|(vEoB}K1rVgok{|pqnQ<0T(^KDHco$2~t6>u}Pw6L%oo3){kdkhQ9{AF@`o4nWp`)mwTfj3g9R3Vr;92+t zJO}5%U*J;sJ7f)J5q8E`@DjAhs}K1q0CPju6jolyn!+j!%R#65IoChs=#E@|1B3-T}|S>hJ=*3togZVQvbxHp~mj zdqzQ6ANsOJH}%SZ(!yjJZ}X$QWz&hK!|F1pEf}fu~_4ERdIV3M>LCql~I>01SW+ zK*lgD0fxgA*bk<|hu|QX1_#4O;1Kv2d>BrJ!{J;=nP)7Aqu^U`G<*k+fgi!A;1)O@ z9)OeJ5%>)J1x|zcSO83i{%|I&4rjv_a31Uer5y}}Qjdng#kfbqm*80VGMorsfm0!M zFJlQ@2G_#n@DN-HzlN{DlW-0E8NLaBhijqyUi}?t`T^fadmMa@_9*Su*$=$J{DW** zD`6}68tejBLFo_QfHJ>Y4d=o&P{JKuinT|i9j^T5QNk@k{Tqf}jwt2_GL9xf>E|DY ziIB2T>+7-bUEJg0r*Hz4ac2@d0x6@6Kj5>_hju*^2Ep0T1LwdIZ~>eG7eeVbo`>{3 zRx$d)Rqz(L1yZ&d^fA`kkiNot7k&rdgS2&PBcx4RAHtIGV@O-DDEkcRy7dX9E-O8C z&f03hkappI0*KHkHh;QYhfz_O25(vE`d>yHI@|(e}nztt+X?V zU)sOesSf-ZeLMII429=mZ}>Zmf`35PLe>TNFuVvKgFMue@dV5T$H6?1wSkov&Vu>i za(EM@PN{f5f)ekSurT`Lun0U0{h%)uvlzS;-U7=*?(t?+7CqP9C3?u**J@FSa)QB- zIjYqXM#EO{LD&XL`)>=Wb5=*V5_X2v2`dD?54%Fj-s%Ro!7#WRc8Ajbd%&+?FL(;x z3x9?8!G^TIKClgx^mTxezDO92zCVnGgJD1TDC`fVy$^uW-XDN(z<9U=Cc(Wh8GZvF zg5Sdw_!CTpd1%n-uppFp{h-8K4Gu;zwc z)LrW(7z3BW;cyw84wu6@a3y>Jz7AKyH{b`5XM{4g!8hR-@I6Rfwmycx!B5~NxC54D zA-faa0Y8T|;6B&@9)SI!u5VFg$j z2ErX`Kadg_!F52-8aJas~yp9YiA&w>v@%0!)~Ow{>} zFbzF6wFX0MXbpvj;Un;SI2@99xe1U#o~*~9FT|D^)!-Ab5gZBIz$YPV32O}O2A_iW zLTsK93CBX_>ee{;6r>C?CPJ~xbSQRVE^SRlzZy=1>){Nz8P0-xAoo}^j>5U{44eml zhx1{vn;BQ&ZSXl*11^FM;1bvbE`zP%a@ZNJggxQwFc!W6AA+mlV7La3gm1#h@GUq4 z@_EUOnebh>2)+kjfg9jT_&)pyZiENn2k;1#{C*21zj7mN6Z!&hGb{$T!g6pMtPZ!s z25={A2C1VN?cgpL3O|Rv;a(U4_rrehAWVQ?z%=+J90L!*>F_H!8yIh6c%hZoWJhCT)9=V5M` z0Q15$m=BJEH^K3+Ae;sL;Cxsdz6eXfcVSuhAuI;=oi-tZ21 zKdb>gFa%1zxZhGB3#>;)fT z9`+=B63&G2%x6}?B)Ahwx;}@JuG26b{qJxvEX4-aP*?#z4C_Pj-xP}fFgOx@Bpd_d z;L|W2PJlz;%`rF!(l%hVQ_K;JZ*Z4&H-L!S~@r zxDif=o8Ta6kMR9)S5v&<{aB_$4d_55bC1 z>|G6ty<5P;=-b1uU}t?kT%UgsevLj^>j!E5cz7KBGg|+w*2{a{r&3Q=!)M?oI0Np0 z&%(oSCj1u8g6H8JSfnK71IxnsunJrVYr#dZ8GIhLg)hKva4~!kz61xuSK#At85{#& zg)`uC_ySxBk93;Z0Gg9l(Gcog0N&%kQ%PgouLve9`bycOOBtHBzu2CNC2 z!&A5>&P*ubtbpy&e+XI2WPAeef%{=+co4F; zk#Q1sg}=jYuq+$-63%Tn6aX=%3Z@ z^qR27MtY;Z=fXao2!yeJ!nT1J9%HqV-+1egM3H zK2__7YW*a53H=P{Lw?_ax#8O|4}1?6f}g{}@Fct${sfD_^HAcy1SMT1xgnDueR(K) zdFQm~n}{2I3vt7H^!aZ3d>kx^J^|hehv@TigGa8P4$GpS1-TH@kFW~*b6S5%>q}N(zX5%DsL~5ndSP$$Ew#Rb)Q}+IIIpwz`Nln*cr0dmJtKTz(hC} zJ^?4dX^_3Qj91_@@Ete{?tru5Q8))${;U&VLAU@GgU`cu@CA4;dtq)33tL(@C&#a9)j%kW&8}^g@r28|3Z0Qb~E&cTVW0ODXayz!yxz>>;*rE z{onyO5*~!};Fs_Wd}HD5=x1yFe63#%*(1sL1l|pQhXK&4%>0`9 zz)euXDFh{)O0YiXtHK7b0c;AJ!sf6y41y2AVE8C(4X463a2AyCo`VwJo3I1=jqo10 z8Fq$SVR!gBycZsU_rVkJe)t`Xf@fhg`~}9s3os7mufn_=mW1)JJd}7VLy5Nud~r;Y64LXT!(fLMV268A|xepoISc9L4!6F#JDdiC;SAUdJ`4N7+3+zq2hM}@;EPb=e+5eX8{mBOo3;K^ ztv?1Apg*nkKWcscJD5MC_k|KpaVX*31s9^PtMv`FJ_Npmz8icQ_Jzyg0Jsv4g0I8p z;T!NZ_$K@mu7$^;#B&l#Jh`edZ$|G2KZF7BBiIIRf?eP?7!G&ARJa>H4G+MH@C!H{ z@|&oP1@I7D3=hL)P~v+XN_<=4QS_g|WAF=j0v>`V;kWQdD9`n?cb9Pv{tkbI7okse z+Armv8|H&I!@{sAEDB4*lCUf+1FOJ_@D5lR)`oY%y0A8E1{=W^unFt{o5Su<>Q^+B z^!JC7{^5{4q>L%r{gXw#MEu9u_ao-}*!LsY91lgmPcC3Jiv|VH;Q%%5xj_;bX8doDBov*1Yt$Y`mOBd_O5*)j-yyQ)b8+ z#CIV54blsdcb=6>qW?gWkrBvxAnwieU|lhUI)q%n@0wJ~8M%NI$1sZ#d0%;ZWIcZ$M9w3=gs}wOM&uxJ z9w|&%HIM;_+<>2fEJwB@XOaB9h#N^mW+3a46G*9h$pey%%s|#5M-kuNlsOWKj7F9q zyO6U;<@>n*fg~d{kWI*0q+A5HK_Zb6$YNwGasjD)Ki43`kj2P)-fow%0`f(mvf>iF$HOOe>Fj9E{Ze(v?Y=IPy#%@SBl8lT-<|Dh1{4vx+ zBorBpOhgtV8vki*CY#6O<2BV&=}$X=vr0{TaY1L=e$BO{RI$gokQ3+_dZBE^SO z?nn?)Z47yaF^K=C1+2kvG%^)gk2FHJ9Uety93p<``zU^qdPoG4j7&sUA$t-348lf2 zkr-q!G8&nUEJ2PUXOTRQQ4YwuCDd~mg!DoNAZdxYtifoauhj_ zcUg*n> zz)nawQh5bwf-{iy$adr~vV2=^D->Iu4Zce@yJAEJ`zcItKcSN*H_eiXgx_jkx(QCNkf((>yWL;3FJJIe>CNcR708~?U7`{ z%fCIh6~W)}$S`CqGVus$go}}NNICp$g$I#S$OX|+Pnsf~kY30DWGb=!iep)TH#3=-7zFq_o)NsF=I%iU>^_6q_Qi4Nppm;H!q|QSr4BW78tK@vXI} z)YypN^t7Z_NeRh(d5tet*GlU90MF-@^z-qTXJEMLWZm(h{eR~;KEs%r)Gy7yTDR){ zU6Rw{65@vP-2{KRIxe2?iAE2KxvsQW(eYNRzzE*`-JkE5`nM&p)QHUJ_;M48_76)- zkBLk2Zxqp^RYc#o#E9tlTCsy;t>}apt7ezM{x!R#`Pb}l^`=NoiH_(Qm)MF=4)b-% z)QI4|N$F{=_-ML( z-G#4=-cUeY__}ZyuU?eWY8@99pY->ZbK1e3uCV0zxHMjFBjpjr`)yNhC~@*(-?-=; zNLF}M-8aOYwQEkXvkP$6nuu=ciC5Dbxa)LUT;hos@V(Mo1lyl#&*meq$+-S7qH$Dx^E& zYiFJLn%6alV>jUVbiNsy+Bqtbe)rmo#A(*hlvuvn9n1T>t~n{rVE8+R4;)`l<#q-W z9+mo_j3YOcmextp4>E=5nRsKRBwcKHT=F$1MU_yS!O^iyX0D^Us>|tN6RzW0-A_aa zdnLpN``2vUvqMPTIxwVlo0i?%@rMUZ>n=UR1Q2sW0St_8 z6i_QUrmug^o^}0eM*G+79p_&&Jk-BtB7JZFB>$SRDJe-QDY40PLV?LCjG|J}D_z?x zRnPS*UHg?$Y4HjDqRj;JIsyodk4o#8l#&qE`kw0zMJ^p!r&fUD`d${(Hmg>x2${WI zHpOr+C8Bu^IwroZC4qN&VhW0dh$Zg>FXzji2!H3cqN2l-l0Acy6D)b}_wDE-eQbTp zq_ni81a(TCtI0We_CB}OH!11Cgs7AU?Q@m5t}f?-RCu1gQ8AvV`1qt~PiODvDZJkc zJs}(A9F35hkcQ&u!oFA`wVysHAvPg8A=!Q(qnt8_tkdknzo1awFD|;WtlT`joJ!pJ zz3w{7T^M&d;t8?ep=iFjC(jnjK{maI4{2DwJ(uW`l4Db%SmpW0*q_l>-%;{<%<_jn z))0HzX~|83JRYeoQSnAEX>#l3eU2?HU$y3}S5$mTe(j?ySWtsKIolpo4ttR#3(p>L zv4a8wS*$Uf$Es_t^zCtDqkMkz39FcuHXx3Dcw;lM2{TLe?n+6YxXl+sb>N1TVRnEw8;X+4utV#1SJrPDDariCVv zw99NP>9P;o#zm~`^YRcj=aU8Ayl_iF+?`?*CBKdRct+ZrZgJm4=CaGjeCn?pcOiL^ zJCV)gBf$2bO*xPcodfxTY)E=SUzYBd<>T^t>&{1GzgCVkNgDZGVwN;^)VB6lHHPPW zNLy}%sW*~V+yl$2)-A3{;N;BQIKH`*RsrIK<~ zv|;(fH_Ov@?DV9j#RLWp((o)Td z=JpxYkx6gh)%#y|CPxGJZ|>imvXf5+U-{d+neBTG`E{1n_u4jjirYqM4WzCFBOl;b zo`>A{queIlP9;09Q}qKC-V8d?68saZ&K&gxL|iZs!k0zb}PY2jwD0^h)3>1 z7sR+_?3PpYC@?UZ2~ku^c73_-j)*<8tP7J4Q`TAX(WPHMJbK4KmA8-p)hANi_81vT zC&?k#N!ZGd`qH!Ark>LI-%A{FNFOK-Q)JmK^fQk9d&1QB&^>&C*|dr)Hy;-&UU2k@;Ca+aCOByosn(5BW>qn&Z@ABGK zmsLH<97iie@+#F`BdJgv z@_qoB|H=E%)SSdlvwKb;a}tNnZWEb(HuvyVXzD+2TX)V!WDd)xp)V!lB^r@=0-s;L zluV~C-*ao3-jB^4d+s;dPJ^1W%Difx%e~y?-sp16+??!qukYe;OaGFh%Pl|cQ4X2M zN?s&w@pLj1ZU2{dC{lEnPdrqCx~r*D%8YLx-T=UYiYOOqSywA`5`|;0n_1ONMAwIb$=GaNB03RBZNt zVlz9R0jiG4cX0PohorqppWB;xuHCL{2he;k(=|XRwz^aK!&cEzY0(36)J~Oa>v-2G zd&oC(YX{WP@lLUI|46(6#35shvkplc^VXM;*g@v|h*FPaJW%zhOFWe&5nE;Tn-ZI< zbSHEh_2_wsv;8#Ei{Dy=C5NnUa&@7MZ2PLZU?zRdnq{4GII5sIaoPM_j|5DtFK<68 zLiL|L221*7e)u|lpr=!8KUsg6JSm-Hez8oq|8lq4p;QIAkt#@gY5$J&JKIiEN%Xb0 z|KT?n0%>yh9grb4fZ*$h6iT)&rV=cmx-&&2Vqzu;QWEptcr6lpJquY+spV&wCb~I~Q)lOXP zN7|LNIZt>>TmqCl)uC_sI#;2~`r#I}*;8c&tM*jwezkjWo1k7i#%ML*n!Vb6k#h`1sv&XmH=S(;Yje7ERWBT=4h$Ub zaN$>MnQ1?J{Iv6)**8nyQ3AixFQpQ8cI7X>1CWCuTpdj9t%;Ps#hSpR;|5z0%Qe|N zxV-%B80G)W@*hdu&U7}{_S&0GI^{hkzK(P{EEE_xXh4+oLGC)|h|@byde~)~9y-n# zu>*&6v$+wOuE=)~{I3*eWGZ_%+^$y}pz>%+Oe`5smz|V5R5)4p9Uc9MH!bdRszp7U zlFi(rMeXo7?%Qw!D?NeDz@Q*qqorPsHvTWG&)Ht1#!R^`;~KA%_Gjwz*vdFKh9Od) zA4L4)|oW+gTZ0oa~@9gVy9Q~8Co|rxA^Ew^Iwo-1R@1{R#0dUwar^M+<7kO zlh<#JDKp2sGcL75qTCt{3c5Gg6T-~W*?@yQJzXXnWqh&@0WK4$Fj&V?QFs-h+fOZbV|292-CR)>>Tu#LLo|IsRw% z5zh68DWe$X6lQDd|0{Wv z`>1A(lqHYcU?RDy9=@aN;TpMF#Ubks$q!kvR z&i>LYwXP?m%jYuL)zjC=hZ(C(`McL&rd-o%kY^5=o8(8NZ|HsfzYq3%k2 z_K`XF%dYM^%T?z1W^cNaEOt4hC@C{F=P1nHbfhEg-VK$Uy^SS>swQ?xL$0n&vfFpQ zh0em%SIO5}=3joi5Q4m9*+XhknavnBm1P#01EX(kGpOGi+$%KrM#kTOAm#Q!cm8D&{y0dPYzEt%gJ?!T*OuwR@&*+h?ZjebGPNW`WyZ#Pvtjz4W zW>?nVYF_Eg?bYv%)>d=Afy8&kwfjF3r&=mm67Ln){{Kw8s#cn{malARa-IW)e?-cmBhrt#mfU;umV+bbfq_mtWM2-p{Q|u6ZRZ}& z{e*4C_P;6z*$3Ne?BZA#vY+KhjolE*O+mRG#aUS}A4Ost0iINBq!m)i&# zK$;I<(H_H{3A(IaN?&E?b3K6FMNB>w^2pUl2K{QaIl<{aOiqg`$N5PO(?_8D^Hg`)`~_eZ5% zS}@O>=t!5dAHJ@A_8Sa2@>X}T(eVz}gm-#1O-k*AUQJuN3_`ka+!w?h{bWdN6Y{81c9uV#SO{48b zcvsnGuP#g)kGUs$wy9Ww_s%1x?L5mEl}+2xEyX--lchMW;X3dByeTqk?$wvsHN=xM>65;5v+g^?Td3mCTK-H*vMGOOKk6#%zpo2! zA2$@(|54v4^YCovuvcEs*qtLL{mXgm-&`-{WBRxFAiI2=>zXL$u^G<(&9Rcm$#sqC z-#o`0rZwcK`18sbTbO6(u|PwdhBV>^p#)5d)- zP{s%Qu=n|mjnqC(+qjg}G10mg2%pS+uOTJZb z`?$`%i^`tR^wa^K0kKiZK{vK@%`gxY)V@bfZiTleIJFgS$(rr3NxyrJ`me}?j0AE& z(|%5=Q9E&|Z$zv6M7?Pw1?f-ZJ-=qIn^`hB+t>QvS%Y8k*`s())m`aerQTBQyoda4 z*SXC3w>;M>ec)g9wbI9W+9$=!{9pV@Kdp59FqA))PTGXrBlqaNbE)IMYug@dFTUg% zGdEyEN<2f_GM$C2yIf?1hici+}wbjnI=$d5e>WP2ZmvufX zVfLxhIp=8=l^n&3VPxGbHr}aioOX{~Y5#Uq=5+E%MPd4w^^SJXk2fCukJo(f{Wi&q zIc~ImyXP%0@SKw`AI6~E-S>&RC&nelrFq0sp2VCOBRj|#>0bUhJK}49mdv|o&4K&R z9qb#>!EzhhJ0-pGd*nd@LESwe%tO_)oE~m(dYqk@I^9hc7M|zjp zvhiQSlxHH;+#-b6FX2bVE3(NnXk!sB?F%?ZF-_zr__8ZyFG~O9iy{tX4e~- z-K;Jf@2@mYsr9DA{!%7N=h|av--!X~Z}u4EIiaBJ$FAU*2hvm1{^wVBy!)LzG%|U( ze0}$?$cNkvk$eRF+w(zh{-vHn%KOjd;HSlEo%#lpb?SC!n{<>;j*qfAKDer_K-EsA zk1~h!YjzvT9RIf8$XeBYS&_FNb*@!SKPdg5N3Ut6A2c@4=xL`a8puAO>^Z%|`gOkl zzj^)IT-iKx{bR4W$Qp;gTEB^1WZ&!W_Fu)H^sCveQ7ie&1U~CKkECp~8>6nYMwR|F z*|cHTUKy{Z`rq6t3kZ;{ve4l6YMQM2p#dfjm-nZk|Au^+{xtI6o)7v{v+vjbJ}M)} zX5@Bc4N{E$)VHFeZJW~hmvpAG$02h?b4c5?+fQa+YVNz=NE?@HB_3yAD*GTc(52CF zINQDSr{><)#0WcOY+tEE+P!?|>#)P-dfJzxdv@8*FLQDk$0n1$C3o4pQ)d-q-qXqM zy+eQ3*NPpdv95c`w85k@9$ks?0_kKKL zNZHc8s@;&el*T5|CLQrN)ByXU31w~mW^B~pNapKkL*qUueF`Zbts=ey_eWp zHV-+XSlh_`>f2y(#$>CKjLBK|5~YFW_^_O#qYiiXRCwO4+Z;}=+CEg{O}H3MA2Kf6 zV?==5&QbTMWv{0sJ3Ml~dbVRPF_MXo*-Mmiko`rcPTG!)IZc#5hV{$#68{@-9IuYN z&aK32@6(vZs`c!Z_7BxuLhoOhxtep0cBTEpjchVI=Wa5myVCxltjV48KZ$1zIu(y& zPtn{9KHHB(bBsU=A%l^UwC!ZOZrOW^on_Sh|JJ==Sx1{Ab8hZ0KT}Zc@d7q0K`XqG z`M8vmgngy^!r7JUmDb$ye9B%kR%V@Jc8+>5_J4KJ&3ZdPEx2XRV7p2G<#VzB{XB4Q zz^qXZ#@RLJEl?SG5h*3(Ar6K{-DXUwr!*bo{(MNGS{f?cQE|j+DPiZ zgy~*;ns%YCckD&UTIzAVue$yLJ0)`eQu?LYNEvLrK8uZGW9sI#d7EGUOoF3-xVn9~ z&T%o4dg(hP|0UD^du*rH49J;S^ehPr2X=C{6C(4 z`x!Iyo9of?;~9>}kcvn$B6TdXilZH8<|wCYnmrB8x&00`=XADVnTOc*EVB(~`>N!I>0cWm z2ifxrkqWZzY6Z;s4+D_61Sr+*JAmRaXbnd54!@v`-VB71xrJn6N_Id-;zcaa({nA+Si__Nlg=!YtgT8lW_62+!CMGT_F{j5sW?TRKd`s3&gU$Hj7^islszV|l5S0&ZcvAV|QSF@A zqtDR?{MDpOo|#BC>35Bf|B^hYaoM!{&_Pn_mUV!EM)tSXL8))so%PLCGC5uGa(wbd zK4iR+@zfmBr`h!`bI;E?XIQT05B6L@`U^G3x{kS+j8W@ddpx4cZZBw~)1RIb%+&k5 z{_=n{hx|-Z($frC#hhSyjm&=FUpgl+FX>bBnw*+)XFLApRN#*1<(y+l=HJ=RVPt$Y z`}SLhQh*!`r)rMKmY!9fc6R39U!I=svc;X#oq}HbXWCe-XAXPpmfsm%&wXNPk1`KX zZQSv$4Ra5^)G#|9c~)EI^Gw^V3Y3+9P1E*x9+dmp-4o5z-(mporfg1IB8R)jJH6xl zU)fe{BMnUx86AJ9YmOZoG%{AkC4PBkw(`pQy1^m z^;19C6+4-EU-98~QsfavOk{;4{$i*4rp{rfFy=*ScR8o4m_1LnQ(*ru`LvH~nRb;{wjnR#-KVb{A{%C_&n-oWg&SC%pAdV|XGbYV{SIy$orXO2P6 zwV;&8O72fCHgi_ToLkSh`Js^aO%?o%#yMzS`|Y|M{v8gt z>m>-=+@~=2;|6kbCfR(Xo9kuHS_k{po|w&j`P!}&*yZZ|j#E{0jk^r5bRDH7?~E;b z&DYuAfAYQN>jHR3u>HI6^-tSYTLoloyZ|YOeU@Lr_QPFSm#by$b=qJ4w(XW_fAg$} z+x}u_X+MKZ9Z$>+pCY;gC93 z5Lu3FV-D(18cCm;cm7M~pmFMc5&3bii8I^7mG=p+G+sH!CTSmLf9Bu>BI2lp(c~We zov;%7Glv~^RQoeIy)`4RKhk@ll4f(b^C;u!wd~iW5s;@tOsu@kU#>mN*m@}hoqk?Q z@^02K#V6UZJ`ZGXY96wMI^^5zUtfok<$YrEG_B-N>XFmN?me(8?KivY%rCls?=@LM zwXBvl)H{1_r_QW**iCMA+EvEAw~@0IDcij$=N83{zNUkpDvSMeRuwXBnRO3Q%@ZB> z*2K0|jmP*$vHy)N6BPCt)Z#=93Ntc;lssR!A%Dnb-U!&m)`b=N? zv~0#lcd@8CH6nA9Q$3qv*Ng0*{TlGcUqAaLiHk~4OS1Pb?7nXz*GPXDot_e!#B(q* zFCD9OscGDiP+D6*82w@TKKb66{dF@tjP2;et@v&& zC#0`krTxYZPENtA@;h3`7n2m-NxfDTz5E8@6nY6mZqv&%W|6ktyx-Lx>T;K0vmLv7 z&)0FeA9J~;yC|@mug}p9F%{lE|5Vu(Pd;2|@xeXembE*N=>Ht_%EIr?oqjj! z<9VS4h7KQKS!0!c|DanRs#~^J>Z^N?e6s(h*GF1b3EGLT&)Xf^4`1eg_t^1U>lB{4 znZa3>8{@4Aor|kMq@;6TQec;19=T`RQ8B68= z-ktd>J=guf#rmZ;7U-5|&vMJUp!Da`>L1&Z`?UfS21Gx;L&r``4jViF z*}mbc=V6BgrC)g_{lvo`)o-z7VWrh?ge|7sbS)tMb0y|Jm+RL1hwOXnkLOz5Tb-Hi zY^8sH$I9(>=Dxpj_Ak}vO&?n1QSKKi{fE65ZF~5ul^xh>5Y&1jsuffU!T`< zjlR8D-QRW(za#X?dXth@@m*!5KlIs?Pj5(>S@DO+ZM!`kj~3_IN+xZ-J{$VX+qHYv z#BPC)yjS4R>6+8{-mcP@zxAiC70cfgGrZDAE2mHC@wjC*tSqRT@C_4OHjr2hvMcC_3n$bldu0m;RPA=Ect8RmpGV zo5lb3b$>=g`L3IF=0z)P`Ps)Fq1;tCbwlU<{AacP@lmH&zxR62N@Fc+pVD`K@au=4 zJu)Ev>vG4YKiGEW3Co(K>eY)go_jQ@UxS2F&o_!$8?ul6mZ#{@DEIpweEmSn+cvGq zxR7uB>wg>|-n&HqTdq5%A9&{7vab{vczVF+FWzrieUyIdFHa3vz2wZS5)-E9NnQ2s z9LqYb(pkg$yk3RVW5-55xa`=cADlXc9jJ5I;j8-HAL(ANv2U$So%031($%t_Q2O`{ zeb)Q-e|YBOMRJFidu_%<%etua@AfSIz?P7DXKr6Ib8*79=D+aV@1GLRgxjXRP$Eym zviB4{(&@)T{chuTr>b6+>-l2w9={Ihd$PprBA%o&uh5RDTfRQ&K9#0@SfFj=;+03N z3fR<%^xs39^z}KG@7T!U1ruv+o6>96#b$TTu+QFY37KHBN@z`bKHTGrD_|H0;8 z57vx4{9LYu!%7xAwrVcFzfk%~MLG|g(DTtx*4OXdtzxwj*wWum!g(OJSf61_$KUe6 zKj*^qMo zQR%n885S7Oenj5`2ahMNyZg7NNT;d~_ue;oP|45NuNkp6*P4c<`^};sQ00~J$?B*_ zj!y{OHhW`0zt%g~6R*-gy?p8Zp5346cKX8(y-O|ZdYs=q6_a$fIJ0=c{TCY@?BC}J z%kMkioxB4`>9_qkr}pgnKZgzQJUpg(u4#w(-q|hUe?@?2YKJe*){ZYyVeh@Cj*_1D zRQcW;y5Qo3c^zlpkx`;*jo%LOpj89fn6FR0Qjz6{j-2yn!n`390%K==YFWdTK5RwA zp|vYl772W0RYX|Cp(%VHNR|6t@A$`D{H*B6T^BP(r3VLp&*v8zLw$WZ&h4L+e&k?N zpD|OOeS2VA!l?%aZPB9md%H__ln=uttMaW`HDKDlFV6K1 zk3Juj&}VF2%lbpd#hx)Q?#ay?AEL4YBk;%Fc6YwLRJC%~f@8`r_<}G4n@0 zYky1H*Qe^IiSet`I_-!$ImI6aA|j@;3@wFlyr)Zw{kZz0!!x$d zt%{xNR1p2rKNp_fJt;D%bgt@S#}(@Jyk(tK;Uw?r@WAY{zQ==4FYfx~W7QT|)+5UQ z{Zq$fjLlnNZqlTI_nh>bQ;2n=st;R^zgVtMt!4c$?fS0K+~$8q@LgI}?j71C`aHR7 zN{fZ>`hK%#$KLwnSB3N2sHrP9kJ|mgrd-1d-(D`gGS5fQcli1=tk&ni&iOwDmz*(m zhR=n8Z}HwCrGK-1r^1`>I^BL#lUsjSP-w(B%X(jxmo z$gn+OA72>t&F(rEPaWpHu&TU9yl`gdkSfv53O;tR^y8fyk)DT@e$M*B5rJDzH1B** zuYjsAeYTqRTT#N(w1w~7qz3R! z*QlAh%4}@JK1U@9|CVPj`G@ov+})>QpS-Or^qa*|N zfphn5>OU+ou))w34LfyZZ{>E0xBF8YkG}2GGQa2TKE=b+wltvsSM@xhdex79fBHbu zu10URxfJkbO}^Er{69YV(sM7REU((ScC!|1_dZQMc}?lxy=VMKb^E;f+H)6oS9zoO zx%SLERXv~g`{*xAbUk1D-IimTRyo@;m!*C;=S>k_qwj{o#X8P9%Dr9&xL7`;f^_L7u@~(q9=D5&Nrl{5fG_R(|GP&s_V*B^hZiDK$u& zmu=m&<+*KVEopRR);GT_s)zk0x_-S^*eU(exnF!5eA!KB-{Q$AN3Ty?@u$Rn%`KD0 zKXrD`N3J-~%X#lF^w+vQj1IXz>6IT&UftUE`hs^_G+T-eaBY9XyVnm`y8r&t=nvKH zDedj6mHJWJKkJ$`KW2~4erndlNn>m6I{PWkJn8z?CU4)olDwP;&N%7J>0J_5zRvf9 zwLiDCy{6?S3wwWZwQbX5zopo2M7|U*@#!}6_ErCyxF>4zg3H@?Yrhb`$LRX#jL2)d zXHB}Z*SisCy!rgO3(>`_?Z4jpo{p2dv0GtxwVNu{h!T#)w5y8`>{Vh zx8=JwQ${e}(DoztetgE#Ex%6O*kgIm`_|_#pdHiZP4Can0COe{a=@`uF1Bv#hWfWZbJ+q~Uyj_b3=m%os^ z=LyceYV&#Ba^D>A$e+Kgp4qWupRsAfDd*aJP1DP3zcn`f-vtx?e7Nw@dvD+yR@!{u zx-OB8CTtiVT5|hcQQgM%)5lm)sOrx@6_e3JrQ+2ZPE7DZ5tbY zxSaT}*7djdq;`>A*QTB49@yc#fA?=qyYvKOsgR&151*ZQN!OGm{iZFMaoOXUX-cK( z`sMokx!BNO&)YgH?3T~MB1hiDIu&_Def;RN(=JGx^ve7xBi;(D({>AT_zq&edqKU= zgUVa3pR<2a>Z#q=b)x*}dbF=o$|t$qu0IelssF{vTVIS*YFc}-KlYZO{iohn`l%yw zSBtAxmvy5(*Y&7Xmw$afbkW?o>z=swlkH6!??D%qwtwzD7xa2^?ciQb-#IWX`Qk-G z7$0i;@!u@@@$uZJTkd^j$gS^;?;gbc5^OCoB!}>`GU!P9*eYhNIvhW*iGrI$wi7k-<{qv=N&yz0%Xem}2A*!r@c;~Tw1d!@~P zdT{2<3%*Q!u+N0o+L!J>kNCT^KRp)ToORmDdp7^;gQba2UD%Jf^pBEwmhIiM-W8WP zIfL;Q|C`@qo=e{o67=laE7$Lz5;;EX<7dX+ zJ?^QU?32;{OlW$u>xW;be|>w4e%q2hy7y_mtFG-2xT197!XC>a4-_0YHz}v#xAZSc zsTkmC=$+?B^Lu_>@3*}>^INXhYb#GETn1Am)e4wuua?6X8~5Umn3b-rrR5$${NB(= zWCEP*FL)NN$;QH{ru%zogm};i(hb0dmgeATY z!0nBDi6709nr?(cvC!d&KS@BY<=7Wq0oQ@wginT7!8EU;kIp0S;w`upyc!n&#a#T4 z0cD2&@_Z}#D*pJ&!E3d={=W`OewV=#zTDf4d+|rg&~C$@IDU&iwP6WMt{<^4`LPd{ zGVmX`7yLUc?z2G*Zh~MJkTeIwG;8{rU(fq~pMp=poJ#IPC>Roc>=E2c z{So()7ryY<@;lvde*vCId1siRRsy-s!@iXBHZavx_DAS)m;g87p0cg$4|T|s%sq9@ zBkw#CmiI#0_LRVs4bQD`CwLlsA$$kS@WMl!6m5@(x+3}Mc@e$@UJPFfFN1r-pTMNi z!_Z#E!DkR(^2`$kllPvs5`TCP&kMkG3KT|K{wd`^;_m=*ZJ@oAXB%OuSDWCb@Mo|M z-VC>fx4@)bZG}_dFX1cTuV6{vc38sN0ZX_WfNVw(zx(q~!fnCtH9)Sllw0ybeF&3Q zwGJkY>LXa%vGs5-_+vO7{shi~H^NuLo8arzlG}(@9$vA->q;j_)A#QCvi`w1Hnk|=PaPUoW$=i zAXh)~U${RU0Vf&nL)=X_+(~{)zWBSFa+0?lxdo=osas(QF9vuX_J&6ptJ043B;UoK z7&sVCfaN{*gQeZ=4~swZL75T$5`IhgP2f2|uDzsB()2S-b0B9mbou@jmU_1jmU#UM zQ>N7cxD)&vEbr}ic$D#6-iJKD1>O%!dH(~RZ9Jc6Jb%J4f5tF>*)W&*h69O!#7W+F z3GtP7%h!(426(7r$_9)57@$bF*q8Dw>67-)*WM4Q>wPan;RcuwgC)P@UeYV~K7T^| z{E=||{W+KLurBXg`$L{+f8<{Lk$dsS24W0<#_@Y_ZExJ9ZI|muxQ z8}0OPp6xd5IY^|mQxv_5{*pFJw?i#p+787#^Q?yD{tKAC*~3^_^3QWFEYB~2X_Iw) zrF>Q{Xa42075$mqw}z!$oeN7kC5-e_y=mLTZ^?IQXO{xGPNw`3j5@_AmnZ=65GTb( z1wCG90+VN|DNNg{PK9YhRdcvE+!Cg3Q)j`{Ep-}v4SYH*<@zq=cPQpkekDAyF9k{LUkNJP zCk~z%%qc4s_O}}L6AoiPAA6EsmtkMG*HjYmzZGlt1HJnp!7G z<#F9NpLxK~o$<{@-M?0LHy3;2 z=fkkPFJJkScN$}aSHN${_quR*AlE$FcZuf$nAfVFfu-Lng$Kefz;^f*SjyLMd1m;R zPk{5euMd)dT#Me9OtY^Zho#+p0*-{|!_p7Sy_7$>7k^8D@jWo@my{#2LgfOvr2Qcp z>H=8TPnc?SFk8SlR_?ccfjAeC`BGUwR>YG29vM0e69W!QxKBmwID-uS@TR zlyn`^el#@RA1vv41op+-`z<6rS5z{l_mB6@^n((QX>dpQ4mbv$4ojZRfF)1m{wnxx z*a_bQkA`Q$li*qKRO5aod>8i;zLa<4yDj>AE=N<|B|ml<O7CE>yy{leYa${Vhf z8!2c0@3|}G0b|t-mh#ozC?8YAu(j7+2I-LZ%%2)3=3F0>pOUW|UOn2 zmVV<4_%3)Wyv;EG1>VWM=))y1J>6iQ>HOOc4>sA`9i9%C!L+ezIqWMh>F0UlI{|Zvum5}N zLOfbw77a_8zQl-E8F^;t>C*bUWc(@Z&LYg^T0;`M!SBI|@cXco?+@S>{t})He+5guzz+{?gxU_@ z3(I@HAO0GC0H%z1cEZ2HKf=Gkzr+85PpQQ`20j(u51$GD3Acq0z!$=b_M$5s1owe! z!O8GR@W0^NuoJEWUkfvr^pwE$;7M?Ocskqwz6Wj$KLFELc;>;Uz>mWr@C$HL_${~@ z{2tsKW{js=z+2(d;axCuRnKm?CES>Ia~2!{+h93?*9w;R9}NthV!CgXdRrT__CT(e zsi$OzS`42LzXFS!C9tpj7<#i*AoV^9KMXxmO6qUrcB&rrNy2RiOC4xz)GsMBhTbEs z4@t^vFh~P(y-B$iUIj~kwHlW8<83$-eg`gw--Rc`Yv2drweUmm2XLuzFX@{uze%{n z`{0g{3iSuEam$Nm@=(c|MqN!#ofjD zzW|o&eDmcTdA@dAi~XUn+)MrX621lA1~V2{+u@nU z{am=5`%?HD_!n5*BeT`_ZK)sMai0r|dA@P~0Q>{@%rVuEa1^{7z6%z6_ZatY!F#xG zP{(WD5SIIk;Gf|Iu(+4~uj1|<_;>hyct6~R4&zUFE?lb-azFSaIHVqR6L!IMVK-b4 zeh;n>BRkXihzv|M;9l}y*KZnTvPyreR`Q?dRn+fiXwT)@b8uU@6i$VoH`;kAFNSW0 zfXbP)&E7N3O37JgDQ8k{q)f|oCFM%|cEVC$M!;@38@>U)8h#eO27Up~g};PdFm1Lf zfNl77Eqno72zP;tV3A`K!{f;BA{46{PUIO0+ zuYsq+QvavH+u*VAPw+T+KYTr0hw^g=d;xqX+{w6)Htq+&voOC5z8fA3-v{3a&w+1) zABFFSAA_YIm<=z7?}guipMQHpb4&U>ll1chTQLt6dsDeT*RUVMZyO!I__YYgd#6~-JYQd_ z%y02R4S`3(Ltz<@4}(kL;jqMSI@oIX6NzV)+uf5X-%^f4V63Soa9_A7JPbY+z8!83 z&xKEeAAwuI>tP!#?Qbji8@M(6J$xoC;hzQ5cdD~teXhqaPvDtx#zj5GZ%H53vtnM^ zg!ohaR8zP=+!B`bwSuKTu))&L$i0Lkb)bv}TJozmkaSA^gaNtQ5Uy}I+zW1J#6!xk zv0q;AqnG#MU%v=j=Svctin{^uweTQV;xibQ_%IgJ{UCPqd!#PvcKBcLJf2?xzXH?0 zdbYz?!h2ym%os*x!EIp&+zocZGEU>&>iU)g7jb_zd@Gy_Ggnjj@O?0G@+^Rh;CEm* z96n zxE1^;d?EZeEcyQgOx)x>YdPhUFkz}^V8W0wjpsS|CHOUXG5jIC1l|n43h#uM!n@#Q zu)L4g;SCLVPrSg+AOTDPvq3W|L^y~8>A;PdRFc_XDcBC87-Xf5px%K6AdD9n2d03n zAS|1EumHC!!Db-eR%|qsz64|g5y;I3rC=@C3+m%V< zVK5jC(!mt40IUalK^TQ`Fem`C!D_G0mkt zr-GG&5-M1uJlunHPy(id1rir{E7%8`Q2|%tPdHp3zZ^gY#tGcdfyZ$_7iZsJ8@qNZx=V9y^D7O=70?#q=5K<7)R!+#JBl7ItD0`tLYupR6Nwz1d&gF!Z!1m=O&U>B%Ajx>Q7kOszqxnMT+av$j^ zY=zYTN-2~5}%UOt^@1>xOHeoM_mii8C#621$fizG6 zCV|_?h~BsMAO@rY2Pgqkz$`Eyl!3KiJJ=6GZXg`c8N`7!Pyl2wJspVN zwMAex*Z|7GK2YC-I}in8z+m72C147e0~UZXuoi3wdqM39#1n*pC=dgNgKSU&rhqwM z0ayywgY94+sDC5x0YrfqFnufG!s(y@c*G3M1*M=2l!JYs(L}-o(I5#pfE!E!bHO68 z8f*aNU>~SIiSh!%L3fY}a={cZ8_Wk~U@h1R_JZ0s;RZy3IFJgmK?#@&=70sD46Fs) z!Cp}NX7UAufzBWaq=8&84onAg!6L94Yyi7~3{XNqIEVp*fdja~Brpps087CdP!7Vr zB7JcEDTE2aL3fY<(m*a42d08KU_Mw1)_~1m7uXLP-9lPHIOqVMxrO$WO`!Vj2%q#tn)Ji8mH1zu(yFK0ZBjO4z<KSAoR4OH~L1}Y7dg6!Y0{~zoj{0-UPKy3hX z5C9h-{GD|GKafCm4+>WEL3XWRH49{)6wDfQF#BPG)!;h8s#)D&H5;MU()z(_YJ*@^ zKR8&GfTakyrZ);^Z(1<>%7T>*LDyd3I5}8FpAxKEgaoSu@OQat6VYT96e{t}>Y6qL z_1#5jajyKdB3E%?mNPBi<#rZiI4-y#ZLn*!vrsg=xC+xonv1RqaDW-50#axV!NgdE_977%*eC#!Ly>YgTW2e5w@kciyb*GTXfpc z*tE=?{IsmxNN0&tW#u_k#Gn#e#2~jVBJt?6p{Ot`Z5YRbUHR@pS8h>79vsn=qAWB* z@KJ?~w4D5`++v6Gh%Wqd|5)5qifTaNRdSn_n8%k$l5&dNDbC}|uR#UQ{FIDQPI+5# zIT^XGk;fIUl!DwGH^+zNePrb1I}4A`H+P0RC#wdcm70;+JLCA`lIn8h9*Z9X5>sNO zPGmWYiUQ6Ilx*oTDs|J9@5~SUT}$u*2dm?pGNx!i(Q%dr-d}OiG2~jnG4^i)Qv6Cy zT5@qdEn>j_xpVTzl;q_G?9M+Pv94Si@WDA**Bo0lxUf@vNkMMlrB=VaWar5ElE90L zfBaJmGsYxlx$=)I6VOCa=*}uWzL@ka%yAr7ETlO?+4ulwesRG5cq?#jG0G>324v*Z z?gsu!{Ihj%p>qVf{qnN{>v1ag0C?$ejV?Nt!tEcM)QqBQq#p@5Tl_tVb7ft_5Mo&V z@x3K!Vo@;|a8&dgiZ97>GMG7r;;Nm~!sZ==Tce#w6CR$I+shUaH!N}Bg`MDmaq+!} z^yP;glej^{Qsn25lz4lW&b<>;?Wu_a;_a!Jr6vv^kfa}^q$c_9d-)mI?J22ovG!rT z2Bz9m;$w#-$J>(QEOZvo2z4zeq!*Qf-a4>Rsxj7U9k|O3cW&N@EZ+e07(74|zI%kL zFfS#p|FQZaPDgc$jPi3oT+x`Q$jG$HZHjLKQ89{+%ql2Q3g^Ltq7(fv4eXJPvpf{``*pn=`<%BI+yAj$P8_de>2lK446N8%clFG>Mt_vgtAM0J!e1sp>g;&V%B z^3|W=O}w%5Z$nm5mSPUcC!^7;!8XLFw{j(6+3oJ^4Aw0qFRt^I@uuE*8BN>?et%hZ zYDAUt=#7E=H-C2(I(?1!#$&r4XaVw0r%w9iqwY9FX}eG7Vvnv}4Kv-3NPTF8yQ-JX zs1J2Q_iFz_!jcAFLK*VE???^sw$&pD*H^xL`ONZ9g+6Zoe4gFR8yd?vdapanG3qBV zBSeC#;dl!OsHAHIc@i?MYF~^l@`5pZ zGr(WC@?DaD-ZUTVyEo8xH^*Gc$XXg?LyvpMj)yVp zgqh^qJZ;ZUM}LjxS(pT^(`!C^tt}=_358K+$)4S#j3Eit>L(=;rko2yt zb0XelMgfw2hlE#oTS zRP0OJs|QPR!$t8^-gJb>5JrhiWVex*O8i&CxbJY^A~y3pdRY!y}!}8f3KJKevWZp zpAo0n@5`Gb&FVf1lH4a5_YI8aR~Yv```MN3UvJ#E>)>^NXC?bDR(k$UrRQH5_mPJC zUyS?BWVFQRfN>vTJin}=H@-`GF73l!;y#zbl$q`@Gu_aE>YO#xK^CYk>F&fo5S`2A z^sk50F>R*v)J(^;nJ!c_U6y9L#>{k6enz=M_u^6Oq&Cx8X{Lkn&GW?nsyZLdbOM^` zz%|opYo@E(Ocz_Ax~k1|I-BWkGt-@Fs$-o_@o>7K&2;&h>Fm2KLj0+!o6k(=U@JPI z!|6KDY%JzgbunM2%SlyT=TDq3_N(e@G}AR~rc>KY*K?pcug!D;o9TiNR7dtRe@J>K zG|zr2r!et}S3Q@$yryHpF6}mvHmfG*~5L? zpiIA)sya{2bX(hW{v5q7bu*pgy%<_ght`^S0LFe^ni<-|F_~=ykuE={Ppi{ra$uPgUL1 zW;#;MbdD$J@jz7_@vYC5bXC<2ZKfkWP~FgGy5r@bULd-m&2$0J)9Na{cjTg2h_+(o4I3HfGp`=(RwO84^@g*Zi&Y&4>G@h?%Z= zGab``>J+|M_xn}9HDaclexkNt^&2E+y6Mey5S!^lz6!wu{brSKrI_imH`9r1rn}kf z+XiMjl+AQHn|<@Z>>CVb-zb`@`|+yZA~Mr8Z}yF%J?eTA_Qzq5*P*UA?8|zQv8O<VI@K8)x zTk`6*%7G<*F<>r%NqF*nD{~6O*%fEk+oKbKTNME_Owu}$n4ar}(*1A--!o#`$5>AJ|f<>6K9hSA>9k8T-1MnE(%G#%dEAd+c z6H=av+B#p-Ul#+W%kH|0=0J&b`eM$bm3`;#&3`@Cv1(xNX zCGdIhtFXNHrEphx8H~75y$%<^E8rW9`#a$`xxWWq1>a|wKWdmunGo}*VR5$segpp2 zc>bgDT;e+&80$@uucey3{-Hh48!ZAovqF8D0Zl4ZjDwVAlS%F0gg5 zL{JePPx0b^Z9uMbE({OjdL z;w$fW6D;-UGb8@u&R9oLG5oIV&R@5uyl?ag9c%~cd((ZvVcb1#gol0#9o~E+JZW1D zS-Y0OOFwlE?rTfrxTs^gezSeVb0znEVfrYQ2$#V9V5uLJNv-3Awn4u?{P0Lww!vS( zt>7Qw)^JPwZU>8Qob%z{F#V!u02~2d4tIcEF!|w`3U`8^fO%)0m2fotA>0k#40ngO z!ad+}xF`H?xHoL8Mg4`_!s)Q+#NnNLL>Ep991D{+kE}gpz>0Sz=hvr`&~OT==rRyJ z6>^SUbQ;K6cF}7f=huDb)_rHzMb|-f=hj6Jf}CCV=|b?=gCP13d}sGX|AGJcebIv; zXV~Q&zvxAfv;4ku{G#_j^c{$v1JQpVIt@gZflq&d=rr)@ED(JKa@OBpXMr>nK3xQ& zcfhAxpt4>8(dQv&_2rDd=pm@A%j0l*JmxnE)@SGC488Acy66Rvv+9-g4T!D*pS}>$ z72wko5JGr|JIfxZ{*Rauyhq^EVd2wX@psS*(v1ABPB+NW=u0^s{UIwIlo=p;LqtD_ z=$-J_A0hfXe7ZZ1R$oT~^~$HC!%RPiPY;PtM~CR<5S=8VpQEx~j%GA8qLV}PRve4Y z3V%H&HLWM%NIDYc(^wv@o&=kRG=jmv0ZPCWFb6CEWneAX4)%iD6L@DJ3>>R|gqRxx z(~D49C&JO_Lr9%;;`AVd-F$R95Y~UmoB_K>(t~g~9SA2{|G}(V%yl2Ep`G0eY)ykz z8t{Papi#46RRHFK+NYum0E9FTR&KBXbU%$}pmqzMfsoVD1pxjDS8Wo}+&KRqJ7_>` zYSM+BA|1K395U``9!fW_$7FKP(20}$2M^WD8UCcif&Jx~<%d_Nft4Ts|K+0|yII~i z<@n-pqWzFM^H;c}{x>n|e@a5quwH``b@dOV?pyA?`ctg@`|FmU>gw~+l;7&y{}t-- zvBu%h`X8U<>;5a(|LW3zF#k@R`|8FXM-#r~-hAx#chA3LE&G-`@A{N)?A|{SaJ#>C(<%g9Y{yG3F&zG(8VU-W7e0WDDR(~6~{PCaAezaD# z*hS6SUjuJBc=lG&flwDkt?t|*`J>Uj<~>Vfjk&Bbm(@o6Z?+Lu-M8w#RrjsBZ^>&8 zu08(~#(q}2Znf)HyKc4XR=aMs>%Q-#STfS;_wrc%z9loZWX6`vSaQHxv$odor5srE zC~F>N&7-V&lr@jC+Cpm{b#!NUta;Sma~@UQ-t40t2UX{XjHj&YpP2*x`~UeqT(a-< zUm)`+-~MsSy_J7f`SG5fwd&8&&poX6!+U$@ggFs%|g2HGj0`k5Wden?F>yzw&6xPj&7k>|?$B_y6^c zOY{wYk7@nca&P6I@8c22GJdkkk5zuG^5gyZidBCCpMO~Ght+;q?T6KV$j7T{y8Wzf z{OudRSJ(bj=l)p7?ls{~#{a%EVp*;{NAAdqDL_DZ_`m2!b?@|O^P@UHYU2G`epoqB zT@Luy|6XxJ`TW=M)ql&6L(dRf`4L!tRM#H*+SDWEX?1>7R~P;lpZUxGT)EDQ%6}~5 zrxWSEx_9aue^nQLb?*Nc-@BD&D+eS8r2Y>yzW>>$Yg)?Sv{6}Zmn*j@EvwLN&&+kC zrNk%ou@8^#A_i$ig;{Bt#W@(~KP+7TRGczYYqcF!=6j>78 zrO@dn>X|N=Ta43kE|eJOM#c}1S6O)u6_I6&$am$sM!IYfm*;|lXj{av3&C((MBhGO zj4dK=SmMCA3p?>NtLx~j?2JOY+iQ4XCwo$SuYvYn1LN!i_<^Y%yBPC-VCtn&B~hKD zq7E^Q8#F8hbFXnk+`vI7R~VWY8!wgy^o~vOvVB0W!S=Yso~DZ2nq4M28&^GYOK%z?DlaST}~bHwsLbavkLOukp+%S@rTgt0|)gPlpGsRJO(EA ziBHk7NJ&jPjCr3#ha)p1Ki}zy%(g`g>PRl-kbMPRI*VTv5W6iR@#rE&^j$}1^N{Ep zg^hPb?)4r8Iv!0S=qNjyuv~IfmP<+u>z$6mdaM>V`SLP0AwIUhUrx$>>4O0rw3k8~ zkmsV-R*l6d9qr0Ncumv1>8g0>%dC7?eo=N#f!8~!Gs6`Pm#S!`vJ^GoD4Uu?N}yi_ zqGdZ<)eAjukbH|Lc2Kf?Xnb-?;-G=N|9*1UNzwY%4{b#QJ9x;jl+=HRKHvEXvZs0*Q~Yld5~6K-|H&Q%vTww<-4(Un=>{IaNCwo+&ODdxow z&7A$w6${c=K2la|(i^|ON}r?6*EGGn_FH4q|6MTQ&xZ>iz4r#CaM3phv-_eQ@1FERgFCXb9$R$# z^W^W_+Pw6fkcggz(R&}8`tz2RbH~IgwNINnF8gZNj4AicA6EXup68OTxlpO_0}{^# zUtToi`XQY!35i@ipl+|HFH@?oHoszntL4+ry`7wzSNE#jof=%B)F^HK`mknKzdNw= z?sFI1H$U%#9>nKvZGP#y;nN?y@vNS$T~92Z6}f`%IIYs=om-@zb=^%5{E_$2m^->U z?|)yZFSU8sK|g-d{FaD_op=AR>bJKdrx6!QLP*dDKVPR7?l1f3jgXA3*KK?Bd8K-5 z^Owd>`$KhqHE&tzo@W=XytzcmfY|TY{=@l&^#;9rUEa*8>G^xtD>YA>7v8k9!6|>P zPs<&1pl8O$`cEkJkv5-pPvc7#OuT2(*gZSOx6C*zmGMB3`15}AR$o4MW=TTdX%~6I zcQ)CiR7Y*TEHPpHv$hUXZ(q}?(X4mN>DVvR=8k>oPh>v&!pPPC84x{g_vAK|6K%f# zuAf^5hh(iw{raNJ#=U}Nz*`Zu#0Tw~p@dKw)F0KJ@ytzg28;tC0~~ zTJG$A+w^ZAQ|d=;{@%2dSAPEPwx`N=4Eog3?WAr>*=k8VBk#YYY>f^-J80mZQatk^u@1V3r-twk5YNsy!(wWO`N{-<$6Uu<~&pT#(OF3Q?+^Q zfZ2UI^bCDx*Tt)Py%fE0pi&F8`HrA@zwSQJ=$X4ZE^|CIGHP2-s}EK z*jy@2e{Fv6@aNOpHaPRM)5|71OVfJas?_z`{E@Yt>&CC!`@*=^wf3%F_q?69L7OkQ zykY#syW&zdxCV`l>-`4#^NKd#(P~Ju#3u*dU2gj(zTU3%QSpv^bDd;Nf=`|mG}{!rbX(%!yWsav$UJ^!_v zZ>u{c^~KL$o>F_+tzRg$M4OlW=$dl=hYz;fdF_^>{L8PrUa4=j`Glr7yMFj}`q#I& z=(jEDqkErLs!kn=&(OI~HQ8h9JiDxZ;_jn*J?L)TEpSw zLvL*!vG?OMmTviV;>I4!d)~J`e}PhaXrJ~0Z`?kJkkzd49i&c z68LnuD||NG9k#(e;Pc>~a5&r>?g+=hF>pLg6QlaTiEuxdtW`@_SHUCUwQw#>Q={_X|G+fTo&#_ZOg1R|@<^XD8g^qI zev4AG#?z*de=#1V_7(>z2RsMFOi-$I=zqts>n*V#J ztd*zf*8KlO&;Pxx)L&%&e+pwX8Fw~@W&R)cnQ#8DqgiGC-{@d>QcHgR73Tk)44KBP zy57h!HD+e16jL#E3292%ENN2qzD{?RdrW~-Y>8Y$*mp@EWL!F3KDokH9$0dPzouLv zQ_r^^{AJ{mcb#&6|2w;F%fGY7`wuB~r#7EBX1inNcMrUHY262cb}e6%{@0U3tkCg1 zY0pz#-w)k8`||S4FWy-9!PLK=9AdAI=K~M-xMRnnar3_UBP09e=F`206MhlKu4e^20$vH{!0*E% zm)H##z-;( zi~?AeQI|4Tepb(wgY3iDX+>*VWu9Cgd&b2G>EQgofJR)#XTJ4+8MEo_ONN~g*o~cn zBDc09W2bI}=f6il%-q1?98p~4bRb)}B((7sJ$F|jGVuH(P%tQ{hOMIj$!PW{&H*2xd<0=?csK0%Qfs4#&eX zU(bVGFi_XP*TK24^hxw1dVU_mZ=-Ej(&kIN>%g6XTrw}0en95o4d6Rr>2qemlD@m( zN$`>8*~7^c|Gfx{nIj+1euUbif-3eTtiiAC)|{KSU|m)Y9LxcRg*7q%ce_R(JOE(r z|F`D<)gB?S*8i>bf6g8JxA*^-RJ2kxBLN6>{_i^vkTlqP9>BMDUf-BcXVDhRxGDqm zVsJP23*UYKZ{v!wo>NPk?YsPbA0iVF8Gt=DyFw-)X9Dc8-W7O}6UcskZ711TB!2nU z+&y?`wx`}~Z*`z!?Lg<~W_#q#=8k4_ceA;;*&NzTHefa<4s`Aws4T&3?qxO?-=XJx zjn_>4;GNNDzESV%u&gF4@7h*#d*RLI&}MT!GZ{mmb3U`VxY^v=Y>sF)w+?hpZ#H)~ zo1>e}9Z&RLc(XZfpt2&fIkA}x#%xY(Ci9cIayIa`f8MiAGUpUoX&R8LA#+M;E14&I zL@s(Vd@9VmQ?G$Hfn_et{L>@zRGxXdz|CP<13nFwb{5fy#{pNKn>sw+z45*|>GAB1 zmp$>e3;vqxz0!Zw!1^CO>%k4c*7)BV|6AjKTZDD~_pf#SSH}M}xdFJQ$N$m~NuQPp zWc=U#;P~IWAsBO6Q#{Vtq$r|bF6Yk#(Af2H7nAKmU9Be;gfq z=j5Xk|GiZN6mWU92$gu-x~zhN zn$aR8WBTg%5q34s*o7GD1hU6MF6sB4Wdq2%&-Fe%s!!Lh_5soo!%40z_H$I(gD39% zuai~X&?oVuiE?M>uo58a0KV`%CgFW{xbTMLqjBh(V+wCC5!%hh7c=>!nVjED-fOnk z&umYbnS9c0U7)`nSJ!%ZqJ8b;0nHnyr1f;)I%&SSP875C5i>cqna-g=<>Y4a)$4Wq z|26pGKks;`-<-CdQ`@xv?F$YQnXR(~x~^fizGJrM%WS>LY@BJP8z#{8l&5t*%o>{U z?Bqf9-bvi(y0m5aZ2iJ) zoolL2S5=)!X6sO9>m4HJmwjqR`=z8^qZ%pM0~ZG55;?uFjMJsP6M4PQozV^*)?G`( z9sA|9JI={z9XyK|hpz|z@_vVh_6IYczMI*T(1X=JSnIsmeiP*Zh~68~c@vJg0~Xyk zo2Q^Fjr%n4cfD#8@qWjx|Fa~|ZH)fEvUGo1XMd_wA8U=;tx@}bZ`59)`%|}2HM8yK zh~stNKA*~ZKR1YQp9`6lzNFU}gq**0n^#B10C!1FevZ4kF?20)DEoJ$-R>`YdT=CW za$aYV*B^Bm=Kkk(1{>q}%Hh6xFkA;mgN`}e*GDR?Z$DLB zJ;{-(`TXI*aEraOm19ry$CbjCIm`wIE@oqQv$>7g7}spfWHwhZ8|#~mthW^<<# zJ+=;Xj$t+?Hk-3;)MNecu6QUN4o7pLvpBvvQg!nqnHw#|jm)vuz}vxo z&@AHbJ5S zN0bAcp&EszG8Z5IND$*hd+cD=tf!wKi4t={uOv4zeIx0As7xC&zjd*`@}DGzta@Rfb_UG;gO z=EOw44I*;(Vo>?pAe%We6wwn|xGO6o*J;ns$a88rLl(1$k}pvwaiMtfsP6mB! z#39+4>&z%}9`Y_K>nY((f$!4sknpw|;iVhl`QF8JBRo0hE>{z zV3ottj=cYLSpISwk7Od(wahalYr{b%;kVI#2iXT?q9aB0GseHfA=rGm~wYoj2K~*Qcs}i=(DwA!fQX%+6;8DmyWgZJ4b~1}Zx-labVv zETmq2*?0Q<1s^Q>u3MicFJE@6`gU^E0M^R1d2s&;J9^yqGDwW=lGp5Wua4Uj9u2{nSIBy#t^XQs1Mh@o{7?>y z`!Znk*P_QoyFV3P1myY;_Jqkot&6o0EPX>$Saj6zO*2m`xH%jJUjTQ8BVg%^BjMig zg>Vww8BT?}!m=;7FFXQHgk}7Y1WTWE7F-CQ1B;Ft8+;?&8b;ity1=)?QLv;V9TZl3vdx@DNz?fjsua!2g2fJzNgQ!&k!cKJ0J`oDTC$ z&Z2uT)88N(3FmNM2wwxcVSalahD+di@EEuh=9%XOnDK$ z-{FbyAMhj?QN5Z5cY~+H@$f9TAN&ZM3qJ<)OwB{4SO(Su|2-Wso`c^xs{D+PX#>ApO zBL{zDy?TAU=LV&KhLnpYN=J$cFkGI)<;sTx3DMxU{I} zb=l7FK*qKbmqN3+j6XComE~;G&-q`6i_7Rrap_^?%UmNat?)obcxQuFt(CgpKQ2jR zd5+sScp-14YJMCp4lVJ=mmj`;UE=tfoP3A)A$j79M>8Ws<^9VQ3R>fS>EYrrUY`Kb z5viOP+Ogk1$qWB@NSMinJawuOCg&yfC38WMr(SzbL&Y#$mx*-87-YdYSvJ3dWgFot zw6zrjT~^w*#odwOA>j@+!mTfpH7?(XT3Eu}WIIf_NV`jN+%|`^$X!^>mk0{0hJG|* z?Fq3PU$uSZdh#aruXP=+h@uhKX zn_cESqxa%Pp9KERVKe!y*&Z}Axlo|;PcwP1**C7u_TriCX$n-XYbLiblY5)V<;>)k zW_zj3IpQ90zZMmI+T+NUx zV5Id$i9CpQPs>~69E!++kiBTRPYl0}zDP+QRlkxy$ih4r%Xgf#yzMMl+D`foEvG?t zqx}&XnbD7^R{R!!Xo9p12-5N&S!d~qeUY#A@^fdj`}7}G-Nj)KWBpBP=_mRa?ri)v z+HOgk4v!$UUS~+w67@Hc)+5U(2m3*@4#BFX&&_nl&ulOoECt(vEy~y0OH8cmzmWsA z2_*UW&;N{cy7>eU-*@!s0QlBA2lPKG2T1JGH7#Xu+L2ECTjzkRb3p$e=YS5jR5i5? zh(5jg^ZUMiJihZlzH=%}ck~s(f9dmOd{M|8ce_4cA0*$=@iwZMS2KU9#bdpPL#Ari zg6j1C%2-0i1NH$KMXcfI`K2#D^NsjOJS09cu5lBeP(u${MSO~m93Pp>N_@^FFngbz zLOEX~W)i+OOUe)eZrHNE6uHe z`I4mV`1k)8=VxUUkIZ&^NB@@oum4s3zt$R{wFVerOaKdtGjkc>7dfusLmyfHoHf9T zwyvg@0aa_(>0~eVVA^=j31ntC>>0T%o7e|9i;6NvI%%RS)_{E93K5y5T*AeS(eLr@ zsn+W;z8Kn_C0Wh_caDnAbm77t%OVdH95^>Ar{TBgUC{eS?;ZYpdfNtPes+4j1n5?>Lh*aKv=bv4%evxmdz|D&tv z|GTI?yhdX6R7ljA0BA6O+;UeraNS2DX;%w(Kmo)?7~$DS9} zxb@46rS&8hdOh}#yilK+=LJ3ooEJT`e~0FUpIJp-h)mQ&CvK+GbDJK+toV;wG~x5d zdjFpL(sk~yW4=d@(NM;0j=NVi*l>Qvb3^xL$6kHTyf#Y3X>(6ba7>f;eo5|O`{K_F zKL}$CQ>4wihV=M)Z0xINobg`xj=WQ*Wh-SSTY5y>AGtMa_0&+at`@C^qUWZ_OrZ!)3 z)kEt)zJGdh*Xx%z_~QGByOmm@&CA`R6XW~$x~Ai)lNz1%QqzynAF0jjJo!duXGvj}0eXfsUok#;9gv(Lp-gW>5czj7pkvuCvVXRqAwD^;WV`uamazU{GFGp5vZS}^y$5Uqhn5TpYIRke zxU)yjHP^M;Mce=G^p+WS2CZ&2Hf71(Q&xt=H+vom#OXBPvV%b3ksX6pD~*8G+1D@xz|`uYydZocli zOV&`%wfT%qC--Q$?(56rI^8(>zLqQ5yz*~tzHeQZ$VL-3j1Mij{jR8PSz<184 z;6`-n0ry1aU6Yg&eXeCd^bn=Kt3G--EY7t{dKq%ey7Vd>j|({G+DEH@}tZVsc%c=4Zl)lmQM9G&4R zu;l-7|Ks}qto46u{r{i7{-5t{>uRq1uaN(DucrU^>DX&#$m0Fi|0f`1@2Ta*%2nVj z%#Z_+#PSMsx*T!c-*@H|JuT?_E6#VrzP$j)GTwMwk2ktKTDHH{L$~d`<@Ya=8x_62 z%NlRI*Zq~SxeVgWHpcR zf?CHYYyNNb|JL_EyQF1VIzR^hV|9S|+Paz>0Qlzranxc z%y1~tF)W9LcWd*JxvtENTv5+Kb4=ggDD-rmHF`w!hh*hu6cy!U`5w}boX>O74>FsM zrB7^hH(mXV z{H-sW|F}eFpImYt;XKmS-tU{MzI2Vq$a11_M3X()IWnin?JUH8HE9zsbsQvKe{g`o zo~l3ls?+Ox$5V_r$oU4jh^l)19CRQ0#X;hplRv`cRd^!5><-4AM-1Di(|Ixe6&QX< z81im?;kRTxTCRRxQi`$pad{O*SCH%_yZx+7qyqfI8C4Vb)Tl@5p%r@dAav`}I z0x1KNk4g{9p>K?E&aQsTzZ$i-X7=W0-9G-S?N6 z$w$rho&2unF$1sL{OIncwyo-pKTf(~(Wu^htJGva%K0H8XDxj+`Q}G*4y>p(?)rr{ z{d#9lYu|})5A=!N&tWDH4s_p1P3;T0QkMt!V<$hb>9=+F#4WomqtDv)?5DX+n}@tH zEvoVN8O0qVr`77*VL$tdPV~N@)%Me}^T!nL3+r&!&+In}RNim4pT=xnUX%M{ zqG(Hvagykl5go>i%MR*#2{q>Tvfo9oTtlx=)g9vz55`&tu*iiNr)YP> z`RyH}c*iaho^ z!tcP+_q_|tm}Cts?in)r#s+%KAns+z76;^d-Edz9OFUK>?%#mhalaClIKK%e!mD8M z*9MIKUGMc2fBDm6UPz^2uN0ouIar0f9i-;N8^C^GyC_&igLE(s%mJ%GIcV7>SS5iI zwU=oUewTvHU@r*2I9R0u4=4lHW#xb`2c(`I|NfsGS5bkxu*j1CS@J(i{%6Vmv;wGq z>iJ(^TUYb)zu}Y3_y72G{LXn)WO)^ORV#G-rZX_CPRFmv3D+}Fa%=Y)ZVmwz*|QwZ ztX!pKh_e2dro+#0>vcfmp}5wG5 zKh+le-fVoAyO&nudStnTe6LFSEsD1+|JrQ+2ZPE7DZ5tbYxSX?ICtBuHQ!=p=ExW5J znOmSTu0YRXnaP^WWJ+ghJrUclxq120O{L4*4m;8wkeZY=#n46>{i>E@$XP6Z*$n-n z2P;~(BTZ-&&_(ONEx&yf)4SzbowYZOhky~j!!s3sZ zOCQ_`_Q_O?KJc*mhka+mY`8J{EG>JHaQUl{yXMe1-Ki1iwf9BaAY3FKw-k)%UdH?6kIm7fG9#n0h zenh$okq3N%d6LhZoxk}->;>gneHwMMxry1BCs2J2f$EP4bgp4G<}^EpAE*=niUJy{O~Nx%VQ>?`Blni}Uy z+hkpTpB#|!e*oYAC@6Gh7U$$T(!Bq3^4-qdv^=-nm3ehqmMh;~m^;FI46v(e9;$4z z4llFHwyV7V2jpZGx{6#Q+_v!KcD6z2rp(K^4$XnKSXW*_4hpSw#vQ9Z{WO^%a$OBh z1KHq9`pDUr1T%LGvg-)Ch@rix%Kke;goz8p=v-$Q`s<6yAbV_aVWBhMo#IA{$TOcF zdy$!Q&L)dgYqJpU#VpUOS|5+RvchQmFw@OlQ#!cKbefxe3#?T4b60F|wS4-yx06%z z>Rz?GQ-do4|F&06>Hhv&$EWN^*Oc==e6ZclYqu2TUw-BF?8W?3bZYk8J^$e=|BT)| z@~Vj{^xKeid_P;8|McL@nHPMS`e2_4ueC4Tf8H;AC!7zFhXk!$zNXJFf4u$lhL~;Z zH-7pu!tkNm+;Q1gyJk$eZ~n0IAND+#bj^k4-x4tUHksKs;HGK+_uut%%ixf#b*W!p zl-amf@Dimy43hXb_P2^HZZ$GuOUs?zZ=3$@W9&K6_Q$^6W^SuHx-ES7?%B_L9zGI% zRPq7!kf3XC{qcFvd0(A5VrW6Xg5Nu|QtD!DKJA{ymn@ig&!n+?c8qVCaaO8QE^YpP z^HyIzcVF9`WFx8_v>DF$ZuDdD`obrIx`*mN!p*nn|3xh z< z%lOcJNYJfw3!9~kIlb}h8AW&Bu)qFtr2_p1fL;4Dam;qd%To*cecv!IzY%>#6N&dt)RmhlKg=cMOxOnccI&co;7B=8ll^}|vE7kVbmIGe`3CN5 z-O%NQAi9<+kflRL8TCV3kr>}McDfkrp|gxJ0mA?-NA3qN!);Uc=rJb9&M30Gibj+a z721oOZl1~7qwIO~UDBs-SP(=w33^-*th$D-H*{8>jLym=?T-ZYd}1ZDdfQgFz0KWqh;Oh>v6R zfQ%B%E8F$pvdZ4w@N#)57&jJDZPl%*Hcj z<7cyRj@h`{Z2S}GxUQzgMP}n4v+^gH*QCiB7Q@Sbl@UcYc{l56g#XI(d!%@StwYpdV!&b$9={Z0bygq!|i z3OJs=XMxq{9Ma!dH-D`hsKNf<&DUE;IC4hmoj@nD|F1gN4+)iA6@685$=)=E27LR% z+t<%@Nnami&nvPQTx6GM+9jS<=E_(%F7I4f=D{-O?S-i$xhPlWxUw!F^JQ(8idS(t zqjH!xJB(+$D?ckjDFK(vRefWUeMUUlW2dh${>zx;107Fg#51qJFRE46D-5SX#=QQL z(Dh#TY6o+9(Vel~xc}O?-)-D4i1o&2FOJihJDc^bCwlJockdGe?Xx!MvBB~^Yl5;L zd8~7{Mt3|vW9ljA2QG6CRMrvboY71+VkToh(Q8yzK_ zo2ba3-I-SuM8~cF&oBe;JA?pt_`qkTw z44MY-r0;vDSY-Xmo;}*0B}=T8=l7Ba#%1)SbwgzxznRL&l#anwF{(CZ!KxL`_U*o*L%U*}mTZruD;cm}-y7#ejm(*$*yY`t&_k3^db@*@X zbx5Z@5m}4>SZU1{s*0R{?N-{{8#%Kh%(zMRKGbIK!>lj8dmv(P6Lv1Go3R&STr6jP zKq;`ULvx@8`~MMcS8gYx`{x^t%|q$B^qDgWQTm#;s}9}&Hz0%EfVN&NU+1yx>)re3 zTlZcqj<`f#FPE^KDgNeHecsxx1GBT|-JMgM$GV>MKfZJ3xkeu?{g_;L;(d+(WdrdjIM8+E+<)9O2Wz5BA(+Iz3{JkNU8TAG(50+*Ql zhC(TQP6?$B?bCN~YKo~Z^v%zw0=D@n*!&SC4*7h3$aY@9Z~Y?~kP>lS})o9#1J z8+LDfv%Tv(3usH15~5|@u)A$vmKBLMm=a8E@hX8hw*ON*cE~L%i+BRSZ)yJv=4tnO z?U=ul22*YE+3+2*9SIP&wAUu!d3Q~Bqr z4gQL2<%iXF@7cI1`#QfcoHsr%Qfm4I<##JxgF+}SLxRZ99FGM}eQ|p>mQV42IX}0k z)SUkw*Z#&_uOkwMcg-t_YsKHC_}3~r zv5gIimoMkjCOt2wEtzxozPB{{x&0TJ&m_0FHg;cZTN`a_i)}JttTLWWmb3X>+hh!z zEMb!wevHwF&Nc?lCfnO&Et|}5lflMPN7U`l{5phaIiY;|GqOt}p)5xFj!YfgKQy*G zvznGfGJa|N?-csV#$y8v2R6XpQU=&e`nQmoSnHBl+ag;VX!{mz`n2s^w6%4%I(zbd zYLm-ux?;iKPhC20i!ES&+K%T2`)!wGCNn z84vlfxqi)t{qDT_!+$+jI_uCS7yoPc{dWEM$o-Z6j%{CGQc`Ew%hL<4m^ZF)^P1Sl zA;-(EV3S#FZE~hbfBFYkK5@)DFJ^xCs8?4U;NPAKWV`L=mqzq4}Dw0`#S(zdoMR@uttFK%n=Y;9V+ z+T=zp^&Y_j+Un)Buhq5JYl-hY({a>puYtk1nPU3VmJtG9q&9QBKDFzk+VF?yUkm!v+RWv5 zg4*)6jK@iAyKf1o{g2c9AC;Q_o!#~qlkQM@zkz+QhTH7??keL%jog@N7#pM@uMT?h$1lF{ze4WwCGjz*0q;b*CcwaJ_e^^7(bl_3An!L#chz zJ8)a>;lh;uTE~SPG+xaa|>kjx&sn6H?5p_lHDcas6Vfm%#&y%xGGNPM9V#jlPoK_H@J`FGx@%& z?~Z;qBg1GspkzQ~7}IYT$Q&Dqi?uF}wGFnlsUII8dq&>Z|Lha`&(nX~)O@dpFWsl~ zD106dRQv^fpWZU&a+X@@=cbcRp`{{QFXh%J2^EUsS>@9iHEtep_sQ>z`kg83}$W_y6tf*BgCn zISwW>vwn3W&gq-s)f@VjBSm4O@3)P5JW+MV9*Pd?iDst@}jvuS$ zzD+r9PGtbY?Z@SOAj^AJX<57==KR)M<#}*`g8hhPytGUjG zI-j5PkAs>$di#^_pRnYRzW4#hS|_bF*BNov@DA?EpU*sP)8$`%e8Uv{0pcYO+v>bF zlt(djj%2C1a0y{0LG{slP<7H~*kE8n7NV%k7RT>D*UZHC8~FcLwf6=UutA#D0ttbMGp+7)be6q{Y)_matCwOiQi6HO1240q=l^Pe8rW#Q|WjeU6b z-y%OD+r?_1u-Ol6_L5lpD1R?ILA>k%@oKMZeWtcPP+MPftbL<4d*@K|{yehj-q90I z{@-lMlb-j`i~zL#8YT#+a5_dl|tuSxwGvH^7G zJ|RZrzORGtjY!lI&bdJDY;q?jq zx-DiVD_2@%BnNAbcf96&+LQRO(LB8$qV>Gxe*XT%@!C|L zeK>xdUygqMwpoVCo64|i-hyXcHE+^8qx0saY465FJ8g9#Hp!4GbM>Y6B~9P^X)2wN zm#h0!eXjm#{Nio(S>ssuXzY~I7gyViF>8*ecqu1Gzu)Rl)7H>~qq&{?alhudzN{U5 zcf?n{r+-R0f^yJ(gYPc-Ucn&Zs`om~zgPLUv>o>f-dq1(exAHCMHhrx=|hI8OcOdT+;vatjox_g&Avy7%2yX9fC5T~$%K)$&+p=>bZ7d{uQk61Th#M2QNQOi z3+!upH)xN{`}}q_ZLQL%d1($I#o?T+yiC3l#c9k=W8yTYO>n-BW0-{O^Sx6g3W$ee$9D0_bb96%JQd474JZ9jCDa1uXyN1@LRZM3&JM^eJ4u` zD)Kzu&vOTU3%025WS6VwUgKS^TFY@@N7k(mj$ifNknS@!o`0C# zkKE=jZu7aajf=PWRoiS^HXB*2>t$VRY$(r6*>CPc7rgej{aW9!run9|d&WL)!R8ZU zv(>IN_dV|AHuGNiT-dVMq7xEEXB(D$a?Zn*jQOFw*Q#^O(Y%$)FO_v!fM z+iaRP+iRy}rRTkG);!zeKjW{wwN~-dYks&M;UHF*Y(8u@Tl_qW z@0`tsZnIJDY@4aAkJ4tdUQNBYW(ammLW7~$EEO)GEhAK2M5$I213o@*h>lB3Gv<#v*YFe!<3Yz5qx${58#gU|En$ANQm{DinX8GR#!|g z-}s^H-D%%WJcL;i~xcYfG*l&NH4s zP@lElo5YqVft^_b@%;WPX8+LK`@h}#zk%ImtkKFGhvBbg4qWN9qmbqMALIKAhUG8l z=`6~3u=(nac1{0(ptFqRT*kYYF$p@x*m0(Mwgc@;X9&hw=p5M|WWy>b&8lQiYHO~F zot@vLqnt$;!?lyTd+9>OV9JnAM#r$|n^H}xos&d%YLaBqsQN>;0$I7FCpBeXdX_h4 z!76h8;8(*d<~WgVy^;OQvPhBUEeZ6D#2g{Ne!XOyerA)iY;B-T z{<4iPj3=pk(Izi{Xxhvz_aBqL`Qron9sK-dt!J*AMkk$353}j1vFaZ-{m&-v z+w>2c+-=jhcDDR$)6Z;rxlNz2>76!x!lp-3Jybi^IC^f7ZOsc3$jA$jdzS448J8p` zHcJV_vHhQtotsw}kGVf2|7$HD+qgWN?r*CrZFOS2=E69zm23h-pRNDaq5IVPp-XC; zVeifB{{wBjiJ!Y}%8A|fTG6)f(30kDHZ&q%wz@lBb%$;40GqxunDP#MW_!D=cZ}W< z=)(GTgZTk8FF>I4YCeEfe5=xT6Y~LBKCay$THpWB_{{%P{`v2S>@VNmV$u|h?N?nO zA9vfkYpWw{b%E{Mv(*u?%1yR!K3?B;7s@00TaErsWv9|ND%(NuZ3ea{PD^Zw64-+|5sX)osm_R$FyLY`943RAmX|F`L2IcvP*L#c?CJ16ws;Guk-)Qo)X@kxyVS1 zlbx?4v+@cvOY(9`+fVJ@4M&fR$=O*&MG-}3$EG^j1!1RMc5=JIqWq%q zMak_>$tM(dPi{A+Ghu9Uy8-sUuAyMy3z0Ccb}KIGmMPSeO%TKOwo@u#OZ` z9;H{@t&6V3JaM7qcHxeF^9m{4)Pbe?k0Kv1BDr1KcBZs65}r_8yxqrB21VO>L1=|I}Y#H$vfD4I{gNw_8S!SZ1mt& znpNNXyh4h)x*z-xqWt%f!!t(rOCL6D@W_n(%);@R#d&-RrXVp0+g_-$EyqTl0 zQlcwvP;uPIenkZZMN|V@r(&{6cGX*Wu^C>z%6|+BtB@{^33g!Lb)Y5Ihn-S{WFsJ)w5-)4XD9?p&>a1MJ3aWov)j}-dTq_<}l|qE~q!&b&vO~f=B)f@0OQK<%#0l>Urw&RiCGxanW?Hr_G*b^K;qqljgt`Z9Na6%|9hV?Ni-+p6AzA{O5I^$bIUAPj6|Fe(+=7y6-kS>f;znxbMJ8 zM}CuBGNWaO=f3>ut22k%=Ww#wMT<=Of4J)Fmh~HD|1JHau33BassDuIyl&#dKeXys z)@ppacUpej>!SIe-sU(Pj330-^P{#l>0kNG>i*yS_~PAbdw;OzjekALOS_+W?px2l z`gcF}}Hv6ourWsR4=$zqeQl5;<@H(KR)Wdfds!jH}jtir`}UL(~F?(zmDUI-$T`@KSEs49I6&qKFhpPuG;MS zP}kc?@Y-$08PgieuA(}A9YI?k&QqN`03HvyzncovAaTwhcp~I8bP-XU;qYWQ0xpIl zA+Lfn3Q}~=SokUA7#9~Q=XBVfduGF-kZwnJHk<(G!in%wm=7<9XTWP*`|P#J-rveMMd`F9Xq(S*D%ZRg?7fe@R^3x&*fWf7kqVeg6r)e>d0reQoU* zXOQO&+A)nip`|CZ^cb{snaVs(-LIs68$I1NN6E%oUe&8MTz~c?j7J}MaZhh-g_lTA zU##mLTJ?Y9O%&*h`%r-g`fi}F=5W2jNJ!E61@&nBH*;;;SKokF zEN7ENZMuw2r?crqHksTe8{1@Wo9<@w{jkZ>vFduZc`9r&|Jz39yryTjw9l5-8+Bsg zh-V*p{cD6Do33HgDQr5IO-8lpRyG;iraRkwPM&Ec+56|Gk9+g>z3MgFr~Ox7Mh1QL ztX7F(nKUN*krX$3v3)p0Pn@(-hp=`Ra%@$$v`LXG4l5qzTygJC!FXmFqMC%$% zRPL(2Iu`B?kAv-DZ`c*~fvU?=psp1?hiP|Y&fYHm@q}Q05XrdFbA&|8v+^kzi0nGJ zimb|I6I+~1fMy^L@;?(R(AoqVz()!BpZ>!?V835N{!jGMsaI`R>ZPlY|H~_>_-Fvz z?yIY+19Wq|exu%MSlOPZjg`G_4lF`8f3L2m1CY?nd`}SwVf!-uEb7||HuaVG8)tgH z`_dIAagE|gL3y89f!UW9;Pvwb^B|aO6Q{l)^>0P^JDfQ!KX3d5{b}MgmZ1rMD;d+( zImagbLVaY450^&FqzlpgVN3mdwdQwBWX>UkGf2a2p8lb!l7f6~)pw+J$lpw!g1)2Z zJOsLn?4UN;=Sw3?p7-!sIUg_k%eZ&e-jlW0tcyv5O;_02vb;@Zk5%`w$=dPK$*#s| z+$d@5am6-W&89Qibhub`6r0R$(*<8Q{U=-Z=OiC2-Qx7gEqgpZ?f6H(ed6-mhcia> zu=k(XbVQpjXw#*JoBN(Qx^bs1;oh%A#@xO7zlXfL7#lrC`bJ4B-h1<%`#w0}i3X=- zfAY;kbtWK#nSO)S`qx? zj%CxCY&w>7p!cY>ygJycn-@_N@v1m$RGG2SC*szDsZjC#A;I*M&==yc4v#wts((cG zfAx>t07t;bp!!Gt4%6Wma5SWw%JhrSN8^OpXW2Jr9888;@G!{h;T{k3U@BBU$q2~3 z+|jTAX22qt4NKqzsD6_oNTu$ULiL|agR|iUa1K=e$+_@8sQ!}sA*z@AJiHM86)dFax3?RczB^-Nedl^YVoQ|3 zZ&?C0x!I2Q|BWy3#8s~cFroj;e>kE4SG$6AqW`bl7qzN0ZNf`;CwS>r=>O%F)bFML z2lJ~X`+9OO`y7Jh9xeBV&{i&0SbxhD#DCM3ti-`8( z#Z8DAr`q898*x3sd09a56jvo(0E2DV4cUK91wz?JytS1*wva?kyeu z5%#Hi-B%%XvHLeD-Ca8Pnea4*Z=d7%e02fcvy=5zkIf*|Er@sQsh}wLkNJf0d$FKY8q7h z&6yQ801kDev&$x+W3*p@K&kyk{(g9xx8Ky?pWq*_{tR<`q4#@Bf4?-_vkN5q`}F&p zWq5SW)z}JdXvcY3TiF6W2$!XC1n5KNA{1H3Mx*5e>10nS=(>b(j>-#=Vz8i(lPVOZ?=J1 zFL9-bk4$G;rLxkTu!%22zHjcwSFAzVpz##R{a0x`Ig&Lq=#(IY>pF^G6~yNhhIRdI z%?-4*zwzFUb>4g#zS+`hIF9s!e(;ixto?JlKju({6Vj|`*^_jf^o?MS0qsk7*m8Fg zeSy7ciM%;{9zym#7L{NTUjT znRSh~{bQqjpVe3TS`eR;Yo4Ftw2oF$E3PrUFjEfIij)3R#&z?vL)pbpachawy#oJe zjlXQN#FURSgJ-J!`TqX#2p!sA8MUwe*7p9~ORq^#VUv$tQ}`7;n``WSmw9e1J8zbq zHP0(bCp6F4oaoPIue|C~Dz8XMW?^Jnu_-Ub2YRBe6vQhZfxb8`C$mJ?3f2N`j7C|= zqVzgOY0@>PM>)>Dlv^zrhA!n-bE)^<=auFaa$fnHulHW^ zP_X&MuU+%rs|?i7-rQ)s6@K!5e#`ymy=Un8`nU1BN_f=fx%7tm_8z#$OGC)iOx`!A zvI{nqzv_$VZ%*%)zB$dCqF4{qZ_DPlYIXLzg*3GsplSS%2W3$dD3?r z--%Ef!{^~?erh3W!5FQ$oPHPXud4LjSu zVDo9W`L5gS1+n@_$7>w6O@Fi5J8a`kZTf$#_70m}z~-xO^DnXa@Z0oHn_a_Zzp(ko z#5xwhHU`8tMj-PLjeSU85q6ioH)!Aq2aX;x>zqUQAZ_EYWA!tL)we&^F$K1{plow5 zT~Jf`-Fl8F+njJVKO~!9g3V4B>$rd07zCRgWE1t(R9YZUUi0KQ`8NzEKHs!Vjx&QQ zSatC^urZtoo5ER8Hs;xIKR5>-0MCWVP<9Hnt8?K|Q1*$=@DeD0h)W?h59904xeg+! z@rRIo;&S#E!JFZ2@Nvi^a9@E9;9A%Oz76+*AHaR#e_;#wGu$6`OrnkE{GRYW*at3y z1K@-36!<9A*oNh>5IzN`z^CE4@GnqvMZE|$SJcZ;{uQLfjB$7sBEmZVgpvn7h4QEP z488+5K-pOv)dGY2U|h}UiT1~4BNq0@EC{*(Cq_T!y&K@91YvS zX|Nld36FsqW8WQK02$xmE`+_I#xCgm`{1GQF_;RUglX_)cp_X2hrxH?NVp!R!>{33 z_#HeM{s>QpHEJ-%1lED$U>lePkA#%1do;{}Jzy@Bp1?Q~GiKsFvh2y7o;<4euLW^y z2-+5MoVqoxhZ1>iglg9rU*b-Hl)3v5dH zZ_dkbH2gc1KMmth%-msbLOuTvp`I(x&gELp$B=WK_3(B0DSQ`x2G_w2kT}WIF2VU0 z>N~5;-=2Kv$&JeAfyDnn(01e=-aH75XK@c@A72~yNZ1h~);ZmwzRMnPEIba%jyMov z>vPf|-;jfC&*hzWvf&pn3^&3e*pM`oKx0>gybI37kaxtn5)Oh3AkWyj7V<2eTVNPI z4taLY&9D&O3Ma$Ga5}sLUIOogmqXq)_Xc$)sjwA14ITkchwUL{;dX&pus0kJ`@?Lg@>iL8a-=6;s{HE` zr!v*HAL-Kl4uGoP4us9&LGTcm43CDbVJCPf><(MO>*4ZItgA@aK&UyIbrlJLPt;~A zMcG!n5Es2RE9J*>96qr z2`Z_$^a3=&RyGs6(t3os8d!x{v;v!&7uV)$FAm!xvg0q$=fAbh-m@EG#x$E`rCJ2( zWOKOR*~^SAIW!)NeYD+Lwo7w@|6i0H6A8+*RVpsRf1#9$$v$M)3&thQsOFyManA>$ z@9EF`v90?ZjO|VLYZ86GP-*65CiO23nW;mJO)>C^+Gx4=M^X2Vw%>2-{<1}v-#@*= z@E@Jufpt_e-aKcb%K3cqyWjm@8Algz)%)pqe>3G9eceUXTz4+lO)kH#Ux-{Fmg{b@ zT=%fxx={tRJ=YD^k{B!jo6Ua&rW`IHy=}{{>vei;&owu5on#8$W-GMWSZ%g8n+w$o2}Dk3$xikW3`d(Y}@FbDAkRU_WG(`@t*tFdUHv; zJC4q~q%TGun{CuK)@otP=-*W+5| zdL5yzr}*G{e*07H^}2GLuGbAJeHu$fn#|ZTrLQOZx}M^7J;nKLi^-?*TZ1_AXST^4 zr$44ZwMA2-&hy)jYR@~8>Z%ww8?Vb~qYlI0d;d;Vjgx3fg2#M|2l|W5S zi{JWxtfrJ$|1YurUt;~gt(Tzem{|X>%Cdm}8|(j-S9x(UD{RwV(8>1=>*6bG$<*Ka z^B}@S=xqOd*wbB0BSj@SEXh|wd{w=zE^*PD{F=1x-98SES8UoZqVuMSQ&bl5_sjUb zv6Ed?Rv0mQdyoz@aT>==Bj~!wE{^8g{Kljsi4-Uug=GcAD;;WYf~~rA=zfhI@AxL9 zL;L$U;k@yAky4!(q^)_Cv^DY5wx93wQ^v7{MWOth%y4LWPDznY4*bP*%}9^OZlfR0zbU1 z*CV9-IXTHGEzZf#%gxIvA+5C=Ywf#z%2#(#`h({ZtXk;hN%z+C$h07q>i<*zy|>dluO)F+^RKaJ)x8(GrslPkf2p2>(xd$=$#;KBC^OQ(tT5Y)mmg@o zzVx?GE9DiEVaZFA=F(C6v$H+lNZm`{R90DTE{~IR_h|f`DMR{jxvus{{Mo!8Wl@dZ`Z z*i@NBuZO9!k6x2eWu@}h`l0y2>Rk(EmW(%LsAsVCyY7{3^s~`5RIc60qsBgl%8HGf zXz;!2nMJ?bDqHieWaj1LUTyBB^7r%Pdr?>T_AMiAwy}D)v1_)qBy3{}Z9Z5w{nw_y z$7(0B`QF)lr))k_wlR*qjGbg&ufP2{Bjxq`a|ZUF(C3(!Xl!hDEt|c_W*4&ATWod) zo4v(mSG3x-aIW}0)|a%|&208P+kC_}JD$z1X!8NJ`9#`$7HxJ~n;p_-zqQ$yZ0m>4 z+e6Q*-;f3Uk3OOCOB;@Pq0b}T9~esASWod=uiI#|58HewWA#n6+2w3Lls0>&%`PW< zQE!4T&pFBbjjx!o&3EB%Z8Un~k=M zIZmR_B~b0neAonD22iUD=xe)(4>LO6 z-JAd)fGO|;mq(S^*oxu<##Tf$Sn>ZBWzv~Qxhrto>Xt-xB(gz#B6nF~pqaZqk z@#P%{@iTRDApWAxcW@c}5iW-{IBzAa30J||P(GY>;5$&q{Tohz8({&&f78i_Kf#Gm zbE8dybzmWE0O!DF@H~kBpmRRNZ_t?w^<7*8HD?-gU79)57Q#X7Ukguy*TIqSdN>xo z2(#f!a57vCr^DAFewxl2NS)%m32%dML47ChLf&cT|KJl)`FR??3VGM?pW-`)$g}Rh zAi9nFE~M|?{ScPG4X_k`0Vl(+U=D1_yEPTcr}s?Ax8Y2Od>hUTNZse$2v2}F!4u&k zI2hgxN5ETQ7%qlq!aLyk@E&+6ycb>p?}ya+&I9lU_#nImJ_PTE55wo-qfp<=a`;d9 zBzzM-4L^V@;Ae0p{2b1Q-@(gaQcdcASOZ=OYrzX)6F3j@O*j|B{oy6>0C+a!TVQg1 z@(*W1z5!=5916FgZNwDtG>U%P+K_3^Ks6D_1ULRH@@`w za5(z~a5kiFcjvT(x9bms*~ z*Q7Ha>ifG2O1q{_aBD#MUdwO!I*2&r`Cvo*dELVy{=9A*sC3|muC<@d_xTTa4Ez6t zC&I_!5Qv|&Sx?}7IG+6vAbEE17j`4?3Wyu4a~o8pS8P` z^lu(lf17I}NBi3Lp2@r6``WJI@4(--coxrOXnkiHT(3Z(x0yqE5auBm$d5OAJ-P7t z9771!M%KE>^2OEK$W1fpn<5M*Od!l9EG8tjL<#&6N}wj0+;RV3Z^r7x`rnE9|1w4n zr|&CLl<@ye`2UXHwfukmO6s@ir?dI>zE;a?Riv*WvTF?~XCZd)TOKer`j8xZy@b+p zz;9Li%v4|dn@-1$jfX6~c1giskN*b!(ZqLYKJI|&=icyR!A;XH?U{4k ztBzyqW3k!PZMJHgueZ&{FI{^a!LRd--=@ZSs_R*HD{V_q-&Mi!`nZZme>7{b-2>I% zh(7JAfAJyM5n|tU`@)Bz>eN5Od>D-Fl<%R&T}F@V47-ja9djum&@Y3roK^Kp>6Ots zWuQ+=hkOrxar17fGsZ{$H&g4<^_y7#D>46fLjF(dpE@!m5^Qpz%{Rs-FWP(M) zRZzdD+%NyJc#R>qjq!dRr;tWT;U8M{D{D2r-8(Hm?sd`pPqC-k>~=Q$+)3Vbwv4+Y z>(&RyuljCC_Zb_{KMZ?qZC!umGpqZ5^W%$mukHQ8nm7LSXaoElaY|{Fbn!KN^;kOl znmK1~`ta7e^1R>3rT;h_WoG)sCfAn+w`&BMZdD?Q8s;PSJR7nAuBb_LM~UR z#+Dq&=7CRAU^5Qp|J#-5<$NdAxC`2Q){rG>iIbhL zBde~mGC4b|s3@Z7jJ(d>yJckOw@)3L>SPy$op#yD?X=Rx_@d-?r{oigyC=6B)0r?f zx!r*NglWm`QY6E7?!>RzJ*Tj~L`f*(MRx8K8l2i^XsFN7l+Y0VAhu$~&!OqZb(q?r zONYex|HSzJ#Q6XGyzGq9@T83L6_0QXEA|%u@uUAY#{ZXBdGXOMw$-N)%+*(1o63}J zJ%J&*&PRmn@gsWZ!um+#NueNF!5Cp36KsgQl{SsDtxL@QjWzz7RX_MU7!#~Gt#G6h z6sPNGJZ>=7T4Q&cvR`$aui`Z(x9XVQ=yA?9>u@65V!~d8TeLHbd|XsH4~pK_90og* zhrnk_eKR&$+UEOX(@ktTj%|Entg^AKFT|$P*>oIRpVLo9hwA=y_g}WUx{-I;Q;8ufp8W~gL5EbZ{4fm5V!zx zuDb+|fcQT-jLCJMfa!2K91U^vGHaRs6XFW#s-4Jy%7?}%d3CK<2P+?Y6Q_G=%jP($ zL?;XtKLOGln6*#$g9YsOhNRhy4?Y8OZH;j>`C#m?Tg*OF^SW zE1-J|#0|^LBe!u#eWwBAd)g2l@^$U)@!hKGv!yXXD+tkgcy(ieLDvzQBb3pV0sRK>EL_^5UcZZ_}qR(ErnGd#%*o$ZV1|_kuSf z5MDK~Tz6Kor2ZS-`Iq$nV4Y0q`dYI<`?3*ep9SB|{8~Cc79BsBTYiEs;_RX^+EUh7wsJzVGI8W;6? zW!S$D8_qlwKWW^@vV$76JE5fe=G*3d{m#lo)B4$Ub(>CT)4grFeXKgUZSFCfEx@M3 z?`&P&W~15Jy87>>liO@q@zT|8wvXRahnN2B)s^VHR77jpR~;w4RNK+$qN-my!hK*D zI2d+?(#em347oCMyWa%q8+Px9((yItlyv-uVQ=^>>y>G*4)bo}*Dy8YKsy1nXf z?qPKEsl@qpq@%i1=~JDYPtYcvpTmvLulTX-cZS#zT;`iMIzCl{S${7Jo=$uihF~rn z2hq=+OsF}4a-izw@o)zGJ#_G1+4Y^Vgv6F8fkX-XHYE^W{ht|S>HjavPxSx)p~nFx z^#6qZ|3}gP%d5Qj7y!1n|9`5lS8t)2P&fKFgqzW;SI_bE{~%fUSOC;_F4;ENB-ci7 z>Z@0r=K9u>0XSnJ_ImSbOSX)P@1*#6`2lR^TFl{SotxXHU)uCSTVJhBZ?oxnpeQ?b`g+ZT1hFJtI~h5}OZ$%`Rp0{jllT9Zlc* zlW7CbzBl>kd6%pX#xcg~6Jqm8h*zJx&F*5GYu@IIVzX~;qQ03+@ajnB0p;(FgoXs^ zyxOGKt3K@kn?SAIwm+19-yWU-(V2~2kFMQP73kqh|+mV)mX{d9IS``n!WUFf~_+{LZWE?+)g^T#v53Gvxn-|8JC6aLTYT zBk>FN+=APs3>`Kyb;RhjeyMUD9@4kpNROc*eTIip(nh5AW8#REP`?rBeFvxLul_@E zFiz3YXcPle`wUm)i1dDf7MSiI-ab$1jI6S}{4m~_k(~UD{JgB}f=K(~aF#B^%|b(m z^&d8(Und#)05*nF4xSII>Y2k2IW?^AYxc!9WcEdX2B%O!%baA&Xy4Kk4-9pLj z67qjS{{Lgi|5SOut^7a1m;ZzI>kF!T$^VZ{ikAPq4#2ANzhwI8E$IJ~oFCo)r+xMR z#Y^4~`Yt#7Y0n@LYJc!cb8aE+OY$qHU1_Z9_p9Thw_lU?ozYillU-t!-EFd6ykxj5 zjP7yrpDzF6$}9iYXZp8eW*$0a?>UJ+#4k48H+T{qC^j83R-Mo$i`#Tjn`~{lf>&3XemCxvD2I1-K32EZ7OohUho)?{&Gib1|e}(m_=){=4WgX1x%_PbGePbd#{V z^&E=T=_T9agWEe?-^m~(wnPaeO5nFC0o4=n^Z%9cxP16;!v9xegA@AyK!#io7?IpA zZ96R$rIGN2;^OT-9veu}c3wH!22v0S6=hA#$Sy86Om3HsX=MQBn7)$<9k*vxdB^tQ ze1?$sow{8IC)WS|pB(=iRC)1H|Iv4Uc}~%8PNT+Z8QS`)M7|*XZ zlv$dcmuGtO<)SDSll&2Q5R z#N>M%eczzZaYucRQM zZSrka)yTP~kCSuF`k|!7WlXN=1I1=w`atJH*(+{?z2PHJc8jNA3Va==LfIvhFRyO( z>fE*LN9RjE$f{dIP9><%YE`dy7LGXB#}9{Z}Z6)#)MZ*7lQf-PbdVO_!| zLFp&9|HTr}_qgNh|1pXyQZ&i)`qlci%^Ew&iFv>NaQ*({rl8TR_zAZhy>iU1dc-Wf0 z?tBOJu4FLDRd*oZP5P#;=I!#*NSyk;RW}D)RG-!^*Ts>Q?c2~fX!C`(`F1Yd!}t;>E&g`n&kgRm zs^gR4n=bokgX7rdeX@-Sw)F$s^s{*N)7tvCZ9ccQeqEcNg>B5M&DYeXN80=dY(BlV zet79s3kY8QKwY8zq{?Ge`=cMJE|ET{dIEnMvqm1TpYdJIgohA60iyF6y{jJ#vp*2# zKy*uuEp^91&FiEwp+)c_h(2k?hE9Q3v#)uZRBxRP)#qGwZN0F&b)T@-)vMYs9Ni}z zy`J6=34M!F{cX0m$^RwU6H0sqAR+(%LHqp@^8cVH4{Et*t3;|w<5n@8&b7&{haDz)@T3uM zynW91C;#KYb56Lf&(+I6XN-)I6Z0k%{q>_0Hw@k|t;asugWerN`plTKb(79}X8D`T zo;iHXE4?0Xy=XJ@SD5&PWA7h#c)k7KYOx|%lUVYLWDLJN9F>#yr3T>_XSO!T5&Gi@ zsQ9DczOX$^hR7_g%2oDh$v2WEBrmkhN%)FU96Pkdt^F^~DhUjLiS|Fy{wLM|ORNF5 zi>(1hTWl(+xVHbx{Pv$dQZt9W`YrFG{lESEdYa$PzvtHNzuGZ>v$p?%jZZQ`V9(nb zGQb!k13b|2+E$NreJ|Q6Q@fNT~iejx-hKwH{)^?A4R z+kVLaYWwLYHhshDt5z9Tl?5^qvVdQbu_12le_?jx#_+tG2x zCQwvXlATl0$5%#tum;c0kO}4*nc#x=JH0V|?yVa?ORaa^^u_z3ZpYIuAb&BxoHRDh z$OOvoV1hQ;0Yu3F>c2n^a9jKPhe6o|j)Z}1Aelhr-wj6F2_gyEfKsV`i(~sAO#6}W z|M{bi`$@F_iS~aNZ~x;pQAc3^588j)9;XJOv#Qx)j&pZiwg2+xDXeztkJmZ)ddskDK=Y=@xT(fAFtPC#8*ieB+pfne*e@{*R*oymB)7ylMZV$FZyZSDDHt zpm^B?_JnHR_kxlK4uz5f4u_HhILFuq^cPU?-rUEu5gvRP}}mv9gI|64Ny{hxahS9KmM9qVtV{SU_9O4mnd z*eQMepPDxPy-#P}wQOGatFd(_UjF?5&AlSNZF+Aq<>#GsgFKyHMTFhnZ0h6JAL#9_ z+8(v-4WV>=m7Uu3Xx)8rqRpmMcHS1Z_P@gYFQNY@^nYXb%`SZL9rPU%%?&-`f9g zzr*GKxAf4mUg3Yg_C~+V)wSh9>l1C1^yW?eh zy|etgtN%H)VC}+PZ;Z0dhs8E_Io2^RyZadBP1FS|2wr{U)l=ixmwoObf;Rf!T-o(7 zSDLx0`asoVePJ?e4*Nsqt#Sv!mT(9}o_FaUb&%)HT+@fZEcWTgbBmztgJ(d=__JXL zI2WpK??R|Py-OhTMVa+>dctei*Ie7TLi~u#*kpW!&74vin|$TjjF&!#G085zRfNZm ztnZB>n&mj_xk=S=$ZP&U`b6C1{|fQnNyz_+@jr?2KfA~HAF9m6mMDQl2_#A&Q38n) zNR+@ItOWA1GfKmgsvCLZM`w&@iG#{xa>{=R=N0Fdl~(<^VqDLzHU0;?nx~}1$@~|y z{V(ttGLv8Mp5+ka&l)By!~S>rNycX=NauFh{-nQEwf)JD*k=2a{V>}07x)hU7IwZb zjD6_&8u#4&L5+)RoYniFkH+=5>VbrvudCbU<0fx9&hBF8JGhPdjQ4u$PknlhoUnA* zYiYe}Ts4p9xU0=Yn6UGe+`16Emu)UW+4&|A{CdaKN8{M9Psku>lbug&0#|=UH>s{4v2SaRjX0E_k?Qt9aK=wF_=r`Tee(d=C z-)gclBYyXP!v2@=|4aD)CGQ^gzdxA#Zz`!>MgCVmm*oFqg5>}Cjm(^ZL1p?sC;z7# zx$&f?Szk@M{DSwVemCssO*g&yc0&H&-Q@qd<~cU6{X~O;qo3_{{x`R;>%HZzvl8;Z zbIHiIp;eBvyUax{`G3BGSMQj4M#r(gH(?Gz+xE!+^!b~9{(ca@UDNL`JzyaF$?!yY z2xOfq!3&OeZ2de(kCPP9`Z)~ z#^Tf^t-;*cv9uA1WB+$cAa3n{)cPOYoMw${P-OBC)u#9E@E3;UWtS9{7Uf2g+l)9O zc}OOE$$d&oa|*KZb4tu{LH}6YB(p1-&{6ut2hookbq(}m-OTf4*R}8GH$LvX!tvgm z`Re0JCg`9hPOZkrc;}VmM9NAE!+9pIhZh$q$|($UX!&@1*|;~D@9?dzQ{T$CviOuH zTNV_)a9h_q@KHTN{T>^eT=dfAcU^S%{q6fd@!SD&oRL zg*hg!xfd7q4>NH`mdBaH%Ik`O+~;IdCtTL|FEdwMHmFPSe;-)&$T+h#=$umCm>Q{5t5wtz+f3q*Z+U)-YsxDatRS&)h z>%o_xG~t)wo^Ul(nY;q`g0Di=HEUo~xE898LDVqohS3#m>X^46dc1>)&eSdMK-DcD zz&3CLR9*5pYzx1D?csl5M@W9$uJBuU4BP^H!lWd}Jr1&Dh^yxtPSin^!tb-i=lc)Q z{1)bA7kD#({o3!pn?I*c#Q**?DH6Ts;-h@e9eAtxDHO^q&CbgU?pe$?x@Tj(|N7>u z&Yh>Y{LG5^bQ^Kp!GvJ$+=kQ*gT3qKmlb<;zyxo-+ND`ki0g^v$NbK0k^K|580MoI>!+ z!jz5ftu{V|cx{p)RBn z*;l=A21HJBO5yR4LUnt?$*?b+22w+qexFTdpc z3`r`gs^Vk>3~Ux}*P6Es|2T=>=eQ#1bZ<4r%_oASkVYxh9` zu=!fXI(B*!X?>00m77k#&r11=+;dNRUk&WC>S-Tna>0(>g_F>@l*5yMTSkP1iymtGgJEg113r z3-?a{_j{q_COv;-4EG@@xvBvSY_HevLUM-Q#kjQpnp(3cOU1|-?H#lKNxs!~kq5)a zDfErWfq%R=r>5r2)b}G9KdUU4zUNwve<(jDRFGGinV&blFel70&G;?3l{vp4Gp{g| zUsP1A%S%2V>BVO;M@EQu#>AZ#6(`wM$BmDQ>*&Xw5f#UKSN_fE?_~RdMw<(=uw2zUy|)z^6uxeJpa7kPM{MZH@obbcT>-z9J~nnl z-ghJ8^9>mpU+=hV3MWE+Bhn3&R=v~8=LjfWUGHoUm<}bA>s^;ju6Lb#89Sn6aO7#z z&#!k~GPraF$>7M!fmqjJx6NHv zYGlati@w}goc8kGLw_o&^K{!!-(}4cI#C)WJ()J}?0b`so_ERWP7SVnc|C&PNhUtL zW!xQEw>~(2)ptX>&)9hWVUA;)qs%rJ+3qqHFzrKZ|Pz27n#a|AYR2>6c2MsQ&*(W`0aHce+`HtxWoV&<5K2|66{{LG|{k&x5KmWQeCFPZ)W`6Q$WYz^g|GNHvb#D53 zGnehQC<8(>HHIg}mc3)mI@2X==Wq3V^dp==2hliM50AD|zs;rjzL9k0|U zw%?)z;`jZRcmM6M{co@uFSfZJ42}QKDS`dZEUAZ0uEPGu_peva#OYo4>x52TT&>2= zspi~pQFuyGNx0P5^Ew1^g*iEAm~(42?ottlN04VX>=ncnXO=|rGV_CLW(4uNB$0vq z-GRT~HuXZy$CLi_mlH#K{r9o8v%ic?{_&S>e`?1!dU-6*JN7*qp!_v2x2I0+)77#m&+lx?m* zjKG1g3=V>_(UCXP-#-GL$v$~8{r%*@!LH|$X6GD;-BE?(VsAA4|Ks2+_DP#F8k&y&bZkBw6sQ??Efp1NEF*s9t`FGyYYg+|Ib@fqssSRt^cq31nOQGoL9L| zK))T}{Z`&5fL9S8x%b_-sq&kWqke#}7mq)2VOc&elKK{ME5(Jf^xi0bq8CqsLwTj4 zTqf5Jn`>O|#aHTcSQr(j?@9Ms6cyLekGmr(PIZmy9Uc3gS3c$@O2NUzedEQ2Lb)YH z1#+3gCNqAoB@flb&)2Ql>%I*9QLb;6s*lp4%1ZTJXGmRPBuSYvcjdeo*p4%L~SzMBnRhGw^Zr=Z%OHDx} zM9ZI1+$B_yQ&5@{3FLsD_yIV{TI;DHS3mp(@Bhl0FuqI`WDEHHY&;7~_z ztWaIzYfuO%{QT~X9f%Mo4+FKU!I~ZG{dB0l)FwVfI{KOGC51+(_EYYamTjg(a={Hj zItq&-ftP~fX9e+*lFYn(Bhr|*{pBFu8^vVOYD@cMR21b!ZEbX3HnTsDFxa&9-IwoQ zICjmJs}>iodEooPuRgK+@XXp*vcbAZ=RLFh&1KIVKIWBPkGEdL#U3~D3&-9+?(lm1 zztv*J`8mrn`qIECU5`;$u1VCFl*F#R>HFVt`M>gazoYiQdH%O1Sx1|=f^W^OZN6Ra zX2eDN|LFS-Y=6o8#y3!w0~M$5;9x@FC#Uahsdp`74G5VJ(397n^x`wa6U#~?zL$_> z>%T-DU&^(lJG}3wC-5f9>rn)hR^UXJU zOxF8(=e_b(>4kS(lliZtAKw0Dd3*uo=9iHvGj3yK`=C6Jo&B*8D;R(c3UPdm@gQVH`0Fh=RU#s3PB7QJD1Cmx_Paus(t|m=J zt|m>!j-dAAOpZGR&VZ-Evmj|Q@-=BP_5;#l+Sv1nvDEuKcA5KM%_EGYy3q2U((l+t{=W! z9tD={(Ag3^aGmsF3rasF#X&cek{0Y z+NC{nu6q^xO)Xu2_Ox~3D?Yp7;p1xGkhI~M)#KvlGh*{0viXwOd|_hsF|nHx^kJ(}P1EiidiDC`Pg3h_7`HF>NfUof&u(d- zEv+}|#KIBJKJxn4=g_{_*72X$c_R0z4?ex6Mf$;yy*B8L7LH?E?{1Zm(O$Xwu&mE%>#nd2u^j_0mkd~xM?srBagsg>i&jTe7W<@gSYSDqGo@#(U5jw*$qHrMONeZgr)&&L(c17pHR9%VX>`4b1!Gm}g!c)h*4pqXD!EH&SV_c`d7;G7QTn&n9|Ck4M3ye|l@-(FZg+ocXibN@jdI(%_`yK6t%P zQrA(r7f+mc!Y|wD=GG~%uT1^boa=u~z;aJ-3BW&*@sI=W-oX zMRGlqy-xkPh`Xjgw->yL{o~*wND-L++}?08`+eYTurItF4uB8BA@CtM3_b!!z(?UI z_&6L3pMbL0Er%J9zFyNIo79I#mqjL}>jZQ0wD(V~p+axjG8uFSu z1h)fh59OoF-)?u<3HE}-xxHaGm;(9D9SD2E!H{EIjqN=irbCW($HKla19FZ#4)%xR zA?LbzFbz(EgWw#A@FrL z98xCkNJyEuqv1c`$&j*fGvHbnf|QY)1>b^UNLjf#@Lf0_QfBT1_&zL#AHq`j5iEo2 z;Z*nuJQIEf&xVwxI}=it?i~0Zcs~3RUI;hAi{WNCAASw5hTp<#AZ70^g#U%t!tdcq zSaT1aKdcQ`!@BS_SRbx|4d7bX5X#r85qu9ef$LyXxE?lx8(?#|5$*>!! zlVJ@SoP%L4cnGWm4~5CFJv;<Bnk4p}y0bFqRM@%p)uztRy71L<#&amq1N2HzGd%Kj_{SbAauL z?@yrXFXkK7CLvbx?+^Pr&a)@cUbm1xZ<2RE;tzD1G}3Xw)*$#pssvj@^aU~3n?Ka( ziLKikpWxPmhaS^ezeyLps$F?p*C4KTMcgq#+~l_9$4Lw}=YD)t5ZAq95I43WuKXS^ z9$9`|`8|46#B~eKtx*xzJ&21i_KxP6H23Hb#I0*n9w$-Vq-9h^T$dp3g~Q8_E5FAv z6>;VFSaMi!T*nT&iOQu#RGc!WxNi@wI8K>U+=Qq&WlnKxTUQ*X0#saDRGbP>aZeml zeq6`k9!EvR1^2lA;ELmdd+Zezr_AYkwJPE|t6&s2w^jMMor1jmH@PA%I4&~GM&XOf4XJHnD5^j^3T^AJr_UUE!}tCxyUSpnkbN45^W$QlGqX@ z@V{9CYX9Tn{}adYKj;Z&lWj$tDF44@%>(~GZ~RYCkIJU6`M&}ie=^7G2<@vrJ6QXL z5$t@m8o%saL!)3S%@1b$`TXmb`}6r@f%MzA-fy1wtv8rPV}{H%w|KwF*DsWxQ(78| zOkgpjF2=t3WAtxPbB^uV!sMmW7^1zrxbm?`B->oSNtO6ePGO{En)h2f@3-s;nNb6b zI8SX+s`p!^F-HBpIBy`5f83y`CU*aojLi z3`wK01Cus0ZiqA)|HhMHgx^Vv87G+mr?7t-oDRpqGa+d({*Bz*_&3U4>he$a(pj(o z&W7B}jE^jVH2cP0Iu~*cV>dnvUd+A=FM*tE{2k}O`RsF!89&51X8h1a@CxEN$Jm!I zg;%kE8N3?uo3S$!XY9(v8GG_Vcq6}G3uRBf4&DNZGxlWSj6Hb~yp8yq;S#tQ-U*2_ z3&#~{YH5SJ)dGoY=6KK(EA^s_P=;qV*S6w`hVLT zK~`Flo!qW}(RPeAyJci|Y#+|g=isT^b@0@w{^6ar%29qVsy)E?VcP)&;7ZJ z%>M%#|IZ^fkn#TvVQRU>?iS$&o|R)%?kyGnpMvZ7V(3e6mRDxD3T9gkkg)9I3K_V zPP?5CKy;KZIc*~|QbvqS@Y`X{C(RQaJ?XD~&LiC25Z3cU#oqM74apl1#k{le?q%)v z{S^PzzQEa=WKPq8zx#OaZ=as{^Or!%|IXk2@Ad!R_@#UQ{}l%v|9|x-m-m|&+d#qG z9>3-Pzu7uZA;10at+tc=|EqqXt||LkPRM+H^0(a3YIl6c^Wp-U=kM=0G%G!QSF7DR zM^j68pIfjk%xarcu#E?{Tx+}4=A2K|(W-rS;r5nJ`+>skEu8klh1;7u?Z*nYb5-m7 zhWd^S=epdX)n2x6JD zRqt7UHu8?+d%&gsPh*o!%F0qHKu2ee%*`5^n`3DL z!b(*O4hnIf|1)WH@~Pw^6%}2QU-tY>8?e7oCYUR84@}Ov+$s- z@Q~2{%~%IuSdL;H8xq=?EMA?Ph4F4uo6*X(F4t-#wO7x`j=g;ydw2Hr;svew8NYhR zUDaevljcpD6l(3J)(~TZq{>+Sj>TOk@OxV`Wb6 z)U&g^it5b;I?LYNQ`g9j(b5+e4 zBev__eWLorL_`*_UU&Az#`P?wJ*r!Ba$-UTRaF}e3kmJhluk;c_p(|xmvapWZ|MsO zO>WvLErZUD?3yG0(dAuYLR2m6Q@PWe+~i?dS*N`J@AD>bez_r`adfTcSzvX0(LboP z48Fr|#r&lubKQcKb?>oyHndnbTiqAhy0qx!cYn9_)z)7RoxP}3 z)+<|&KkzLv-X*2I%7YhnYuzUH#qPJgIIHg?i5Tp3xx#e0s{B7o&aw7~mpnN5=kQ%a zubpfJe^L28d}o8?{K+TPm(%6`s{f0eXZfcs`d#0zdF#rJHufsraamt{c2)byIlFYZ zq<$(P*Zus}^^_Q_PH;tnR8^*{cA3aK387{PnR>zZ4R+%s^7kyf7e}Cd>S`DYU0ZcR~)bRoj!+K zr&98{LXUhiargCt_rsp`jnu+TV8i%r9_~{a*D?_nm`}%=$Dl zeL$@vyEC8ehqLY*>O3nhsvO!rJN(GQGmd_=e&JY*z`7i6x}0pK)aSZ-;bT?4328oO zZP{*zuUoN<`_b9lm!Bo~xi@I>_lJL}`1svT*Ca2PweJvdNa{TE9&C5V-jx#;A3TvT z?78r97@u{%8M^wAx}1A;)%hPkvFLvv%o@_6##s$!+*V-#{gbHL=YKbJ>D}jC-s8?I z_hj7J?wtkt9C}}?et!G5*cXm|IsLJE8NWbC)%eet3WX#r|7sjoW&(%cO*N21sIyIMx2F@xQifj^Fz1@h9Iqw!Qh6I5+EZ z)9G^bwNm4QImsUsay0seHS-#5Ik!?S{ducu_hr0%^YqeFUTAA!CiCSzh?Q6^$)E*Yszasy<`|CPRRJMcK6PYp4?OW#fpQI z4t}??%rJb!f06d9Hr1awe^TxC7iT`YZg!(rarU3A`eE~lmRZvqtbwL!mX^5 z3od#RKK!gbIerB^AnRnt?^{wAzBCEjkiAU2ins;y-J(pC#>4Jv(+O&{jg)upGv9 z&EK!2v~})N=-5)~oY)<^#pa!_w6w)`8x&dKd}X99ZeX;u{g#cwsol8Cj&rQXF|yQU z{eaK5XM>7$7@eJ#o8lAmD(yvcxXJzn7l~PrXVnPSq+#U3G)f1b9Zb$!s_|CibuMq7 zZ)9bROqbKt51F`g7B)J1TlVa_xeP z6MO00j}udo%TC-xUhIh6V=8UVJq8zZk4}Gul(nuPxj)1s1vRm;gL@2B_h?x6Nah-; z3R(32>_e>+@P8HhWCS-|#jp>c&FMqAN2zb=^kMY^eOUbcRpwKWU$dh8kM0vatoX!k z=b|5Se-o@e^x38`pP%>S{^UDx7W+`yR1rPpjW)rDOGv+*#eG@%`TU#J?}D~c!B@Pg zUR!?wn4&wzMe!jleU=!+T^~Z?c@BmF!42(wi<8b9otl5)THg= z0&U_vFKvSgw242mv_)9=Bf0nTeC*A))cGR%^y<~8x38P}qm+Ap^zDM}T_eS}wVDwe ze4NiKzlUn_ounkB)2!MJ`so7Io|>7Ro*-Y3YA;E9)aCLz%b%H)mXVriwU?zmi?y1O zkUcajSN?p|{>y*)gQKFjMwwdY?yH)Tw& z{K~EUSFpd;XTwqwvLsuS)xJ6JJX|+5ZHyct=iivup6X8?otB(Sk4XD!+6T0g*Vg`W zKhnpC3hbXSG)H~jxANMozDUdAM0{Y`U;5hmuCf!7)5fT_&uQDO`bX~Fy53saKDFD@ zv#i1La-(eU9@_H%;M%nD`TQ+g0u|3K)!nVqvFf~2IY$NS9O=@5@;RpDUq2;R3dY)> zBmcgv$nZ)=>);yJ@7dVPIb^$oy}i%g9#UZ2i6i%H)cH2*x0;BK>b6Nu!@5@-U-!+& zUjBC4^79fs9hIk}@^n<#e!tF~dij?54fc=tDCgg)qxy!iSLO)zyjaaqJDg?Z2I(mS zGt0zshAEr`Wo~#AlsVN@cp;nt>%cqU#qf4m*WQ-%cV)Hay4D<6&M))ewyd&XTQ_C< zKagpiu^v{lw`;-I*p@jn(<)QWCldsFUMh8gC8xWZv*K!`mJ+DWF zxEnqQKZVq9F!sXb@JskCELqB`El~=tXS)o11D1n3U{Q)Be8uV!_ECtVl z72x^sY*-zh4{Ji|2N<)h zgV(|4FcY?h%V1adB)px^^D4Xpz77*<{{gNn&F_`@^lDfhegH3q|AkV6Acg(fz@ab# z)}p-!tPQ1hKob}bTR<3rEtKkb!?(4sBB>V*4 z0>6SY;QzsUV6~Fe;D9yY1MmVk4_*WpzbJTune8iJ8f**wkl&1v4*S4N$Zy413J1a0;1Ku) z90gCnF|b5g!@M4z4{wAu;be#|z`PYUgVSMaI1@(0g|IK=J27G)eQykaFT!gfe-lPB zd=;j^H()B<1c$)}Q4MtB+IA!62tQy_h7+yuMBn_&-lE95s~4CH(43+W?sAdH78a4@7#jcZ|sy`2qx zY>$KYar_kc0Gtlz!C7ztycaHn_rZtYJh&Jxf)B%o;iHi6##joUgpa{ha0OfkSHjof zD!3iK2oJ*5@H_Z2EX9Lz8$1Vo2&=$d@I3ettPVeiVQ?ShJ2VJcHoHK=kWIcrV=kX3 z7Vc-eKcu9YIS^8&%;Y;WzJb~B2%HRmfb^a5Bb)_)f_K~7_dt2xJq6{w8(~+T*P^HC z23PZ(E9mFeJpIhJWkqv;e%2YROIW=n@IAm#9Z3Jbw2b`lAD-=A{Ez4V=f(e6X-GZ$ z-#^p-XAgM+vj6>-ZS4r-^#JClI{$v1pS>>5p{a^nSktZR4NrtLo^ktIVHIa@I#5X; zx1fuw(Z$c`;uCa!|0k5Lv~l%j&Epz8H}{M5HpYn`+C1()u1OakQdh-ItzY+6)ORP| zShl^xo~=8!J%=Ji7YC(_YtqF>xs7+y#Z%>CCaWCOwBeQ|*=71{8kc_8j3F6EwlZH= z{#)BOUEgc<@%vYVZ*g*2>f)msHI?(keU{K-e9XXFothl``Ia%)pwM}|oU})Nc;JRN zqIc~Ky}8-S*!Go{8ip?ZL>F(Si%W4EFLaCgUjA3+#nhMgeDP3?xQn0P++#-#y}z0+ z&Po@Dql<4DrQ%Fp>0kA_O}(2RzGV5_CF$?BBVJ1v|D%hiavR5`i`UY{U+LnhZoEvs z$C7K0w>#_mCewcS>ZW%udTBZeF1K+qZ>jj1v|*X=?(2T2=b^E!&rRy_F$q82#`);t zyLA4Sy7(?#JeV%N%Wa&VE{<+7<7*)N`-;Z>OwB0oD)wg%`%C=K68J~P0R0j3eTwt%hKNhIvip~@yD29`B3@rVoOOH?o0J&CgeKqAVqz~>_hWV)Aq5Gx&Rqb za%607cE6mIWVXeBP3#BaW9PgTJ5GFA@V%>yeaOgin%TEPFe*o51pBKSu-#EErd@27 z;un^cp5PZJAm^Ycf5K4S;&Yca9DlfD_GfHJySx;8;Xyv*9{V%m<&>M5Op->HqMwaR z6j~~YKO8NURb@EqI*shU%tD_l%Q+VCaX~-Jb*~-V z_2;C{g7ky(0Zj9!h^tn?&v)3qE-qebX~6&geCA|~z?aS$2Gn))eG~Dq8)bbqxgYVTlbq%3pQ%#8*!Oz?j9wpp zL7raAidznpUQ2xFX0qDyfsz~QGY^qD?-W*9R^qlHd``J@h+Oo>BlKq0`C{PxVp;fIjEHSpgv--4gOo$ymAzKwg~ zLAW0tf(PK&@E|+}zk=fH_%*By{|}0<;}Lj1#2?VC1%HH?4~*lmBRm14;Lk7(Ha-g< z9oPhl4NUH@d?&pj>Y| z?9Dcx-RJ{9g5T4=8#ZJ6bJ!a0gZLYod{!e89)eMj&uo;0d{zVhMw8E~j_2G)EZb%H zZsK5h*bj1##??@K9{a-@FdkkC@n1B#rjY=-rs0EEK|hRu8L$V;gq+LBfTwuZCeASgbtY48DfD_j5{gyOrp0X_rw!IRZ|AXQq_$?d(@k=yk!Q*f#4C3$eIamVnx2k+)--hS1 z{RtG`*TYbJUoT<+;2z8?VGYUVJ^yo~F1fqYiwODDdwactu^Y2v47Ji&Fv zckW4uU!t)B4u?;}5%3v^zo)Shj)5=08{ms@DtrmfhHK#ca4mcSu7@k(f1votZGbPp zjqp|Y7F-YCfp5U~;71U-*!&Fcg!|!#5dTL5x!61eKZ0MwkKs3PH#8U<`R$uE;2szP z`I|7?L;eQLZt!a;zH&egxA40pdY>oZ-8&ZsZe~xm%tqm|2|_UdH;_4#XeXoChC=3*qzd zVfa6|6n+n%hR5J4_#=EC9)~Z(pCKWf#xHOa zs?I;ytv|ia?^)-Et@F3m`Pu8@1pcXcKzGUCFuD5O=KNoeJXkQ_|K}nfW?6av4_{H< zSjk!v<;LeXp(kgp&U;&FtAA_pH32$IM1NMK9)PY6zzoj!0IUCIZvGbZ0;~sE|46@I zuB4VfV*YQZ|M%wq-u&OI|CQnS|Nf)>f35j{pwj>UrvICV52V*pk+MEt{)W@g=j`OVKVKX4Zeobq&8R>%G#>dscH^ zds*6(Gb#6$Vx7#9M?CrD)Z+7W^2w~`BA-nDvgw1}N*`~0{zKQ_G5z{l^*#9{(Dlna z`Q+E*eLeXkuyx9IGhUyLe9{?tBU$8;Uimf2{w*?!Jmb8@>jAF^0^b9Fg#7Qt{}!kU z?%Dr5`(LvI<+mT6sT?SYxO}E;(sbjT~@iRi)91*>UwoAr(YjLY_)_!VyCrZpV>a$ z`XC+fIhCb5t9Y+{#of@zD069APaIFD$WxfvgWQ0G~ivX5$;$5XQrj z++P^Zsnl4p%QWQ26OX}n-C68IWfPBlE1p<<^b6JpdE^oGyP&O9a4wFnynRxAkPqjp zc2ysw3Fnbm;qUU>!dlyHkqh$n3zOIj+3&{uwx+G@wp$9cwY1w_F3={wSvhuzB5}N>`JSs8g=>LG-4SblceOzBYj_a2 zTA&t))UmLyU#J#{#GP90g=>Lq&ucGS3uHO%R{s>P1tRgm)_JVj9!@Qg{MgvSwLmtq zzg3&V+F$xf;$8FOrX_^ess*w-@7yQX0?EJ6{8}JVhog+@Q>zxprTBT2WjpVWsEw5T zXw?c7D)}MTH#xRwy$^|lDW}fY)8~9k@}17iyDtLq3)BJ0|L*eZfDEvHw|R9yZm_qV zIw123Y&$W%yBT9VUz8=gw#5;z5Gp#|8oSRQv3>3fYvvr;bpM(QqtC@ZU$uANIrzw| zPczd8)H<>|^XY!KdAeRl*Q?8krpqzs>2&{{I$d4v%N`}<@9w?6SD-KRN_}$7fJnimLIRUTQRDb6DNwwQwocZXw*^Q`= zq0OoH4dea*R(sy6=CdJ;w=(DI$tsJke#bQOa)UcINBg2augIv%5;)bWtmQK{oG1D*pHL#gAj z48}s@|5PmFvru9gS3!woTnmY(G>PX^bv)jHQpbb%Jypkp_&rs}V;ht@9>n3PIv#tW z#10*SQpe+GD0MsxVn8JpQR;9=9glOM)bSv$QPuJ21SJ-g_%{`cnhI}aTVhP7!(1q_ zsKmvoSkx&nk>giEsq;actE%%soS&-mL42O7^YI0gm?eopO@lwd8th+!IY&)c9!i}L z;?Y!{kD4%v?Zz+}@*6Tz;FWMF><;C+#A6vt;8^$)BtF)78Quk7fpg(nNPMjEA$$n# zg8a4&;z!LV;b%}{T)%}cKx#>tuS2Qd@ivtD9Xp}a@8G*v^*i=Kso!xBO8t(nU>W!w zqy~kmt0DC}&MIZyr_{+Hp3{tgqhL=sh4URV&aMk6!^`X@7kXT!(-w_R)Lux~)`W=~2>UT&? z?Nx9*l=>Y~H$&=o$N(tyJ8ptfzhefJ`W<(`A#fIy?{^tYX8UPKoUHj8q}GJ0iy`$p zs3D{3cYFw!vdz7#`W^eA)bIEao`9mikop}#jA2s0qXd-t9i?Filo(#A-%$xt`@uXH zO8t(DVPDt)#y~!+s^1}Fq15l-GpYI=ouSn4ka`)!x2k#>Qoo}w+fu*d8kh#Jg;KwR z&!p;i424p^gU_PscU%vpe#dQ4>UT(845{Do0Gt39!0X|IQ0jN^nN|Ic$KVvUsa>M# zcf18}X8UbO4GQyJI844@m?qz^z5OA)j_uvh4|xh?i?D)CIYJBB4ayz=&^kSG7Dx*%Tt zkFz_Le-Zr%<7Lr&HveQlTbcjI7(v0nupZK*l5#UM{WPKr+)nMSjuKK93_=lU`euZvI0%2Kp);nQL?@@oHixj#a^+J9c{zkmANKQOL; zzg73+bmsk)nfL2#qPlzsZu1xDd>VB5GIV(gbhcPs{W`aKOmz7m{%!O7e`?)7Zyw)g z_0$QHi&f+(ua2KC@5#SyelPR-Ut47U-}`sZ|1&6_l1?cmEAnSw$!fty2)1jyp2=Fg z!TP^fT2gjqPG)LuNd1@wA$_uP)6&z%rDY5aiO5XPqB>Hxku*B_6lD-2$uD~*re!2# zr={dH8WY|U_r>^8Nr{=6xzcPWUGO)G91v+Fr6(JqXdyE){h32ELqZ3UcWh8rct~jf zW~>83Lc2t@axuGQEq%-1urV{c!_-kp8DctNY^_G#w--f>qo z8PlYBlO}~)|BZ1!_Ehh;B*>7^sLa!sHTkMyLqa=^Vr_aVzk#NWlKp()oyMHf&R&)7 ze^{07xQLL@0S0;tBX5xUvto5*&R&NBHo9N`*f@NzMHjyoA0?gcPnQF3gYrjgUVTXI zaW~C7k-lK;9c@zXr+9|joNl@~xo*ziH%R6Z$;XB~nz-nhp&Nhf6+YqcEtjGnQ?;5; zuA%K#hpWrQrpvje)A{OTiVdyg{-0TsI5m9y*t-AuvQv#G2Uf*dQ8(wGq2^8zz2-zU zZXf*Sp;j9@t_pv;H$GCTeQ(g>?+^b{@$tKxu1Q`nYu_P!G?ZWI=dUJTxaQcj3!b`V zdigdWkx1kAHX;|Ho{3DZ7ia$Q@z@k@7$n~eECKW!IlV_2(EiEbDF2`-1^Q7j# zdzJ3|`M*6#1!netD*F0@bN?{Is=186yjmn?<7{3{g%ywurjJ)K!PY&dq7LCbiQz5~ z7ftQzyoIAA-qxz`EVYN_kc@`HU5Vt98QPTD6bNNaIu~&IvibChyZiI@p@mfvvcp4~sJw{+?{Iq#6_&&5l-j@|K8)TnO3Wv}f#a828fpHIDm*ol&I-R+yM?^QTwq+5B;t=y)w4eI1Ao!q9=2kcVv@x5(Y zcKdR9xqjUWxy$_^L{tJ}6 zu9G7Jr3cdKMb2w2zpGw1hRj?%_T%(2EmoBIvcm%O7F|^P^XE4&TWVDQOPfBD7=2Z# zoZE>>VZ5cLpYtp-`MP45JO9LGlP=C^zfCKJXHIy8*;y&!nr3M99!$ zu$n$dT&bA=IhUCP`@>X7+^jhaUJKJ9`Wh@0zZdq;X(KUbwvwajwP1_&gYmh%@RlBwf9LaWhI2u-iV_*$9 z4qgPWhjrjWSPwn~FN2Fns7Fp1Wo?k0w+Ox*p@64p$ zs==ellsQ!;$fHN;X(klW)y!tQ109phx@2-WqhPLnM}LzwiQhh}qsOUFhlwu7$yqUZ?(4-e=v&_IAG9#a!d>u$1H`f4}{2bgC!+d-gvk%)_()dGdcof?t#u z%9FT|(js5MARffoYQI=q0Maut+B=$&{GCQAwM9|ggw+~v={54+bd)6-nHf35(z2}6 z<;(x}AobVC|BY<nQC3oE8g(sdNwuZh#PC;!-HR$IPK!B$Tw zJ%fCPqIw3oSCRc4J%i{2KIdLV&){U4a&!c??ja?CiH6ARPCu0`BUdGVhy||2Go60= z&blx9Np+LzCwrHoQ2iv=k!PHvBaxk)YZtt4M_)ib4?{Pf4wN0%t$sl#Z|n36I(>mo zzo642=;SD!9$}o4E4G)J^;~?152sCgw*IksO$Rb3(&hhhE4RDVBk1J(rRqKx&FFLd zllIRa*b@2u&yT!Zv$uPDt}ZW?POjF;`8xSorzdi&7tqPuZuJFSevz1^Yqn?BTK41{ zF>&douRR=A?iyq(CFk$0)30i`rM>St5OOfG%%LIYNj-IuKTnqbb@~Oj^0rPtrPCMa z@<8eIK05u*A8lWDs~7l&F>N8M^$f9|EvT9dhFg&X)xrb7l(D)wl=hZT9{OPii0o}dz!9(q90hy9iI6`V^Bx!rAB6+qGjK3m1x2n$)>e7|xleh( z*kiaF+vPq>&{mgKmhtQ_M0PW)!0X{KD0S8xTYEwI&5_;Q%54Q@Hj&qw+m9ok1!f3IMnE|09gE zCWEbR?yIv=>tqAn99JhZ=wtxhTvj*N*X2gl+0gzf+m}uT)6MC(Sia83>qLyKGc@$0 zT2Ag^w=$|**?xzTMa!)TE%9=trLVLbl5}Zf|L``Fr%+_4`QHs)diOb(_qg-QJsEel zduIXm9o0U0?B~gMeL3&ht4hxcI<)SsA=o99thIblg~(QiI>&C$>@&V|r`H}fv^Ia8 z%wN8ZTsNY2?N(XSceHr+oqNY$*?ZYey$tVGCU-02>14L$%JzP;PqxlS*{zJKv-#_M zyLGw}oy@P(9q4?N-OBtr*`A+DAz7+}Y1zSsAo~PLmf{lL@;B*$K+XTNvU%*MdhvgG zQGs6kpEiSx7yoCOtctqndj7wEsQqtLjy*^PL;zrXKOGq$oB>xi*K|8~4AdM^Hy6~| zdCoL@j&9ECb`GbTlj-JgIvK;QEElM`oo?>yRwmTRes1T`I$2jIyXs^Eoy@6|T`y3w z(C5Q%UblMZiglOuf4l7qbr&Ll>tqStocm0ZX`>l)3fe)6&fOgw$glaWiO-tYKEzi| z>>l3o@9u#B&HqzJt7oe>|M%wq(WGJd^$e2U{NJ1Z6L*+zC-`&x|3*23)L%LO7aM?X zeyHH2j#eVq+JCnxIUN}b#hD0xsPe+^;ETbvvb2>t(B>~ZyY$>&@!Fb|dsMyirwyN8T9v##Zhe1rwili5 zR;TOL>CSa?f1Pc|o8y1CvJ8R0I-el7zCXIT|KDYfuhSWLK0$$+3I99K6PWq`$c&*W zxud=K-vU*EJpX^s|G)TYeqNR<&;S2V&Hv>LQUP)QaXbHSY3Ki{Z0G-4M&6TZJaVSM z;283L4l1wmf7v(blUij-!>t_Pl26N7B!`Q=NZJ&mywN83xXJ@|7S-0Q99?y2Ph##Q z+p@ot-&?jNzjqa`m!6oU@?hoV^-dd?BIk4RVD09?pqsM>N`}$p&DQy=>*nY>dxtJ2 zRu@D2cZq}8qGX;gZaA`ISWJ-rie&@8`8lnvPhY2~!j%%!``C$QL-)r8y+7%!fuENh z^-i2&=wutWvXfg`s8vb1A9IpFDCB7L4Qu8#*m7>AToMntm3eMe=kaB{eDn0uQ{$ff z__?Vi*G&6_TtX^F`tcKs{`bMGAsuR*)nLYL6$TIst+RKuRs9pTX4=dt70#ReWc$cr z(a#-jVHi3;G@W0KE0dN?QjlJZQ z=Jg!bOKEQlWeFi|gN)Nnq2$YwJXsxKYuFV^zN~pL3i8ua`LI8Ok`L=Ecr`o>2S9QZ zt9)4JKyqoB)nN{-1trh)g%Deg$}2q zum{BKW5&YU;9y9ac{2gt1(V=xI27Iu)8IXDIJ_T@hYvs#J_h9(wG7?`7s7ksVz?0U zXJtMD$^B){>_s1*rViBGbzlp3CaU{AGFV$ovI!YQJUc9j za_!HqQ@RK1(zHq4v0BhsvRq}-GWYc;Z}#B^Rd+F7XD}*!u{%Z_0;0?&Y83&E46gHuWO$l{n#sktF zIBm%IeHaaF721%M)lvr;Sd_Bp4^-}JR7fiKbv%5F_U4eEy3!$h2+=2)qATbO55h=z z2zG;_JCI!4{|BStFR(A<&&puPHc@>Ui$jO4ZG zHp;;`R#`&XPsY_IP>Ml>!46RFGXl!}qsLG=!hKNgSDqPdA?juIIVQm0BlDlG-)RSA z`yrluPw#t+*8`{D1A&qMb4E*DSUdfnC;xl$zmofsvU7cj{^a=B$evNY0pTr0ArPOF zP4(-jOzL7&W@v`cJAXs1!EO^d0nZ70#gwjQ6> zOs?6qQL^99&SOq#=P_gK-NQ~{_lPiS=gz)}m^fcV*GMn^uaIBwnHB%%3{nA60JydP zH!{u%mQlKcErUx`IBGX4*ZWvj(8Kh;TW;**;Su-g7?7jX`zn&=U@7xwwW+TZSf zOTWNdc}sDhP1@w1oloL?-h!XQk@rn@*2y(Gd0&@%K_>_4uma4EqSnR-Q#6iuKywT#-G;Ru%W60t=U%Z~F2-vFJS zN2f1xtLM?_bG~7`5}DW<$5p*&L+TKV1seHZEexTijQNe>*)R+?h0S0~D82>Vp~%^N zq4*Yv{LRnS#DBo(1m$@ldIGr~a=SCO8Zzd}^+f+rmsOVg*iXjc1yIJ~hwS5viv!&r zRXG3q7-Z|s*yD?{zn_ZjeFn!b_T+Q<8ob5pfit!TWS;f=>whsz!zyE!|MKL2PyYAh z|B%pLai0DEOtSymgH%Aoe`MP-!S(ux{2S3H#&>mOOl-G4y?wnpc9$(Cc9o2>!F3p1 zqx3s?Pi8-=O4wA8}OHead^-;X|Oah|GTMvBGxv z&C2)Rs^cAXqntz40B0&`wYAG{YwfgMnb#JEiO1S6zpZIrUGQf4`^i*O=^TpI@fQCB z(GQ?jFw$5>KX6=q7VK53e@YuiXcwEjuCA>vw$ZJhuTIw2$=o_yy-t?W#c1nfslHZC zv13CXOBSxP5!>trdNFMwN_TPK_9WY88$#@*KC$mo}r4lf@) zZGF8C?=_>)?+ll*+mDwMSvm5<12?=8y=!Oa&COQEwy(5QAD5uB?Yos7buzI|_SMOh zI@vc+GNn$p;Z`RRC?5e`eq6UYGo9{Dr!&*(#zY3L&wyu*oyfzy-pG0}?c!4}i(}(% zgzS4R+YHU-1yE#ek%<`;P2_PUb0c>vSsVMi^5+*BybJFqLF95X2lj*$VJ|oh%JH|s zXm|(Y7;_dJ2vBkzdYF7rCOM)C=7}n*7g)@G z$((2*`*oO@@00JQzQkJ2;VoVdcs+1t_5jneK*;|E&HtYK@5%q3{O`&C@mHT=_J3=T z`t#)fEXGz}TtwH7$oEC{0ggsxIvTkKooqgA>47x>AZ(L`m)XAVanOLU_aVwkZWHp@~ROg4GlM!{YxX!Oa=ZB$_ z-BXmVVxm8K)7WU|6Rvt)~iF_<+c`P z{ry#Tk_%1Qt=djnHF@U#=gQ=?d*JcY%SC*znrlv|cw6d}(TSTMXm#GFm(INx1-@I^ z;E$F8bTXt{*+3@)xRp8oXxTDQGKnsSuv?i#XE)TzS~{6TCwu(SGR8NIG2)MEjaka} zWJF_QlJN-pm|DcHCBCls1ejMq;vGzEZpto&&CHm@%WL3Nh)v7DmS)OWcqa_B40Fhn zVd&Z7m%z;b3r+t${lBOG_w@gs{{KwV{|9pV|C|1Q7aJ9W<++yoL=Z6*-mTidoqyL|S9}^bKWgI34Obkm zhvQkGWC)QJny}hqm&$oQ3|XNBZFTKY>QUzW@^T53u?`ndQ)1>yjw)}|Wi9HLmTVG7 zeTx2Q6K>{2w-|=xhMj@1A+^c7a!zltdO+s?F-B0ZY@L2i2I~Q2>71-6pf5^R3pPST z$5n|lU$(*ezgJpPc4kgyYHmpVmlxXxx36RG&c0r}pjGDiH1mJ&xT~6sY2w)ctcaIW$n4?e z04Y8=$WC99S0jY3#Eqs;pPsSt{)CL730Y}mLrLM{>snO7HAezpR@Z21+li^DT0#FFw=s!a6;#TfJ?de45ZuX|_cOT-fVB6Gu6`d7VfQ}5=7FIhf!N&36(m;-K5?aiwXsXgwd zc_-2rjJ=~x%Kh)4qg6RECXf9*`K~YLJ$qH@c|nKPy*0#ry%?SBqVoyT$)LKqwr=j+ zR}+_|lZgW*n~H9HYp>ropLOQ4GLQ8ZuLpi_56Jxg_s9RIj?PZYP4VLY3rGZB{(mq3 zzcni^Iup;EXBU0LoBN+Efs9fjOHuK{YK^yKn!Gn1K`A3MBWGAzmL<@{MTCS7FvvP- z*n?DHX8msG{7(M=u6F#t4;@%J#$K_7Uld~)GfP_W|JF?w&i^kyJ^82cE>SQK;4m@#vtZ*_IS$%E`HWweQlHWKh_n?~XJGroh4UM1(WP0y#~%AZ5V z48Lh-lcRg)Y^BcyQ0X$EvX9zK8 zyxz>yp+4cavhj`;3#-C90OCK)FYH< zz<9{HR2@PY=S=?blU06Qk_TZj+jm3p>zW6rL+m@M4&gF5lkKPBEchI}3$BLu!L@KM z+yocFUGQOe7(N1z!l&Q~xC%;5gy*5uLU$xWVTYaYvbU-}--P`?~7$ARXYxJEBWX>>!wN4B^D#5mVY~5$E z^6?moEuUp{VD=%orP~A-l#j<-dG@Kp7p~;q?7VGDUe4cc+DwiYnL59%m6D&+@{X}& zYS9~%WnZVBpvb^-&js`FOIy)ed``apg8Bu=|M1u9^XcaLI@^!VmZOtZbh3flIl68x z9w^x?P&$G;lx${R`sU!L9~jr^;MiAEdiVO8$+=EPpwk8DWP6UWIg0uCF_Yy z7f6}y*dHvf$^5_j@Am&or9P8ing2fX=KkK?-<$h;xxde>++WrJ6&TZ>Ykxn-_E+7W z_e&jCnN!~bFX2Hm=RDi?C!=V-=}*o7<$2{S1zxN9e{pkjvCCEAfK>UhalZq*H+owse->GHSp>xSpIS#`sw=N%(5P9a$(&!#D|iS$WPTb#+m z&+R-zH-B|2x9H}(I=MwB=lt8`nRQB@saq-dt8*eMG?;wsy6P{~X?nTd_UKm5(aAG9 zn~YA*36$KTlSACfGl7y@+N!#0VQZ$%oKoSu*-y5Q92WiD;TDFmtAyBu?`_kv+n3AB z_3NGy^XjTCM@dGllQ%jkAJWhxAJkm^(f5;gv|HDH?$(Uu*k@EOjZL{?F`!{gvEw#8<59UKCYT~xj9bePR{Cd7^>HZAjBD7L@_koU~R z5IdCl1Y{rc87Q_s+=Rt<#C!#cP4G=9xyRpy*!|2Mkgwa^4Nd;-fs^0?cpI$5XW?4P z1}8SYhHT#tn?me^$|g4#wr2Yw*d9ItJHjQf9~4`h*yL8i5pWI6fiJ_ca6Oy^{{wG= z+@m=iz60f1%f05+MYo<^R-HEKZ?TO^-^tR5{p2~<6iPp%EK~i=&s_C$ODJ-p$dT7T z?0lv?6R(1NCrYjq8=jG6)~nOLl{TH6xP0R2`&EXh6^R*R%b3w!bsV_NNA@zgYf1Qpy^Y2}L(#+`WmlUW{SPx8!Ia zl6T7RBJ#g=g!R81V=re3if=suFN(fy)k-NN=6cs#e%YZN!wRf?nRDe zj;HRaUUf^hms_H#SlPb%qs7}I#W#1UI$qTxYa+)>+rs=drdB7lF|D#}lKJ~tcFTM7 zj|;PoD_+h&mCr8yQPfuH*d^!C!8*C*Op_bj>JM~!f3}m+15v-!SmaVYQwWDy4~W47pXt_8BrLvP?(*lxM_j zSP9+@YruQpg;3<}I`BbwITSft96=UAWLYI=w}Vfz9R*jwp71Hy8$J!=Avyt76YV)D z&yDAy+#h-e!+LI5&o;R~kw)bhSrXV!#^_`yay5@4Wp~B@Rn^YfQmwaeYqDVu}bywa1M=~Zv}H}!yw7Xgs}DgT}9$^V}GA3rK7 z*USCs<^DX=^8Tc%0qQT7|4rMDUK;8B9LC*Fte3?Y#@HXqQnx$Er*6`g|9v@@%q{af zXOX#+y(szLv3HkX5O-pKt0CXYellOO+G14%u(Zp$q&>x-l1>s*^@ivWs@m;NTyS-^ z3;ONKb;PegY7IDX!E!$FE0FU^n{^e-m*BA7o@>Vo*JNMEzrZSP?nDh2)K?maYVn@4$mhz^#0`tyq3UrtUg;w8^bQsB+rs2LvR{F=7R9tR zaoS4fA1l-6JimkA^F2r(JKsaW*y7^8i{fI7^L)$8${k@ZwP4hQ4d}!3tb0~{C~ryZ zwY^JGf|w< zKeSuFz7zF5%l9~iRhBsRljl)C7!3Qv3!o2% zzyx?HOoA<7D(nRZLYZ@ngdD4Cmxy1-b!>Bt(mRcZnQY$zbKwjqdMWw+HDR@%v+DUP zzrPZ+)n%0>lztF4hVoo)0^^}hkF~ZzdE<0+S=GmsH^Nz?S$}IO$qoUC|1B8)>(&48 z>VJ4T08a;S#_0e88UE`w|Cb}5<(9Ta9u+rs40S9HIYPTPI?$I28+>uXT3)}Y9NMQ!WSCNiT=4%E%_ zwgkz1I{A2=h>>-MhJI9Qf7|IZzjzp*Ox3=oTh|+&2x&ay_P4?+&favO68TiD{f`ZK zG;z^0LpT1|D}2J?TX@Lp{ONV`W4H5E-F!4qa!a7((DpL3o{R7B;k0Sb);~6{ z>AJ-dHc-)HsI3E0>KfTGS{h@dm;r~gZ&dPWRBQC7B_^fkHp)s)l+$oAU++FqePSXaxsBf4 zteI8%tRah(v&SSZvWoLu7(-C6xZ&r|yxqqW)Q8E3g+iOzGog?6&pl zDyGlLGt}I+F`%y!n}E@gRjx7IxrVw(exPB|Ysq=-MSHDA#yMhIHhhkmh(2z`!-eAq-@n5{I=#!Tlc)SW_icvw}s_hw@coBmTg6R zB*pfDpMasdJk_5tl-J^Oxr@&#?J3#WYJ0c6O$-d5E8mXd_|u8+T$o)SUL}uWzjCay z$Tg%s{4Lh?t>2KbouIljqj95-3}VP7V%~?IRqeZRMcyJtppLH~s5{ zJFe~CU`d_Iueq1!bUuPQ`ONbXv~v2~sBBL=2V|FB_J3tclz(-`mg=`x@Ee9s4%7Ku z{#7x!fwJX2_OsO4Jeu2L@1_#Zl)GbC(!(one~PhM=aZ+i-RNvFZfzxQ^-OMk4ZmTW z5qpRIY%>yhJ%CY1o)diiYPlU%m<&X7;ALA)?XP&)HUn`%!XJ82Lqryn+H*$l$y%Ao<`||9s54XTNP(Huhv;ACB z&nx--1%2Yyao_Bsd;;Y;#<|U8m^-q(F@sg-8+SVTiOtx+4zQLTTiys^^%g4+MF9N& zlKh!DUj0u5VWjnDVV?h==l|!~0M9rZpfyPSHS)hBn{T$||7;#UWmuU%DA|1aF%_fc zOI0_im(69aU@tsLi`N4+hchF;P07|$Yb3wT%I_PIzfV)Sc5%Lf1!dvvl$?=%CN+-C zI;^B&=;Fcx760Yd#-_{5>UOTJi?`CrOgh_=TbW5Gv%0P8;8teR$wnoWU*|j3>U{d- z1!KB)xvhm+e}5Gw(r$GRIzLdiGLz14^hqV-Rt+lCW!q0LymDFp`87VA|KnZy{6TJY zEjk^^ky4`DnD=12JNB-eu=wDKgkjHxk3%4F>(3Y{8T5q`azA_P^sCx!Y43XugdB`4 zb7;tU$PEZ2m4nu=dn@X@6K^cr-eJ$y9owE`Fx#c}KRIu(+kC}3oq^6j*R5_zWEqpy z9;YQ&t}&Gn_-rV0mMmAZiww$xU_&?rhQTx#4n>yi0R2#8wsbfEN<5Jdj)BOb26CFo zF~$v$eO26=JSR;4$$hY&J%(FjyW9s|nI}_oZ6#BNLK({&Ly=Lr7nQ%30a@ku=>X-K zfV`^Wp2QE5&!GGu2SOCDN~T1$sAS2uFpl;>%4AcK!857&BPj6gl zy2}=mt)hOvj{P>-mdmkisCnB=DE8a;t}2iEo;*O#ozgC{c?fhCna_22ys+JTa{;?~ zRy#R|vYX4)Q`yLe<+mwWTo^vagyOrB?a*R%X?edG*2(Q_mS!>yoZ^Xo=q<)G}F_Ln>7=dJPnvA?uW*ijba*ZZpdwtLTRy?pY$Q^tR@_l8;twV9;r zF`aXm_rUHj3pzH8oBwu*K4)1mjrkiW&WF?&q0}Mv9Nw)gqmw1w%78i<#I0-?OfsL!K_jv+ zE|GP6OwVzzUtVuQ*GDSoYiHjE57l@u3_SSU<`R zoNoZDw|G6^^}ye|2V{Qt`}6|F+#v z^u529|K}J3uUq-Ttz4k<4b;g6I=NUU7wF_Bom`-s|2GU5xvA{-`Sq69Dc!N}chm3w zGGkL+eSDxUf00i9b?fUFDEU-p!_wuA(b=kW`DAL8lzyx7;Dy~ib9{ zlm1nzKc8u{b!C;>#?)!sruegJe*Qi(huVMprt5pHK7Rj-@GZveu?>A2i7`{{6VJUl z^Q-S??z_Eu_dPw|zi%0N-<5Ca)e9f1@=ZwdIcv*yJAB=WWjA76R_%|USoFUSW)103 z_=lS!Smn}7_|D{bINsPX#RL<>&q0_hM^hi2em|H#1AFXfE$?wyC7TfW+ z^Y6OricjO_M@@XW;fmw+zM~e5^0EDV_|5B9?_9C&vi@(keWC6`ly*8fJy3cTonFGv z*jN?0RLQ2dBGV!`SLS!s!K9WD>ypXkl-+B20ozyBB=QBY9*}i1KB!Z$Dc^)2III6= zWN2377Hnl4djQUuO5FrrZ|D5pqVIu{y!HFz|9nGJJo{f0NrdCY|9LWiok_{F|D9p> zKYNf0h!k)tGC&;$S10GEW1DmAf1T|iIRZ99={&;nm$L`blWlVaM)0%bwfN!5*j>~P z7fz#FIYIZF*3J9f&hK^eZ=D@WXE)N>19bCj-F({Z{9ZTD*7?}!=GnS=r`!3rPEK<> zFLyhy)y=1M^Jbm>vXiotwZ1C+?3*r*z2%{SjqbmB<DGr#Cx__f%{n<*H$T?R%iYeu|0?^X*rO!2%pQvj8KV|5+Ej!xXO~5M z>4aghG!!2>@u4HW%nX6;pxD(q!Uj<6Z^WS~`|L^KEZ2s>I zQUMVF7&lK>25@qKG~^sXtUObd3~=)ZI|ryWn4YqKo-G5UBoI*UZ+9!l=;RfhT;f)q5IG>4)gF%|ZpN6yKvf2cOdyNI z(8$;&azJI+99D<;(5ZZdl1oD5fN&_|o5%@r&f?-+PIqoU)tlSXqrYzn)coI{GuoT~ zd-{LR2PnUif~WsK)8_y7AoW+z|0|2)j3tW)XepQhtHw|t=mtCf-?~pV|CjOESt>d& ztkMB_u{gQ3Ck?Y~0JyyT?&7|`6x+q(EY zCFd~qTH~%Y9!q|5ky|>8aKj?;J~Bo#e5%|5*Fni0FdWu}epnx(dNGlOj0`AoM47N7 z90A3?!JmoQ1zrz(KwO?w4nV|Fm0Q4s*V2y3LglZQxSwpcZ-e8Z#QQ9S66fR!Eh5yhFhRK$F{<$ocH(CI9}VJym30dUt;&E&&9>}OKd+|J^7Gt!dtu^ z(Dy(|-U@{M&!3Yg{(JTRy!`)O{(mq3|CyHmpSoyjkP3+Sf4a86<1(3K8NysiUS11D z_U}1cY=7kbQ}<~3|H;_wEF#C-OP>EUlIeA^LOPjVrvuQ%Qn{7&|7e+BC%fxp{Xp5obvlf{yG*Z((bM_-o@p|@PG>2y zepkj?Yn-*l-zFufRZ2VM+STGl)^EZQBI`GYBI~2RQnG$0D6)Q6cms@u#mV?XX&2dk z6cpM1ekig%^1PDmpM)aYi;OR_y~y~B;VV#N`wdWJ`~Siva61&)US#|!a1RvOKA6uY zvi&7cWczyX85jyhwr>n^y*0z&8W;&h#_tYA#_tV9#*c;XLU~@DNizN+PsZn)_7<-P zPOk@Kjv0XbAE{}6tNfpr`_uFN^?ZLl-`_LN_g4m}fJpwo?e|;7s2Kb*cEuH?#ZaG> zmXVf=?Y&~~9ZjkAY_;X4WT#_$FB@DiM$oAbu-n!Vu&Y{RvpPD0r)~dWUs`6OFLh)_ z675BEcv?rO|COFVWPInm;r0oi;%(6#tYDS81JCE3mpjeLO-^G%TlBoLzrCDv-kJ7! zL+l+cg17To)3PmpW?xE1vVGc<&TAhcIO)7)%UJKW1xz~)ZdLh7-)f)NpP4k=Cr=*Q zi{7t1*X%`|w_vj=>Pu|y>8ga*L5xm3td5dmrq|=67?VVG1xl2pw9O~r!Um$Y24=4b?ZB#(|hTBN_4&~I{lMdUl5%hce(N@ z*&DR@`@_FfeEjaFYmyht+IL9rd-M(Ckm!2sXD?4vL&e0FfOT1AVO%zajMJt(tHt+S zj$6oTKU)oX<}PF;X86skOEJPeZX7(D_VKVP6#bF-(u=Q%JWFqeGSJ=%dqD9G=>r!* z-1dxF@LG5$K6#{eW|ie5_LJxNXRsRF4=;rWVPnWS zOzHFggYwLmZRfo9GuV)4bJ6oMl$bOdXTx%^3akRF!V6(-DECWSzxdCXG#iOf`ezuF z?>`O7{bobC-w{xr!Lq#?P8na`n8Uh)bv>(*RX(q_h{R8Cr%h^%thDQlYz-}3Youb2 z@iN0v`Kz1ky(xqih7oSU^X>k!rntaDhs#p?mD2hN-xD9Nn^!v81D z@5TRk`M>_3y>o%HYU=;+9u<{jCM1OELPe#fBuT2N6y3~Bmp8*{E~gsia?G6R;(AIY z_ghFr$SZ{0FK-ATuXsaVMF^2g=uKWB{GadId(WKC%uPWcZ6*- z=)aHC_#a0qEtRv1PRmov=umpp_Bp`Ta88>XZqp0g^|Qu6d>cOUP#xW7p!mJQ?kEJcd@g{{x%uk zrW4rNWdC?&eA_%R@yhr%UBUl~?C-Uij@r`JXhi=%W&ewj*$GDWUj-%muYr>N{|o2B zpWr+w9e`wi&9fodU%CLv{%ZSoCfR>&LiXp5CALHj{B>%eX5{}dq4MyAy!Iuzr>W)= zV}KH4fD&VX5@UdNvN1qjBUK~ff84fze{6+6_vd@`{r0D={1@zu{Qvk!+5VaT!?dJ< z;t~z*;CGGdNLHijZBg@p)KXM^r<Z+9H=-9gV&CBiARk$v^S>7SxoSTvKv;ytZ?jjeK@bjXCK0bfZHr4eoLJb3I0F z>iPIvCRf{R+csOi&G#Z+x!0zziC6B8 z*OqS^Lu0dr+w?~^+y83gi*Q}HE(5+;P;b}?#Tn1K>kz~%pWAHeHa&=KOi#S}k$A@d z9aUS;XJkrYQtG!u&wX-Eo7eVg7(SLU0VY0B{M7V|cb$>-@OzKWsQu(c@7sNqY(7ag zeO$c0N;bXZM%ur}2yUC~IBKi4{(*e+7Z9|KLVn)|o&r;00FHw+q7nQI%zUBDvtfJ- z-iBe~KY|k>%V#^2;BN42xFECgFE3>@IEM?gNLE?4$nf( z9inf^Y>1AbMtliYOs@3*uWtS2#Z#+agE@8{&MgVO0(T^_C2C;js{zUXCpbwdD%ti~ zZ?kjD3kvhIW#uc(E(!+_`m@z*Ei>YOLiSI{{t4MXA^Y!yvVU34SpFrG|2Dt>unhie zz3Hb(j+gIe7i95zdzraEO(Uw`CG)514{wwFKkM&F$mTtb-@j!3<;d-_cQtbAq@1v~ zna82!z`-56=n%!FSH>OX$Mvj;OVcn_lddwZV?|v1igX>jy6N0GD>_k-vT$iZ@mL+} zt}PP1_Mqa{P_A+gD$Xw{mO?>sYrVL_VDZ>6on&9f@M~)n+WhTpwso8AWz!khbPP71 z1e+gqyfU0krnJe3HoyIyO(*eBqm%gZ^d$|~75#GJzaKp5fgz999~!^zAzt4Po6f_g ztFY-dY%;w~_KjD!VbfvQbPw^$`Zk%~rUS6e%V3+=!=_8KjWe>1L$S&9@yhO!(Iw}) zZKvC&E~P!)lQ_guvmJ&ktakPY*bR1o{b5JA26lp9KpMWtH;~5D*zRfcBB;`wqoHJT zj*aXGQDK<*GkZa`-MyjK#!!4W*aITp|1R14w~o1QdQN@L9RF5x{eRc|m+1c|`u~ak zf1>}t6ZZe}{;2-H>}kK&*NwN&6K~(x)(5urb#32z+c*8s(ntN?^ik`6ee5e&b$M>d ztt-|Qj9O6gar}MM9o^@&$ujZwIc+kItuOjV$v8V(AK2FCxAl!}ec+nv>tZ|lL;95Q z_a+lZ{Ml+i{r}%T|BohNEiOs;|Mk(zU!Bqt>whKI|4OX?wX?1ND3h%t$+9R>KpJ3wDmn~dgFNYZ}G}3 zHd!NHS;p2k-qG{t*nEX-vQO(?@_}lQyrS@my5m+fIPADrrnTrWrRLT&{?VP^=Gpv% zp4@!V0ry{U*6#CHzm?@UHlIG5kC;twY|{_h^yhyT*~DfSh}SL?ugqf8!`GCoA$@pH zg4d2XYF{Ggq}9fBCTMF-l*nANkyh|cJ|>%L=Y;J!xzZPGAefDB&IQC1{56<6{6@Vr#Yk-b4>h1~NDcJ=#|Fa_Tn8ZXOV|JsHh_c;AYlX8*=zuA zBlXAj{}*{aKu^<7$~Ju;p)39WRmSHgX^bf&aqdZKUT*004NoDus6tgcMA(LjD>mRh5edQA>F;mA>_zWqoG#DPAQ|PAC`Kpt5W|7Xeo`-g7JoeCt^8wZu~>pl9vNxmkrkbWPJ4Xf(H#~Y z-h0vL&wqT}zV1c5@>ETYZMwje^UbBN_r9;;sNjzm3M$&$robY;ujw zFUTf`+H5ZI%11W8vUqJbJ9@5_2JM{r$#&GwQIS zz8hvwVy#;<_Gt0fB{L3t?WQ*C&Um-1c+@H9IL?l?=}0bHNpRbDvzCgPucQfaJl1BD zKa#!$@<)=A2zkw{143hL)<2=4jvP!1Uh~LED8HjourE9Xk|vT5`@^wt5Ih|Y zfgyMjoDMVLMKB98zQ`fZ$mQ^4cmpJ_$Q*booC}$bDzX5c2KBun&&b1&bC@wt(QAmz zWc`tz5$0YcNM>BzroQvoVfCHm@b`=%>YtD!sqw^?sDYZT0lH2#CI2Vp|7e%6|7B+m z%^sf@PT2nv_P?FZ{wLYGrknud9RuXg|54kM|L;II-;lQVc6c=M|ANoV7@&Yr0OV~w z|A*RWe^Wov+jbFsIXqe}j-Cf(Lf$wdb8kV$UNF?1_apXq-)@+Uv0z8b#hV!Xo}4u2 zmL8XX{LtC+KKm(W+@oF3q$6vSn|8DuZIhR6cG5peE`HR=#kpmh#(q9(-vg(wdtm6i zgFB?gKj+6flh6Fxnd_STbY!oG?>pL7lZ$QgwM|}&SN=`R1+r_eyAjxI z^1Drrw#nl*c{yJDZ@hB!|H51#8)#?U_L;RjXs_204j^tVLEFK|!D`l9KxAmGO&U1^ z9s$S04v_gh%s8W2P~(gwXG^}9oGrP2E<6U_346ltVQ;tvN}k_`a}Iz9z!Tv?Q1X3S zI0POKCEsU4J|~gCLCN(2I08QR_07ym$o@N{?En8d|3`>+HIS8=-oIA{@^{^o>ec~W>gfV5pwA__emp#e&fBy5 zyYqplQB`X%Ux3#7!`qVKNIIg?^MNdl@&)MM)b|CbwDI?3MXkP&N3n(ty7eGD((K-)bhcS+H z|Eo6tKZ~xy=4%kI&$7){Z__>4bQSU1@Z;50*mPI%+UjjKf13_qNBb<>bO|<{flc>g z(>>U1{x;oDyt;=SJuXwW{Z9#QdriAT`z@dA{fS#m&_=^rVcT!SzHIyZK*|2cLD}|^ z=Zy~FZ%{gbY=}zKtUcNnBBvYMKK6H`3n+rp0W{-W(g7R_r2{w|N(V3i%EqtxL}la8 zg3<*Hhv+9FqoH&GK`33oSSZ=Q49do@?~rW#XM6GILFoi0a^Byg6Zoxjo6Jhc{?vS8 zOVmKk*8tt6nvnlPUA@7-pVV%g;-osxZpOOR>IK=jTD>r+Ag{EftYl0$wRJ|D)FGj8 zK~ce(%p;eYUQ!fd>~N`*Hz9vJ=O1xR)Rr!)|DBN@&+uy3!yfnJ0A1P1ZPR;zpt&N{Zk#15T1bl57k&yW$B#Jkb$`V1bD z**9bOfb_mfG^lrarc0KJ92)2|AfszrhS3?xWO{sej*ILlv2k zl`ae-ZNL2AFjH$`L2h1AxP2%;SJ`l~z~CYMhGeAojasp?PardEU^Vgm2IS}G<`fqP z^V^S0Z8xMNl~h3Og}QWBUL(7938c0guzh8s^d;MuvbuR@xm8qN@9~6=+w%-`Y@c7q z4evd1yAn^F=p|3vj^ycSZeq7C)BE>LKQXE%b(>Tpu}^71G0$RkKX{LC#qYRL;66WO z$iU3(!kpr8H4B0t+CD09#q$Nx^C4^bNK z;K=}q@xO`jzlrg`iSfTX+4x_-k*X01U|asbjhqH4Pod1!c;8)|P(g7)7+>AGDFd+Y zWoGrt$Qm|uz~FvEs@Mi)D@>(L4rC28w!<#Yo+&(!+*tm`r`Q2M_j?PE=>8`IhHVu`(d+e-=xK0(e)oB%Rozwhu zm2qhm=RLRb9A19zx(d2~swGrltbe|HitMT7#PP5f6%?10Do@4x>oSy-g$i@RV@gW7 z+kU*8hq;aBE-L;C@-fe-_MTu{k)jp>$vskj3K@I47>Afbw)~VpGv+0aMa46`iC@;xd9wN8+H77mWy9)W#<>=U-|m*Z=H2ECAO7U2`q_i7 zbDW#&O0Jvu^SSGKE>4*-CH=`RkA79_9LIUU$PWW^J4|la;)!k_PHp}D&u52%_IbiK zcUL}VMfSgMcB^ZDdaS`+m+d?1yf+-jX5+Kj?BbP|Y~uss9hYE}i)`ZwJ~Z|7z%@TL zTyyBKHSh0nQ`wjA9D$6JoUVE(y8ih4&naC!`|MU<=O1*?-WbW^)jRBHz09$uobT2- zbMVQF`i2{{I{5kdXCBl}>kg{?9oxP(zjU`DFP~X-^(CW=H?6SyNYs=bCtf++CT}k= z&-uqm^S;~gOM`o^>G)*+%~yW1KK}Ut{#W%l@#<^3n)adoiIYF>aq-u4SDku7oB7R> zpTpPO=n>j&dUO9p?|ygwsvgfAH+x0#0#}dFpSI5HXBgeVQohsb8g%zs#|cSJM1P(O z)!a^jvism`9@!U8gX*tLhZ|vp;PoLK^(~a&9#G#QZF5K`-U@ezOnVa1cYZ#UZJl*6 zBTeDm@DR8Fwu1LVeD9qHU@da=* zEP>xcePe%sXF*=!$W#Gd3V9_W*FaQtW*k9nIG_Dp;k|G-_#mtcABXke)382#9%_!Js@KbB2C~CusQ4q<%5t0 zJ3&H(&xq3*_JLjCiI6o@B12$TD4&F5;mMFRku%{5Fak*%;hAv;!HXfsL@tFx;XKH( zk-OkXxDYbtA;P_O$Sd*>cnW+LG6o{@BGi3*6|RBmYmO#f&w-v5uRmb=33?7{5!aHS z?FrJ0&%ip6*CitVj_#A|J0l4p!VJP(!efNxgii_1l=@CnLRUf-Vfh-z*+N*+uD&z# z1IOt}fyNO(mEg~zFpIe4^Ozd~_KdjmDBK9=k!BHL!Q{$$_*SyNf#B=p8k}F>X-SZ7 zZaKjpt5JKptE-#)1Xtzh>-vyx%M9uOo=uoVc#N=;u$hq9{u(tj{a;ajVX>TK>{$q7}X`WBOa&;=$P9aFaApg&?8T41b zbA1A&xKzQ3uA*P_RA~BXE8WDe%>llnW%!zs)#H_!Z8rIMW%V8H6H#nr^$`aaozyUA z=JOrS=>2oAR~~;WF*o>t4W})?>k;pD; zD2{^a`yuZd85jB0%sq#!A4w&CAe1aU6dnUM@ zusE+IKN#?b!J2-5RA1lN%e}9F>Gx|Mu+7+J!$juxH3u7et>*nwob18T_S&D!xg6(X zKJc=a`ty@5_iX+WHt0GyMTB$tp!dpjWs&O2MUsk5-xF^$<V0O4G(tn zazf-QTX8UEe{9VDnclw2s`S@*`=5CGw|V>Lkze$+v{mJ@$tIyq^%o({eQtWMj`IV> z<%PNxRb(s0d0T~S<=2zRj2~m`=`kIA8eZRgMWVyC^zrObO_G9a7s`r5T^`%Fli26FzO&<|dOqDIn*eP&nV5vnjv%TQYwv#~2np z55NlEclo|(zW(fC=Dy?SaRbX}sV+_R|m)N8AbP6>GD(sQYM zR_g8h&&@5~zMdQXet%5*m%RN8ys}o@W3Q}DD5IY1eZ8`-aMOEbt@>QWKFiV1%@$QU zo5lg_Pwa!vX`FYx$ulW1rZgDjRWaAC^ZJ{fn+-9~jr@jupQ#2T{O2YuO~>dtsa+Xo zo)g6-RmOGo(?!LZXGQ6pigX<-(rq5@pQF-`>f4IA%DE>h<2oX;x@GyKGF@js?v~0p z@7Z>rQGIvvbHX`Fr~7rbo37$n^6$@vJ(R-Otj+y7pSsjHc@MYjfugW+;oGifXfO8| z^KI2RkM#Ea=eu{z{*ajc?3n!p-oF1#zUb}y&tRvKZu?&BJ(FX+egF6I-oD?~ZsIzZ zQZF{22%8T`O|1`Yn-efzUk2M)B%6SyEiahq%Oo6m0?dhfu8#=mjzDKE@knO^59`&tVZ)|QV_p!lij7w*4nvol*PA zi{7{USlRTmwP^s8lU{Ay?1TFbnArdLOOK4SUf1YtZ0Eeu$w{Tt*45kd=M~w7lYTia zXI0%h_+I>iZY=5P5qqEZ^5D)JS}d47zvy2*{%c=Lrlx$FY`$`~`A*^;Lub>Q+s4qP z;=GZZbn5t~M?XHP$D`jpan+cIvonsik1gtcjMAq)dC?V9ci(5`eaH13H}ugBC>CwL zhc+KBn=hWt2k<0wfAcqwz9aXx2gfe`VNlnzH(YS2>!UQ0HqDivc+U8HBwuuW6ZN;Y z-gNyX4)llW;-R~Y8~_Kx=5R2it77z=(t8eLUmv=YVK0bnCNdfZU_K;7B)8E4H9jQc z_}i0_j7*^Ot6L}Cr#8wL;gjM_hHc@MP#-VcG)(>%K+51;1V_P{@Kks$RNmJ^$zrqN zMyQXRC&w81M(4x3qrzw99@4Sv+zZvuxz9UJd3iEQwdH)4bSme|Q006Fs+|9Vs)yI0 z%DDonobN%Ea}8A9A3>FKE%eLj_w`lpvE|%AI-;HbK*<{%V~!ij-(H{JN#k!Fr~B83 zpiRC>DrYL(6VeBY>;+rEX0RpHeU$H#IwFTbm1iWu>&u(Iz4BH4@En+J73uWH8mRmC z0o)IM2vgz5@G$rZRKDw=IyGNG<-e5R_S@aHUX;K3Rf`DP>h0p{+v~&q*>3<_!abn! z-4m+ZDNr4rz2P9Z59Aqin!?dA6^@0?U@>eC$HNxz9M}r-Y-!A2_v z0d|7(;E`}4>Nx;_+ez2H))GQR|ez?b20xD4ukz6$f;Y;ja0cn$*E8$vr72E``hPs~Fa4&cx)OFno zJHUAme?{X%s=1Q!AB+^h$6yJ39F{};35{>!y-@QZ$){B^g07=3tbHNAcZ8mV(S)-J zvj`6nmJ>D%!cPxI`}@t~#jJY~zJTXqw|n39`|BCOPm~kp!&H9jIhk|d5{^SohpTCz9j3Z1X%p)u!tRQS6G`NK8CnUB%R}IvrxWC{3uZ&46ipPf%%oxi%p+p)4$Af;?uL({19zx`P%d*@s9Pg=|^mO z2b(_8rq_$t-_WMlu<2WEdQY4F)TXbr&FK^GJhV1_@#{tp_|gF_H~;gU&SwVi?VJ9^ z&;NN!GM}E4?o%E)|B7{w?pD_0#(Qc{xgH_y5)+?3XjZ=?j!XIH`lDXx^+?wT2Gch; z@!LNJFkU^~ezjGeMzY+6IY(}_uOoBM70!u{mA=Ax2ku*JNqrZAh$mu z=+CZ$)7hU5m3}VdHbw4+7sLDEW$;0G4V0Wb3#zS^UTq-MxUGrEFY-;i0{Y{zqWu%2 z*Ru8HtyurWg?};`sK)yLIi+LAC;I=1{(oZq&%uc`K=Ak2Df|DXk=iNx|FL6%{CR#x zN}0_jzkTUXuZ0(8pqDk@-lR}YDb9f!4OCF9&!LeE)Q0<;bl%=(R8{;u%P&i z@{(}S$RoaQMH3lr*d8aO5FRB+#wq(jGES0Y98(PWRM8Er*rNV6*CKziO`bnv<=I_d zBb{Gmue?gPT)t1FU;f6-%XAU-xrRvtYB_<>*rMW`B5G288goo}9OqJg_vNVwdD`S4 z+uR^FyQWS4vdJCs+Na~~H`?Srn>=Nc*KBfGF^cizq!(vh`No^K?Yi%mFQ0SykBz>e zvuBgPY;urIeu-DkidSy6$yqjer&b?b?@^)o|7w3o+u1W#J@C?JKXhro!6o4joEU$M!*@ye$*x!5NE)|5PD(;L|2ESug&@>hRaK=&Kqej8e|-;en2re$RA zG~^hXD(6EeE6gXb5ya+akDnwIe;*Mf5dxI7DM3 zAMFYU6VEGc?3UOHBLVj7Lw$&Lhsbgcwzi1$Uda#{%*-Wn8Enk{Rd7FeEtLKKW_U2X z6Q;ri5F1_O9;mrU?t?AhW3UxObs&3f> zj2wOgl>B`MoC9^=c?OKUPTGk23B*N4Lya3uz7)Bf(32oJU2~jNC#T2GRV_Zt8QvDe*gNPML2z*ZlwRj+`oyrKN53)B#oW8>kwQ{I$MYgOtlM z_%Jc~SS_b8uQ0E)AY2yA(`udi?P`7-IaB_a0kw-}WVF67+ha3qMuR+b*oe$5^6=*e z*-*#*I_Z1MXWIC>Nq)ZlD%VEnj!n?1+_4^RYWM%Tl{-4r$hH3XnZjM&AJN$xAIL1I zu})uA0dO~N^$-gsnK;k)O!eYB3=Fw1l9EcChsKkkP=nJ#;m@9x0(Cv>y4t% zt$UvCmeJ8Y_w^>TIQWkmS5Z@TIGY?8ub!o*>~J={l1-0e(~sEnAUk^eL}!Gr(t(Z@SL2~_nlAAeQD_Gx7$tc^ibw;4H1HE`mY_W$Fb?N{wV#6P4D&y zN{Hm7HUC}l?9pG3oq1cG(9oWUyChy8b97F+{$KFQ?n zw-cQUf9rbmUFCH#8#;rC_T@*dZ>{tPI_^_~`|WeTi8@Z@SWVC-J&?YWbzmd72W$!( z!e$U%h*>*G`kv10OK;N~q8l-D;qD7nPIM$jUnKoc9{WuppLgd#SPZ2HDut==eAo<1 zf7Bda1EmL=1zW<|@DO+-lsXOe*P%_%b7q~M1;6a(k2S#KJ$m;9LX==Cq zO){ys@ilYp;rcyHh+f-gf8<2j!dBNxT^H-1G_2)=H#T4SC%xr`@WYl zvWj*+bwgUclmGnd%x0q_xc2z(i$ zGBdIrRbpg0y831e{cUh9zrO_6!GFWg;0N$?h`i-|31w^k3L>vKlqoV6z5>sHuR`p? zW~{!xC*QKKa`z;7ZLp)ZS>>(+I}@~BN;*+8Z*#~e&Wv%M3Dt&Uzc*u%wZ6sTYpb`z z`eRrn<8)ZVcxlF}F5vI#WF6UOCGSMbI`h-&ZMDAaq9wJ=_*7rkk?nRR=iWp}Y>663 z)WC16f!Z8aGxERY$8r?_iS<7cJ^%?HfP@dgPUZt3`QJ2BHKG8Z-Hcb(-^4L>X>j9} z@oX}ZO*Wh7$R1L4zB8Ll6|anBo43wp2aDGZTu@u(U-|MmgBESMVPV(ToXaxX29`1} zijnaiyd(6~xuZWkX7DrP|Fi1rG4rqq7`xDtXO{K*?@uq?y|U*=D^|VrC>`#2?Z65D zWY=zH^G~+vP;7Q)n?2cPm#Zl|r%g8$?|2HEjwW9FzfCp{(H<bWqsKH0=BKe|4>b|)}~bsuu*7;I~O z0pAw3vX(ema!FWXVatbbG%+PIhwm zq}GcL{(kgFw*tq)-(A46URBhW36BlCpPzj6u6FZt_Qf|xvO+g+t??P2 zPu`(kW`{tX|9bEITH`Ifq_pqEg7DDNlDuFUUX9z5MKmr<-;pqZDTc!39HTPa9Eow5Hh`=GbJ$<#nQL z(fggv7{cnx|4K~x{Cj97MxacwGTaI`y%|sE-NIk1JJZ?Hz47z)$0o++`>vO-J0{Z2 z`B$zvD&IX*RDa{tF=T5(P~UN1!X4E4CtkiXin*)WRlV1$7jHB9YW}CW9Gl{V#^eUa z78LWNfBzL98WSweCr_&AtaC8oE{^>DABW^`+kpC&->8! znCHOT*K?r#{cmvZ!>!b@>ZQHoKBwz<*Qv}LHfC(@YW`k8nieK~QhxM0eyK|6ZOL$D z%$VHe_&GNwUgK};+^F;E-LG6%?q|0Q8mHS?*(lwH%D5x_xGyW>(&YMP(pAP)j`4Nl z%sGs^v+{eb;@FOQq&T*6?5@`M^yB0ksJ8Qr@&XNcHtV+PniR))-aHo043>KFYq&1G zXC=jI2i#{{^P*||Z)Lpu9;mKwam(QN@8DtHcVMVa%9i57tP!s^)~&0$rjdz#?!2VJ zR?oT0>0gg~Ka)+ik6F&q*xZl0{%5Yra~JP<8tma7v8Q)nLnxhED{~$vkmohV+q$0U zvX8dp*~QP(EB*H5>A&}jygUa|KDB!%dgbiv<*9edU-6euXq9@2eeYG?O{Ck*51X0j zC^_k@$o}`uZguTXk2SdKvVBLL_lA9Jq|NW$ri-xY#NxH>+s69ZY_>LE1DmZrUYoyd z?y(&`_S>f09Bllkm+dvG_KRnY{!eJ~&$pD`c0H3U*>p#?wb&kD(y8R6fw>(fH*E1l zw-2Yb{{H8)L$o;Y>Q09n-R8i|pE@n7m)ZPp-4EGw^c8#Y%-QDlv)Q`i)xpNAqn>Wc zSrDA@>}k&Yub*0zz38PAzI-Zv9jr}9ZS#Gw`MlW1Yt)pFgKh3fo9^A_Q)AO<+vXJb zqsD~W#(iw$S?o{npTP1-+C768}S_64=#a{!=8uAZz#c& zha4j(k)K48J_KzS?c(Nl8B~|$a;R_56;S^DT7yh|TCG8L2)q$0Uv#sc4C9W`R%e`l zPD_HeTSzC~3f0-ZJL))3ws2*RnB(5{j(ZQP&!)A&{PTITL$$|!=N-4%JMMe$I9;I(4Yq=J!`ATckZyuAA9jLwLDTn# ze!gCx+R~hKIL!G0D&JjdyZQdazV7ueP@Tpk;?>93@5(nq@cQ0vpPYPkz3NA4 zW4^(Nm;!aZniH`F)R=me`v9ox)EIi@t1^ADP_^qt}5?01D%!lR+e zv4-IGt=&Gi>P_#%3WBz8NT)7b9iEH5;jU1>*M%*i)-pT{Hh^icAyl~zf_>q^a0F}y zvte^M7HVz636MDlBN3>z38%pJ@G7Xa2XBS_;k|GmdN<5V+ZkwuJ{k-QT8A&-1}heb-djhm05A=&qTd zIT`1lz^+CI;|P5S*@Q6R62g4K5`sUc<9hzq`U|yha_4t!3cEAs<48h? zFoQ6c(3$v^XEDzK3=u9N%p+{!yw%MI89feZTjP(kZeFziTG3Aw;-@Fpsd9u!gXOu=iZ*gV2+ZMJOapB_y^)4g3)` zP@9wf{_#I(C`$5jI(BglfL)x%DQaKUH_)awr_~FC3i3)z%1XwBQ(I@WNgb5KUTUwh zvS3lJtKE>^&D9&MG)FO)OB5x~N1pR^0g*Ow=>i?1_e_j1=8P$ zNKeIg-1L>`vzk8Su~72>^?<36@4Fd`*%P*8zZX;+-5aX!kq&h)mn7N}Y9X<0Zw=^~ z`Tg&I-ni4t!tMmX9PyMd0!@Cx6&n8`Ros`aQTwYnn4raf% zzn|7&t2W?2rVVh0J#yadZ+1NGn!Yy;9NVDR-+#Rgc#QLV=d37;`b!JEa_Jq^pY(N2 z8$jRNv;il;-H0Co=`~26H1g3&Q2qQ&xF^hl%8x#>X#+;WChY$Wsy{XgN}fC!Hig;n zAb1LF22X{}VJ=h~kO$kqe5m_c`<6t%f@(-?zfuEwPBNS%eTtlZ-Lkjky%8!6=9U)} z=4ZSA7Zfu)Y<3amvE0+LrM}iIxTX`(jXpq9s`LhuG+Mpj{=an}U`QxjP*iXx7Npel zlA=(7-w)W9ZQbuDApe@JCI9b2XhBdrk+a3^CuC%$2L@26f}FyFGlNz2>FSq6Z?cz6 za*uTy^Ri06?w?C@>T8QV*R-f}Wd%!%3W{@B{bu{lH7Dj=n>a3&8)BPN#I`P`ZTy~1 zXKd3=4oA_DoRojkhwHDLF?;@qPrurD-@w!9xY*X)SlCGEtIq9V(>2;`1#S8%pFNNH zI{DqV&pza(=6}EcxW#9_75^L|Hrs_wm%I^$N^;VdyFD@HsgFLtb-%3Uk1aoO6$%cU z?%!sku<7hCHTAjWns1xdPtJQi>ysmM_vlq01;%Shrk=MnOD}IWw%xl;*LA=6iqCIH zk7LqT9mjYSlPV@BU3%RfM=v=4x~XSv{P^6aIS2Cbs8dJr!{^@BXk%*US&QrX{3>5-Av>l(eyyd5mUk(^Zj#K|A`xcKY2t4=+k&HQG`&)LUG+H~7C z9k5NuZ?mxsH1%I~oT^O+f5|Q?f7SIt$C&4*s;$GO+y2Bnw^ip0wdv-km~yT?efl$t z-d^}js}Zksf4t>fUe?D=eAV?q=a};Be)8RSu1%ZYpw?*zH$U~gRlcu2n?8R>l~hVQl7Cy<#n zu$uUO1M>58bBc?D`R&K0wj0thwcV(K)OI66T{bR*B9YOXYbtcIyMO z$L1G=3d_r4f0j_NGtU26(MZ*Z12FC8w&WD8@!5<9)?d%Vmn9nP>V9Lc0s7*ePtbZE zhn%Z1fJuRXDQSTAw4hW@b@DNamQ@ zf?UOeok2EJt-b)T{8_-!^K+uCKtCjVE@y8VS`-dcRf zmhVs9WB#5+H`vF4*lb_d{-XK!kA1oI6*o;e@VMqBcRVw*{j)eF*lbxgIWJy0K3;jw zCbz|_513-!mt*_)I{V6d79DjAJOKa6;_wc1`Ko!Z_vq5MGp4flcXzyXlg+W6Ie0FjN%Iso{N znEC$YNBsry_JrVu{wN_efu8sBVBYVJ;Af`tr6XKI@)=X;& zN3h=xvfh0JUv!7{?jy&*e8{=X8uysM%o_LoVTkyFkTnb<OlEVCDzBcjVi$1z$bSW;UAivo69HnR6`QyvqrREl~r1wi>8Sfos72S5RD5 z;4lA|nEx|j|4YdKsR{Xi=ac`{NY#w=zd!5$Ne10?kJih}3zrt=1#Y%dW24}V={4d?a>mA(rNw?NbP@nw1tvL|-JN=`2~cFovx>HFnv>Y8H<-PP35UJi#zF~KJNgVH@r zo<_;QjSA=F(wDFF?;N?CQo7?XMd>mgBmKc0-Rm}!z>sB5ZmDj;Hm_NE`~K{E*V7U7 zE$O=|-@D+Uy%9N?y1?Zp=q=SzGs$7@~_ zr8N%$v!h67w1PP4nX1G)*+%~yW1-f`m9yV>+0HvQUPO^;^N z@2p1okeqZ~w=M&|SWs`+3B?)DKJwbP=V=VF;;Y*6ZF(P@5B84MyV-o^ZF*RnzA0XP zoXvm6rl;FTo7kV=eV5JmdKTXmeM-9%w8igaUD!-uw z@0)AZf>eI`EcPL2JCpJB;#qKaI1Q%43*iy)Qm7At=DpB2{A#Ft^?~ueqh_810gE^a2ebiz6y2zPa)UndAt3CBSlKLKunSHsnC4tx*Z4F3)9ge&3Q@B{cT{17gJ|AjBW zpP}?>Kfz_*{_C(7*Y_6GJPPl@J>f?%8Ga5M!LOm_Pxu+8!rEN3=26%UYW{=<2rte-P{nyTM~1&7|2M2z#)PZqDfi1F#>=hnioZ5DtRH-tS@9n|-Yxnhwv0 zgW(LQc@>!Jz!?si!@xNi-U_qfd>DZ0*N*XJMHjsE-oo78C!z$I$q7ALS6A-??f1hQ+Yqa zBz)QByWc5|U-P<6$Qzea8VI|Qxb+Y0+iP&3*I+#G`9p5+72ZCBv+(ur;5z$P#{Lz@ z0OWV4g%X?rX4kj>qsm3k?ZGgb;S>6cQy_`+-_Cv?RX){wSM+w8P(4r{V($K+sh3S$ zM}+%k(;3;u7}&;~*v3xSbOAQqoXyuMUf(5~j>)FOT5fb<*F2hbf0ysS?DBoE;h;Ic zB-1#=>jP!eS%jr!PU_h9wfUvH4SD&@qN^_%UA$?9T{mjeA=-30HXVn}XDVJDt4)_@ z(`nkq)!TgN;`NoY=_qZ!Z$}~gCnrUw6egv9JM`Qq=d^ikuZCgT7@N+~rt`J=+}V62 zZMx|mM#owle!E-tns=KoeE5^6>SqtS&OWBdrVF#AHbmB+Bb725ZgD=7h-~@O%#9$Jc4f(bi9o3oeF7_k*dkjv2PeNRpB8%Z=@LkBU zM)!0TY(bgPcSZ0E)0m$~TX-#GzEEc_l3I!mDXGU&^U&af+GbH8uycTe?7lV33x+Z&{lu9IfS z=>E{7MWpw9A5wN_!=U<31AMevE1=`?{lI!g(Cd{aIr;ELLeI&SGF!_S{eqize z)4IyD2t%0zQfn)3BKYen`*SGBA8aB)b16iRE0TU`IXb1yJE>ktby}11e^HLR3~)mJ zmmc9SI0ryN{;y^Vg2b!>F_R7a*=H5-<$pDI|F81@W1jqLzwhVKobn809@xTQtUiG9^efC6TlU-Z z0cY@$Dh%}rmPxI_Idr}XeL&tg{b1zuRDKH+j0;MIj=~-+q(C}nciz_{lHpJKhTqMsZS(5fu4y`CcUd4h<+ycxr#nWanYMiKcG7D^*qt{ zT76vI|NIGC-|M}Jt4{aRgm`nWqI5sHr`6r-)XKCK_qwGY7o`vK?`uM5(DgOvvdp#t zI@30t!7oN4J z8a9Xjh0?8j4-bW?BO~46ZV=xT2iL*KiEwwQ{?MLqBgv#gaKC{@4`b?C@@`v#wgX6~ z?`2b%0$V|SJ6pqd54s`AR zu4pDRe3bp)6BA7alHuH~di#I7lgzl6?Y93{Cl@NtmkS4`SK9LT=ESa?H!!_VPB=&9 zP}(S&&_qj~tB~`fLHA{VNnc^3kGd~4D}(Q-y51g{`hV5lZnJya zWa{?)Wv4B=@{K#6TNC=YevjfK7DSrRX|E}n+GcmPjZylu+u?2Y+Z}D6xA~R)+3oh1 z7`uJd`SbrM`+QBx)N5#O-ESb{9{46orrwV@WKXkoM|RwkzxqJw&HKR)@OUUWaR5w* zCqSBQW0xNRk+UPG!Qqfs*|`KFcRQmY^0vdrD>5DC!y91`-Ui3PFJJ-G+$rQ?#&i_J zpV%iaGp1t_+?BFQc2}9Fz=I)qMh<~9puX{!!i^kf%IbZC^sUh`(K0P=7)GX@1ylI_ z7N~F0t&pxxB;{XAS7t`Tg^MY?6jNP^4X7_|KHyqICMm27M%=#eh7a(0Qw@1`h>`HkdW3#Q4+euWp)zY8QKKzmgC6Y=W_I=|U5-0!me{t?SIw+Ed z1Lhp)>WSNGzEDrk@IaC~hn;->UMI~|zf7vlpxS&_j_s@hcw1!|lYX^aV@gYk(ucaT zzm8E^!zGHT^b_brg;YCkfDczF&ov%PMwRX$MBKLg1XKr_KSJj!%XQDK`5|;{o;MIc zb?47T;hloI+CAk{(k)Zng$j(mLUU6zQU;q3b-cdAHd)fzxnD}Z=Aef^paZ_?=tnd zAO9hLS?L6-u5o6Q&22KTO-4JVzw$30zWjx0?|pO8YtOB1o-y^#c8+5k(_oVUZL+OR z7Pjd?Y`UOj=KdCpEBV(aC#)a1e$vr<<(>E*4$txWblb*8)YQDRU!x99PI~3i%*Vg| z;^Mm&e>~)^{9|g-AlvNVHlO`?$9%-ABeIR9u=%jt#!}d1aGP(wZA^?!S7sYivXOSH zKf(RR89Ch9%r{25Q)G3swL)g4`8R8Aw}m{`W}b=mup|3NKz%Fu+sMXEINtp};eXEG z$}g4Q8$fL|xsk>&6CMhg`@z_IM?uX4kq!AQn)P*&)6IIiXF&@dS71d{ z;5_MVjcgeRj42J82H6{&A3JBJ`c&Swizs+j-~9$u#1<65+TbIksNnEl6N_FstEe=lbLtC;;= z+Pkv2&KEu2ev5a#^vBd~Q~%8QkTmt&^npNWu&88wF#3{z^EEe(Dub@MP0W6mnEmva z{h=}Y<6`zF#_V4bweMcDI|u7j-B`Ak1SxG=5Y}?d*SP5ec_pDq=Fz~VB%n!j%v_v} zq8=sp+2Am3-gC8Uik_(y@2Se?2aO+59OFk!cCw|Z9RBJI#pWDIrkPTErvXFCS2{d@Q{6S0zjfVd zURS^FhIOb~cY`Y9D(dcp%DB$TTXk0%=hj`P$~30#q)*iA(C;wXL(1pRaiaJ0UAKNr z8x?)6^Sx^|3QvwzWqi)H4tMho1T=ASz@2@>UWfjB6V)E;{3gH3`GmWwGTG#-tn=s{ zS+3Y z+18P49DVIey^Lk2)~5+SYUeA;bDb#qfQqbdoR3ZkRvMVNO4BD95c2p zwvJRzJ+~X8%C36q=FQzRu%WWW_D}t&eJX@o z{^*$f2~qpHR=@3ByQj{8{{`205PTMX%eCHU(kBIi6GNJ`+^bRdIv+Aexc^06r+KAh z+dx0Vwd}$*rlgGHZ{3r|4mp*IDJiNiH;$({RBos~eXo@mW1$~K6y5ZpD;pA<>ZYEQb0HUv903^^ls@|9#X!h3?XxXO46M81=XG}v!uK<&)jR( z%`(!wW3I`4gQB0orF?s}{g;MgU-&Wnj8}LG5y#DJing`E{mq zRaZZ%OZ9i$`&k(DzfpdBl)smIao+%S@2P6%2kNAAH&cg9n--+lmF3*lcR_6`ucv7f zDz8}A=k^`+t@3lzz45!&m-LreYPZDi?mjp-BV zUHAJ$*ShnMsXy68hp0b!Rb|{!e%$31ah+5RCS7G*$0Pl?=@scZcJ<@VtcXjiI7dNc zTxUOBPGww0ey3K%b>hu-&s!On*2#}Mr6OHg2S09DWn9IvgDT=WRivwo>!|L!xwiXE z-D*vQG;_Uv|4z?T?7h=HiN1I0XXv?V&ifd>o`BwY-_Kn4T=wGFzV;^aT1dKhZEiN( zn$3o3v$@?|SGKH)KcBm<=i-zZQ_`R8^5|E!Fl5+lXg1qvP1)9J%7#{KuIt5FSHAJ) zZM*LK<;&+>{$rzW4#$S{i)^qbuPkYL_kAyAWEJgt>V~v>C&%x9T~oHTcx`AlTdU2s zW}9~`UYoYfMpsil1()~NbGY{YeW%rZY4=~Q+I_!+n?G~oWc&PaHRWqyvu)aZ5Ny5% zHD$ZD`7GFc3gY!0u=xnsdq9Z+{ltTM~6$EWpU{h4*k3K_$u9E`p!J zr{GucY4{y{7XAdEhsl)pMYu0~1xg-81#4`r|Ax|+z6Euia|xavQ$E+`I#a+*{mu3P z>2#eRLB+3y2f&Y^O6x;OotgR5v{q<8_Vlo! zRnN@LXUe6uFZ4Wo1$Dh&L!EyE%z*!aI?r5!tG_dI1Df+hzb|!I^Fi0m+2q|Xc~fQQ1XpvD=^gni(3Faur>Plh)`>Gy7f zx^CJ-Pxs~O#B|-wh~JxdZTFH+?e(j0IQ$1Z4K9Y|@Huz`Tmo-~FTh*ji}3GoDZC5* z6W$M(!3Ux8`v-g-J_A=k-Gfzd6MP5an&+&BbgP~BAZ@(!KGa$=A3;4AA4B;lt%J0& z&U%;*zlJBmZ=m#=-@);4Go+H3;YNC2`+|o530IP#A)0KTBb6I1%c8o(a!@=R)1jDKG-3!keIuzYksv zmwEed!z8jLcH1&EQ&^xT{6ux_64orsmum$8^N7}<&m@H-V&^ER=Tz}}PKQCYw<92ZQD-F7bNV-^ zd6}~zeOD(3=E7V!&Wk@Cp2~hp7+SzOTNmQ93Fi~$<ycp3w9@d`t=Xgb3kA!b61R zg!P2vg`A%-ln^3ZL6}cSY>689tJFYkF7)@0|HW((EFSNA|Kcl^82|g%oclZB|C{jt z-KqV5)kxKh_wV+M{SDE!2C_2K`}fK~H&{2N8I7&)%iG@b30f~D3Y+@ibk7|1MUyg- z^QW2lx5ls*I)!#^!TeOQsonNAq%YYyJ)bc;|ML1!oP06Du!&P?4^Q*X8+RV8dbDolBIuHI1{z3dGJFC_d({IJW z2^GIY+r#sBGx=x@T4zuGly0LAi z?uwsWICSYVS!X}8daoYO=4|>Ffy!pv+R@{8Z8l|_jVWGRo6SaM8&7Goo!M-`HXFLl z))ucV)i$ozW}CCw;94NuB`4kd)T-u_p2~dci^fkgLr)m{-|-c@%jeXZ1mD8j3#*B3-cYpR^mk4eq>8ZBF%KDc-f8) zfU-fg_ToFj>)1aIqQ{E#gjYa)kF>AzNdMt}AKdST&J%6(LPs0Xcj6wX&kK4jql;M% zmF^L^4@AEek?smTu(27S=Q6f0^ugx*|Aa&NUHe(^6*wIJ3+g+i{8XMbT$KBr;JZm# zR36zfSLkBdD7z`g-(VX19BbCx%7x0m6b^&uz;WHGly27iRob^Zc*Mx0%^zN=s@h+Wdz6-u{>oxtcc(We?6elz$n@z_5i*!>*YR_ntN za344dV%Kv{f!ODajTJkdGn)M)U>-aQqHj04>qbzzYiuLN=6T6YtgUqkdMjwtHTmO~ zecjThQ?Ln~PkYG?^yk`^-bgy5&FFZN???AT_^WTVses=v|Ci#+9Vko4|4}P~C&vG3 z60bmRVSaXI->ql$`hBZ*Csyjt4<=UX*5qDs&i~~#QZ*(2H%O_AY!|v$b5M^BgvJzS zgbR-k7H7~DmJ}f~@0M~12DM$B^dT96;e9hQ2Mie;7}V*D)d%=%J#Vh#ev$ky zllp7fCtjTj4Tu=Dk#efxYxt)vA*hV4(5NpqLsRVS~T{-;&L;t$d^g$5@(Z1 zceE^N^S9j5GGI-~dN$cMURf{G$aLbxOM~c&!-@HS67&BIW&PW5Nl9T@qW>RfH+_6wZb?aatNCvI zDQydLipS=J3iMlHd7}USo96$mXryXJ0#Ls@zCOM`26VaC$3M(#)kV#{@%Aq6SX31> z&mI21&Az>CO`p5RIhT`%->=8t)!MJO*>G(AksU1u*!t1&$_KW7R=hSGn@!0kH`w~o zHaXyY)8C)=Md`Pzx|OYdpz+92N3CkLN0<;+F$< zbpPFEtFhU3;3vE%{KVIU<;C6!)r$zwJX?ewi>r_xYvJg3wP)Db}$(p z0UNch7rZM4q4C;N$Q=d6Jm>i-AJf_Yx=KjHtE z7Wj*<{h9FpOZfloy#9Y7w~?xu-haG(e_y}9+Uxtb@jeHwVSVffbJ3>psSXU!DJ;lm zCYk|7Ib(ypbIOAJzAgQ}KNn3Zjd>{QK*<9B{5PXLf4|=3*M!iE(17zU_s-i7N5i3g zGik-$NvmSdNjKErj7`CIPWi&sC1rC$>G&KYkMwquQ*>|#&(}{r5uFHk5_IjUlg->W zfdOTMONu9y7KAn1;DF-v^3u{^aoAjtsRNbU-_&Pma(DIf18R=HCrzH3^Q9|3dv#J4 zRqS^}N|H^aPRgB?aVicrndrEqjIW=r#nfw7PU%>tB=Y5}(Z3>J?Pz%^Ub)ED54OoU zw*IkA{)tz#Je?guZ&HLxIjgHz(jcKa~8PQKu`n?h=3?8w}1+P92|xal5mL8$z*0o z0+X3>l0dk0I7Adw#0wP_1r-$)6>m^bR#DMK#T6A5PgrFYT|7P)_4~i-?qmp*FdA0W z?jOZJRoz`(UENb%@71eU(niX4q`6|h+8E=A$R8dk*Y`tdV6Pd>=_5qjPc1?&^G2A9O8Oa>n)CByUfxdPw*6Ed#&Ke-{|k7` zD$B{r3zZl6i#?1bSJhYb)EMpmDjTVq(E!9g{RwwfB}QKiz>3i8vWA@_wIxXTg$(3fKQIwAa*~7q`{>_teQmt(`^%b=4<|F(BOz{3&s&$Z{ZGqx1}tAQcX>(QA^0$< zE$JP1z0rKtyWh=xtMA%=H*5+lN2XEl)$VJ)Y0)6T^IGnwJqnKK-{1+uc-4I0cDG6? zZ&ldw-4@%czx1sTv_~)nO ze-)bk)2-np*I$VIpwj#8Tz2cZKlR#Dc-~AS@w0^2@O7i!^WVNkq)xA)(_h4@uhHo# zkok;_$UL_H6!D!RepAHX$_~=S*Gj#W$VG%?g7{Gp|0#L=U6E8h=K4jt{^xt@y1Tu1opay7HN$&PYjo}LJ6>;W`m5bQ-(&|t{KkonSNb5% z_UEaAn)&_*1HOu4$Ns0IGygY__T91ncl3XU;P>BZq-sX{w?F%zMy&1o)ai`pVs~?x z5t7v(_nPzD)AGfInU2~R%Qb2f9wi*fpzjZLOq(FH;Py(Vrah3f+x8~5FxIAQb8KH= za{aO80U0h|vkgw^EnP+hYeF7rfn zFV*dXqROMnAo+H(?0&k-KsuX@k2fS>x}omxLzQowm92SSE!byoa$n!yzNd|ky?(0L z>a?t<%7u+jPi4DvOl4ebcWNhA#m)6q<(#Ut9_pNTFSTebrcX zjk><1Zf;4ewktZDC7qu!oz0SNPDrdeW}U7yR^6vgSFO{D>U7UKopG;vqSI|~*7Q&M z&i!)nTjvcqd0DFjj6-78amK0x)~#K2&9esI%b{Cn{E!0ZtO^GlNJ)JZ;aRx8IREtNt-*5AR8+D zhlP z0EVG_`xZkfUp~S5_Q?DcRX(haDs8`B<~aFIZG`e&c@-WFUx!joWOKD{?h6Rv$ zG{$*Q@|QI0d%!owypLM24M8@BP$I%RpnN~>gn4l4!`NNjgimt9rjAv%Tk}azpwg2g z_#h)xpHna60u9gFa}Lf@&RIv;O8B1OY)%bG4bZhPh8S`3+8Nj?9DwweS5RJzQzy~h z`SVK3T)~2Id45mOa{ul4{&wd6ICK9U+n+;B_ir{(H6!{X%f&YD-?saSwNIz(BkTHf zy1uhc7S#1U54Js!t}m~X;bN85bTXDsW{p*b(8*-6%IG>7E>>AwCtLSbve)LdJ2!rR zzwhoRj~e>rtD8UA@aMJr(b;>&D%-^>D!pMv~085SyOr_B_iG zh{UGH?z_ucNWWy;lh1y!3vxE625Pbfr2jwiH~0TNp^%aTiUSjvCTaTt?pnKPVqB8U zqmr3e?VdCLA6o1Q2TOxv%aYn>pPV#|Wg1F~Cl?0_lQ04Z75jZ*!!yx)fU=0;@yn4K zLu!)qio5mdndk9$N*kSKcuKrRM=Xp3L4U9?nACBMpAhPm)Nxcd!e|`JrV}P5bxf5$ ze7COb_4JwODRPHhWoBZxuC9!<{+X`+nW?U!{6VVB^(UGCGjq@ET+z9E=gxbi{uTWI zd%FxM4p6yigG%K;s(fH}r3uIWMhEjs%e+OQ&;cL++q?HUcH}S+lRmk zYpiQG$F?ARA?GmGm8Y&5$2BJe$NO9p-DRb$yklOEbu}wD`PP^lgA{BHj6R7=(X}>Z z2&}o0n7D$!k3$pH)CiSMPOAuoeWj)1jX?ITjNX^dpr+-gpeg%AUt4)zI-d~oZbZ7Q zTU*ZGO^rZCali)?6W3Ixg|hJn5uV`lQZI>#5yto)?jpygRd{@A?VxO*Cm8l}zFdDZ z`@3|N{V72-UlnE6UO9Io`<9>(k2*IisI1#c`SSHntn;;cCdTdk#K%DI!~`qejJlI} zb1UA&iubVMGX|Uc&#>ahvR}po?RVg6QBt$DA=vt4c^;$H@#=YqHwjnB9cD$SGQO<) ze+QadW1v!>dp-rZKXWZ5YhUG4kTKE(^0w3E2}oKK(xm>)+BeTX#!9QIee)ju);%`1 z?$P!cvD>;w$zQgk2;wVms(HM;b9>$+!{o(*u|YX@fA70JzM8~~shiWHlO1$2mu`-M zPL|h==jdc}oouTcch!wg>c)Xfl+3v0^XyKq-*NU2@6GBs^2M*ZT*JD-YOcu4NgsQ! z`uwJc&#ZG(+>W&y@(n|`F3@v7%iNFd$K&6(=F(9BRW}LH@+IHjzXtH(2Z~FWK!L@pKiQbr*qKF)roZ+SU29T)3MZ6@72h~ zcQ^Vvsr$k;^#<=8x8fegw&K-XqgR@?`r!WKDh3U_tVg8%wnhx#ZK$C+LOLCbPPb-{ z<5}NV1e2?2hIq!Rd`Hf`#8UB{@DL5Y4VI&usdXUFM?kSL&jMdN*6Z_YEA1okWYqj2^CAb&^J!IcoTlJPLy1RsN+LdKLU z$5+j7lKHKY`>)6T41#Rw94GZinIlKSOxPHn4V%C$*c4Ls$njSC2~fsk?dM{B57hW| z_2_kt~ zIo{{Y|Ebgl{1xSX$N!(>|L@TC|5w>a{jX&8>TCSiYwy~!`>`~>b!dN^!Q+s7PN=Qc z-gV(;&gJ*Gq(N0Oj4k`fw?e*~)^?b%5o_LhkcWUWRcNL5}8eGgylF-S$L8hCo+;P|Ie4gvd!oF%|BT`(r8J! zd(}7BCUT7p`+Sup-&_9THto$SySZkul;1ABT+g;gZdlhmycEc}BENo?Z5ZntSl5#$ zYF5);vR+i3?Qt!s7qeDOx%1S+RbIwLUGsVvI$gkq#$9Hl9nGpB!_}Ob$y}e>> zyHPKn@pzlXy9`6;YfvXI>*QaZe58}tbovmTUPULL#wth0D(~y`Av*b2r*F~eD?}by zLAz+S<)R-kJgOlJkI2rDS$as-N$}kn445z`q5ScH+nyp5Je?@RQ6vNsX zP}Y4F`SWf#3qB1+{(KY8hC3i)P9%<27EveC6pH-W30?|Qpva%2p~#&j@N#$&yaL_; z=fnHqm2e$g0JlKyEwT$<4I3gLqK1mJfg-2&gUF_lQE(v)!W-bl@J4tWTnwLpx5C%p z68LX;J3NBtB66*Kd!^pxxy|8TtZ$k6#>sQ+MEX=H+d~{Df3B4CA-2lO4)`(HlDNpb zCqbTpvIl+=_8`6ro(WgORQNO$*>?@hg==9RddtrpihTYeq)9Vgf_K6V@P7C*q>RQZkZY=SgvmqMOaBADO8T3ScO~*Z+yuA5H{h4> zpYS`#F_E9)W>}XBcnh*dud=6>b%x&|-X3m&-Qc@W-mCZEU`XDPT=)TW!4Kg$_%SSp zpFpYDPoeZFwnKRyychPjUfy~2yE+O=9mv*;b_dU-;3CDbbqXYkwpj*eveJ+uV&=`KzWHZ@bB0Fi~Yc`Q90NHnC1W-Q!|I6w@mq{`9cH7Kn=gVU+5?A#QA zIF?KI{t9bte{q4Qq^wiOTOiqRF<0iW^kLa4X%r*V@>-GV%E`^xM|%2TueZP*2>866 zijq1G>wSclp#A{Rk)UfjQljLtVBE&3pc@(;PceDWXjNm>3{2&_~MS!p6mZeuLtQ!I{E=~JXfb5 zh*eLe(;MjI^jPKnUy|$dY16EBT4W95d)m|b5V=5YuOlBwn=W#cq>J1na>-`c9KH=j zJ`{QBR48)NX;9=O`3{Jj^fe5TiP=UY|M0h5=M>Vtk~y2mA$1`#qgwOeTqyErK0F>i z09(NaVH@}m>S`s@_kVeWf}^P}*i1XeGyE zYN70qKxoDC5p;;40V-u7+J; z4jcfHbyfM!h6LruDj$kIp#Yu-y^yp>3G~6KQ1k{fU=f@Pi{WK(JiG#i;8l=&QsdAQ zA!Si^2r}M0h4`mX^aww|2>*`cUdU6){}(}#|1X9j_w#I&ywA1NI5F3X%p;v^MHa&= z;Y!FgBQL>g;LA|#173&M!M7l~ipU4>dMNe^H^8spP4I}rO#fp?L5a78cfqdke%J#( z3=82iumV00FM}_@g;4Ydx5EwaKKL?x6utsi!;MhBy|2QW)-!BC$FRfEGw?P!+pnpC zcuuMr`M=2L4>|V#j{U#m|Jzyr`IAEQ{nY&TGT53xx++PL zJK&Xx_Hs@|<-W1SKEJn2&XRQLGuGk*)6{T#y)v1fxXh*BV%Y~YH44hdj`fAhOMPB; zseR(#TdrmAD=nTZMNs)|W#8Do^0&u4QKdIb{AMs^#z3`}F|l%o=nfj0_iaq4u0?lX z&zsMyD>+I%nOl7zz7vj_Yx+5t7bWB>DK7Q6LgiuKgyL}7UV0eoQ~^CZQ#T^tQn_DW zpxiI@YwIhDNQ+f&)s5%t#*=k&z0ST{H-4@g&+n_ow*zHw_sQG(ZtE2ffBIB|yrFck zb>sXxdxtH`ZvDDGJqLfjy#9zGf$V1o|-+k&Yawb-+OdU{OU{J zXYM4zSVG+L4|M> zH7GZz_w%=}9jTkYuCp7`&8vuYzK(9bNUU~7U(@caAei3{!;o)Eh!(0bX-f&Rr6Y&7 zgc-06EP<$wlzjgbA|C(cjO7zg=TD*FL`w(9)DVUTom9m;N? z3B+a~(g|J&JHzR)E1V4nK#}uDLy_;L+?@$l8?4%9DYtykq>QrN!EwSnp|sh{Ai4;n z-h-^ENr)c1PmW+OL0Cjc=E7@Ox5~E9wtenJ``g=>jrQ(2=31PcAIC!qw{(q^tS>h6rVqW^i8q{FCF{F9exEx~E+W0Mx334I$L?ipUi{i6 z@ev64CVI+C-0E0K7oT<_hnEz%Jmq0mi5nqb(q%0y`*?rU@gmc=vhtCFci~()Udi*M zR~r6XWqFL_qkRv^u`(ZE1NGn!rDP4Ze7MP+1CjgXnznE+vVBoIb)Uu?953;@=6xF% zS@C~F#iM2aR7>_hnR3Y1o*-+SHSJ)^{w`P59lNZBxPHNpoRa;c^IvJ@-&Ez!*dA<+ zE~nqV^7orp*kAtk91qdgpncgxm(fHXDqC9<#!2u*t~a9cdd#};1iikHyU=Id(EhF$ zeLrRU$iEHwPl?XoR0i4AwO?I{trz*Fc^W$TSSRo5a|(CLR_)qCmmTRMG=PHxue zV|4lzo&G?lcX9kLn0h;%eom){i&a0Q)1T?|LtoSW$$Sa(TZ&BpUrDi>ID>Q<`@Kk!*+;GN8~HWJx6|kufkf?_iIr6HM{|jhW~`e!na^6DDz-WhVQ^Ga0~1Y zKZ3b%8ypE~Rw8-uUvMn^42Iz6a5CHhXTdL^^r3b_dH#b4*7w|y@4P&J>2k?CAlvsG zC;SP@=bC2{X#i0zD*uaO@6(=mJe2%86RhtyeHt@AE@!kM$R>6`!g^4?_hJuZm&5uF ztM7C5a)_OfoG11`QVy{Pl5&VWP-`f5K=M652HN>q-`#!YcPhtmxPgvM<%cf@m0u4i z`JDzOKi;XxQdp05-P;h73DN6S*lShn!a0LCQl&#%KE2AvfvrP}Ubn)ylQrUJ(x;k* z&&F5k8wte4@4+rY{A~Iz1X22lUqo5YLVO^Ij&12Brk-sfI<}RB&4k^Aq$i{{oXx2L zrv?sI4aAdi4e9^F#bu8E&(Z%m`aehicj)T>q>-vA{a**8VPZRUAzAl{?TO138XFjl z=|~FK$nkml2fR6<;y{XWcM-F#kZr3{Pdct_c2B52e~Yb3k0ENF%%1Cf6qk9p_I~v* zqEnN0zq+l;0OP1cxz=OWH4`Mlb_Ag<_u0?7rpps9i@MRw;2!tc$UaS-8}%O&g4j%% z*FI~Q((_T=Vho$8uFCa1On)NMU-eF`%2;%KDdzQ!;hZZvBzujB7WK@l{2hpX6#2$z zPkD!_IRk z>TID|4&#$7Grr7{FvEuR`%ke*0@r$#o?3Z>T?CA7vx^*XX`mBSkU(@M*bb2?P z9!;m$(CN{1`i`Yo@Fm2BFWOfBsGm0F`6vC{&;3@tJ7tY>Nx$s6BYH2NdEKljUw?8z z3wO(0kvS!O?{yD!_D(uIolfuejnd!se(H*8lOH>6*|J*y{&3NMmrO**pzLQ3+<%GA zPDW=BqtmRI%#Ibb5BtH*_Xg-x>A& z5nm+HdXK+ZdK8XR_Bb?jN>9;?^Q>=$T8}}_lkd%`1lcmI^M*qCu4O{`#?Y**^Eb-h zRy!nZx|}b1x^)EEXxbvuE(W1|utM+z7=|Z8hN_gmN71tlAdcEX`8}BdxrXvnLUX6= zklYXzM8pTLf#cvpI01^jjXae9&{^;{;-bP>0vE%(;a%_^_yD{YJ`C@JtKbSK-y-&@ z`BRUf&xo8_wcbQ>1l^{*OK1XLD_{C9Y*P$cI6({~6iYvOzKJe<-TE%*Vd{*=yMHe6($kZDX;9 zi|AyxL(MiqCp-MnWw%&mw02n{12+Ees_ai5`Cw<(3-10eo%BX=>@u3pHo}p`>h8#A zp!Sa@i&^c1lEGvwS=x^_RvU6MGKT!w0ZMyv3Y78g=s6MI2r>lnMRou5)qT^8U-~(Y z%s}n^`8VnRXB%-MMjOAvqkKu3D_AftudvirS{@1o!`28OYdOR>O*E3QjX@c8A(>fY5XCu$_; z6?f~^GtcAilr}oe@RWFsj`&>*1pUFnAkOPqo_H%%KUubzEL$%^VaTfKd%q%}4?JlL49<^%A?IY|QANJuuBRI5RhGU>aS0 zTE%*at!R9+Mwq?;`WgwU4bHd5-mc~tx+vl^S*>?|*KUyw7|Sa4VUJ&2Hpz6}?+FIS z7uzyI0>|2$=tr$hx&zAoU;OP!Swg<>Sl0JbY2usDHyj(qNu_GNK^X&jPhAVUM$#qz znH86L^b-HNTKtD<@j5@6w)uUzmMw=Qaj!Z#d*p>-%9H7H?*KCzXEwS1(_`-^Pcom>7%b2a@+K9 zn~iZVxNf=O$O1q9;Z%C$vGH*a9JyfR^FL3&rce647*+q$nA0-aDzmLK{qZeC&S^y2 zB5B0f+{iW3M22BI$QXE}6D)^a;Dr$TZdoHN(jQ`Ks@6o8F&>&Th=4#`W6@kpC|Kk-2@egbQLAuC18S-rB&@f;b;5n0O~ z!?ES8sWON}W?~0Bh=Libe!uYMRU=h1U4QJd8YVu>M`z~}vHu&G<4UXW_|Rzt z1KB=LFzlsiMR(sYQLMcNEwzqG2?ol16=n7jlE;$X?8oTgus!m~3Knx@xK!-F8YYUZ zSF*|@)mKnnSm+Cna+hY|RLjR=TIxD=6Hmgp;V>g*Shj0qT6WIhVVNxJH$-Awzq-6( z+ZV34_Sn*W$ z+j7SIUl{K=*m8zWp7^uM4GUEN?wW}md}wJ zepzn#z2t*m>etIWMzc*38%O3&5)d5>=B%l09{p)V8)Z`^x?-`ZY67L--5iQ-RT8`p zwuRFFJ{5|MRX6wm>;oT!{ozAU`sXVl&7$(*jL5I%NREP!k}h*RWlm&1#7;}ufUSW= z#MeUX%#_dP5PX(6GKQKHIR$PYei3{HUIAGLIdVNb9xj0=LCR{hg^0Qa>uswwu{uD` zHSmiS*#tYo_aT0-BirHWa3|~sr7cc|5#qL-k%6obBFrbOB*?tFWHM;-s40U~T!7p} zNI($UK)RQcd$G@!MK*3l?wDa1yM;5E6ZrwZS8haX$*$&au_KF?Pt@EzuH$S@4LCLM z=c|DllmE?*o-zP*tf$1=fZLxp@_#n=XEjna zB>(Sk?611ay^GIBey!hc9PFt%V{xh~0+nAg5|JTs}*Y!Vj{qyB0f)nCCiCg;J&Yv6JdrgRPJ0H*FX7}It(3$(=*#9~D|Dm}~|NoHc|67ez zjdcHG?fdt%eCru?%+EtUkUuepH-=)rR=<(>^NY(3y91>%?LX69BBpkG&HZmEiRM;m zYgdo>S>)jl<+=-4lvDfx$Z=(aqT)g^XHjc$B*67d3J!%lMRxvTH)oe^ja4?x^Nd8o zIKnXUEjG)R6%Kk>#50A(B(hjc!Yo@dWIG~ZN?qTJS!yF_@ ze;<3kV+>cQR4sGr^1931s=T|Ho79u*dy4EcOuN6QRe8|oa-NjGk5#wb>zY?T-YP^( zn8o>9&Es=@rDdtUvF>tznR3b)p2YqG^{vpFWBs0DuVfv4&E?iLyONH%j)6I-F`R4u zWL`6aQ_{o1l0m)-?v|OZ?B45|QT3*tsa;o%sjKJ{qn}lhJao3>Ot5w;^LV*#=f=t} z>H06|Cy#u*!G5 zQMGqmcV7*fsAss>efcdjtc|>Ajmh_EDD|JCj*pX@+3z!m`n}f3Gq^dbtny6WuNI$i z^q%)(ze`OHmzptsb;`ShJ)gRl6Pv1b(0(wLFHT%3;q@J@p9l`XBNBN!#@yJeP9JG>=#7RlCkFcl(Q358CT87mVh( z>SdAdk+oHR%Ot;Z$jcuZ9FXsW{af2YUHL=9%F70O)we;a;ypV}4rG(MOF5>h?j(MW z6}RWE-ebkj;~KL6DJ!0D#ZNu9>V1{{$x(567NW!JMIm*%BAt%sVCyP$w$eJCqRv07 zPG_dmHR}A8>U4xUKc=zj0%O%R>U5tSvPHL=@mQeum*?J+mcJvZasK~Z_gT%YXQcC! zs#~v0r|XSXN2}9W>U3{9Kdi^G7)nCi$Kz+OUG?^gwe3c|e8%H#7V{&}`Bl~FK6N_j zn$ms7s>{^rM0Gmmn$mrKP5UvQVD|U12jcJbw4X=8Sp?Z~vH6yd^GGON@=;K_G_2*U zY~u5v^l{IHU7-t#%|kvM0NpSZ7QjK!1BXB_9110$Tv!N2{=gPr`CZNDZ?ms&7$O5m zx#YTXtZWIjj7VeH7Tj!lxLhy#K5phX4mWOr zav!%rx!w{e_j5Zu2HpwfzV3#SZ-`*_sSQK=+LEtyL%ampUOvoRXXq8!g7`n+Dew)L z2{*&xkTsjsbAAVoCH@{fAASg@z)zs`;Xj3P-O&WIk8Jjx<+{?(%^=7&hVn^&Iv;j} zZg?8>KzVkBFdr7d0yqvzziB*_{ACV^*;l2X#ov;D8`AALAP?~#HYL6iitP3<>;P9m zxgYwwkr8kWl(`$vz*0y)5&2DRfD7O&a0z@J-VHZF>0fS!55srhKOp^<$VZTVOypCz z4eo@W!T-X4L)>v2UqG3&@(pYXe}Js5Wc&n~w_(Ile`&A|JO?&_{N{`VI1x66lVA%t z1-6CP!js|cup?X!JHZFw-yn5h^n}vKKMhL#%^{fmW3%5Z^(XJGEw_X??r7rYLwPU4 zP~HpH`cm)36e#sL70Pe=LMYE?CiKHgVF1pBbK&Li2Dkt&h1Wu<$LpY!C!b*TgO!XW z<%w=DW>7yIV$6c_ySNCpg0o>;I0v2yFNM-BEr9v(D(Hn*L%EK$7girvt>GotiT<4p zqdXj942Saj&4zNFT-XJUhVq`C4Nr$-psG*uvHGm?4ygB0e&(+Y=8rLb?w!uBm$e4?Lgv_wXY4 z1H1z6hF8O%ptJ)h7$P@<+VCbQ>yF(C8$fxV8^TxNQSf7UG~5PxXCqwGV2wHT9?M*% zp4?+Am;zhF!SE!=5Telzj)v_a-xM`>iEoF&nsgCA>;mO|mUYG!L4FI7n_+jz(g{Wn zct4c&#@0f9_mO8Izm>?F@N~EZ%3LXagT@(f73GT_PfL!NbC(vu`1@F+Y&yStd?_r4 zbMCyXL3rew~Mc}=6C_{f%dO`ADh+516z4YKI<$Kp3OFp>z#1TSG0 zVKHG1;bTI*R~hpoWD&{;iwKVqHW8f7sewOY4M_X;+x>qR`pSHP3D)qRGyW$Y03G{3 z$NtY5|2xFS|D=(sk>Nk&*8SW5g=kw{xj89=`e)Nm-?zWN9ktD`2HhDYYgIsR4)XCx zrH6ExEvu`@=f`WGOT3qQ#>*Mib*YwWSayl1sr07Ows%WlofPGh#MCA4B2Cs^*Xf6J zdZ3!p-{|y1ZRpe{#NGSjl7GK(Wq$Iphn+m{vcpH;E;75M-?p)PowV0>Jv6oTVY}A9 z_JE7N;?Lq6ZTSa1Mob&gy>~*V^+W6QzX#!_rfdy$`k`3$KstSr&NePqy>hR5Qa=sO zn*K@OxnC}R>%1W+FKdBo{=CSB3TcjGI(J8_c#?rXkj(ICO|TJEPk z3XbUC;0e}xR_Wf|ty0Qc6?S~L#kMo%&i{<(H511M32_^L%$~ZS!E*WnUXtfSVm5sAKMOhsCdt*^wrO=JhA!?cbUIrtT@}= z=REvU@A!Rr-L{hR3h|ULw^225zjBYaIOH!ct-iZzUVlpNq16Ak8>t!*01l-8--^c7 z_U~=4{j<^P@5}c~{!AmZ?T_wxnAzXQ2F^u6gJG96sC)PGrMbk5tGf!yz@_E4*S-(>C zt%@HA@ks1^117+-rrbdko_Jpm7GcFcsZ>3A08__EwZIT?942>BLj247_ zjm_+@uiX7l)>oG5__J;D?fC8ee{Vry5i3zR{eP$b@AUsOo%KHt$@M?&Myf{o|F-|^ z<uEX|HPwfdK1^qVRZpt^@`)q17;Ol$^`#FYl)gw^H~>mLSJ1Cm(^xPluZhm+COLRuQT@V`2OtZ%>6yIbbn?8RU==1`F`(z?0;Xnzg1RWLF8=N zMD8wPtbcS{v#;O^sbadumIpkte}DZ1Th~{QMqD@V=wR#gbmPpi>hyHu`MPmb-8jF_ z_e-q(AKiHA4yC(Wde@*yZ#|Gc;Xh+Kl%(yvfr-TbR{f>6x18{b?}^^qXO`U7H{E>> z{V|=c?@Kj){_9sIUj#UR(Q}cp!b{{%>jad7EI-Q|z9#Kur z3)0z-G*|W!<+oh5@bz<+=dZhM&0({i{qK{85$im(L(NV^`qhI7R-0l-TO+!`I`9mF zY%Q&R^@&!$n*Me~Mz!0**03FvwuumtG5yW-wKv_19W`wDdIO^kA(^mqD0)HsAT0}+ z`oX1_RINRc95Kh#qwTiEX4}>ohGsCYgmYIwd#t_vEZ+Z%SnH1<_S!26_PBfdIp{n& zejeP+b@I5rv;FoO;L}k9`ah)Hl7e7`qyKaCe~$jo(f_e*o$~8{h{*s}BUK|(K&&!= z*#C+xZbnv0Zcc7CK6lLZz8BUr+wj$VqwDkMlkhg|SP$o0r`G$XX&s8!9lWs&2v+o0 zGC`7giu#{nV|zPH{;>Te$hGhX#7cvv?;knNOiOWF=D_M$vBQ&ft;%!J;J^;7H5fuB z@!luv6^6zJ@G3C^4dk$baXwF(xLygDxMhh$j+JZez%PsR83L*0B_;HOn{$3C=jYnz zR~6n+>lli>WA7vH{+_bp3BFOq0dH_3*>Frfb^WaLOzo8=pK|iai^?a%U25f(6%3V! zC`Y}-GLA9x+4CxLjfs`}EVo8x5pr;2t!_?quq;>j^IcR>(Wrno%NQ^=ETKpDCod!!oxN?#jlk|G3UN|qRMr8gb>mqXeIPxqHj#YIkYqHnk!|V%``~Bo2 z&qT_bA9cU`F12}mS?67@Ke0Ga;vN?a^C#Eoo!CpgQ?een8PB!ipIY(rtHozmi$7T{ z{(7}|6Vrypkh044+F5aVpCmrTipz76_#!JV^(pbyR$Sg6TeeN29&|RjH6#=%PXmR|He9*PNzfA z$#gm$!WK2>;JQ9N2Y}MW%^_vR~L#Gqa*#+rj|5#;bolZa}JL~2gELXaV zz5Ph*?7?)hzs{yUR(m9!P9WAf2O{$p@!d4PnT8?X(yfFJq~}4|kb~76ZtTb-M-uM^ z<=dAGk#p79QV*CyT;__WL2O~f_ko(5&X8V&W=ZCvN6v=)t>(&)govc#J3-BnXP@#p zAhzxgl3oBGgI@Ry91H&m`7B31gM9Rq&w&c~Bk{?wK4s>0i!lFM=KQNU+K9Yrj`pQ6 zi}bk=m6NiGKO0_7{2VwR`rraM9$p1Q@ERC~*Tb2RdE}8x;39ZAycvp5g4^M(@D6wf zTm~P3_d@BLtbj$7b0adkZ41+qL2KcV>;rx^eaKS&jAcFc0?l zVXU&kAAL^1P$lae`PGvnUOfDY9qXUFKk2BYx6`@O$qKr@zpgJIYae`rk_mqMS{%B* ze5^9MPUdjthbMlP@S5K5sK`LbG8n#4f4EKFkKbMJLmmHE`~97)vA(=I=I7x*;6#Fav!&lZG)wyZ^;H?=2nEf`KxI46VI#?nd@4>AlCfSwS_!yHt(Yv{%2Jt}4U+LMl&Q()@h+M7tSZ1&;45-ZD3(#H>hg{{(fm)zJ2L(# zbt7Y4WBu;JQfQBVN?M7#RHj>~a_oY?#yve)XmA>*sOk zbmKZZ%vUvjdUW=gy0L&*$AENlnr^Hl*0C_%Sj>e=zPk75n@_3rQ{=Iy0$27~;~9Zc z`(VpgvC2_8drRGzj!rJBDY+|F`ARotsvB$5jp6FX+H_-ix-q+hJr`TrYMKbEtu_p4 z!)1&~+OypR*%&`kbF4+aI*B;uyvk2{Dx`T;V@k+i#z5kIp^Pb=1xLZ*a5Us^L&lKK zg=1hoJO_GU9vlnVr~Dk92N_2)T(AP>!>P~>Bd`F@f}E@T3VR{rMzXF``@Y z+X@5FF>{hS4wyjbav*P2mrhL~7VK#R)qE*!ywqF+RqSY6k?u83la+2j(&X5% zuWW+b-&N@>JgV+kXC~X!VU%0(mS>vrx2^c>{$@Ot+LB7Mpk#@9zteR7@{a@iAC4!@%S!AR%7SSR=EY;|>d z3!VHOtDLHn*LCBz_bGkGl;dYSn33IP#D9`T`tRBOcyjFX6m@>3%XpI$;<}vr>auX% zVJ}TCxoTd1VAm$SpJ<)_MyC(Z*(_)NB>t&4G#(TG{FMB!Leqb`HN50{WI>&NOQ*-u z=@oSPs@lqL%E-lcH~KoM`@%K#2JalV;vTN6^W&`3tLetIb>s3no8?&N@9OkqI{l5# zmRzU*)7kdUQ+5J-`-9f$;dD00vFgcm`mh3x{~MkDQl}r%*`J7hBbi3t{H~hcThafB zUWav#)HZ;o>L~s~hZ8vg4uhw`EZ7gy{6~gBns{Y1EczXEF9y0AwQkvE5FLxM-9^2j zY;*61H;}#p-UPpZqDR>YZ-G*-TcLclX$~Vz;C=8U$T^Wy;DeAgnw0*i8$6FVYcMH2 zk=#>0@igd$Lm{7LWjpMJtR<-Ya(f|VRqK_Bo@g3zKfDl%zGwyv!Rz4p@Fp0BOJOOL ze#s+H%G--ze&eW9{+4>AiLbOvc!uNTd-yC&gs(vPHnOIbTGvhH88>9EiOe;wZku4+ z8YfRje@0kNu;&@?Yku*MK2xy)KmKkGzCc1bbbm3a+(f4!S*p%xji8$E(mO zef%fWE6H=HN%_CT9dhLV!I>xv{-SmOj{J}R^J*%nE{^=47b-9C7klz5eTV}YK;S@R;rLC*v|BRHO?vSYgu%v%ej%-3(Z*RXW|JP1jeUjvd zj@9Q5l!y9bCr~?aK^v83x+k~xNPhd$7ue(QB7bHCJ#N3Rx=czL)6GG9kp~kvE*6_mVDm#?UB8hz>dsdfI+gRzgOls>8)-S2jA=q-NT+35XK6b1x z+?CUm9zo_kOTPUBrNt>(=Dpdv1v%7JT0EIsR>#VG;HW%Qxg_m;@+}TbG;_9&wev9b z6Q;gliF&rIcbjd-AGYGQexm=0>bX?vBkrvhf5D2|=O1Q1$IAT1R*PR^#V_e^Uhi1* zT`<;J*PmN0zBwu$t?!s$pPOP!AxQs@?9{t@wDNal>N}#}Rdy>qmAnhOO{edW_s!OK zM89v6m%M}CiF>|p@>|%~`zHDh^}a;utVGwbulFsf>e$Nn&3><{zi;iWW9|3NezzPQ zNUv9o%X3b3t=F$f_O8-_EUM>gGUxg9t;_GYwViirfydE-*lTV%I*`->&)$yRL2c1x z?Y)MaqXRM5RQokLkYf(B`xa{bdL_Fj)0QF-2n3ni~t+}89Gq& zr$bO|TP8x(wMqvfHhNQuV{c+igQ5$$5MBT;f>*;gAbJqBb~caL*g;%uRlb9p;P>!t z_+QwX4$E#Rx{x2C=tAnmu{J%FHL-oL5iEhSHuePA42n)830?`?K$!>K0e%3}xG)`P>~32-E2eRpFtWIcCd3}pRwLv%d@;N@@#yaKXrxtgy% z3N9dC1h0ZYDD$*gw_VNCz6>rR&N}Q$Cv-JjO8kC!2YdvIF6cXm{wVT)a2;$#-|$g* zB76*<1fPOK;B#;|d>-b&7hwt90K@QQI0cF>=3*$in9JctD1FZJxUa9NchT*b-*fXj zUtPB|p5x@(&${7Cw^IT86KDPK1J>;BX@G5_S*#DR+5HZvF74|<$*O#qqT=vrS#iD-^os6x2$w;ZP^%32RsZYsBNp+XG z<&NaoW1yvbQORboZ zeIUB3KdW7i&OSzGuhTGBbP!Kpx2rJHKc&yaoM*3H_rt9-Yfe|Cv(M1YJNu*C>*(w} z4z?YS&i?F=Zr^jL+40n*z0PLZTk|`}I+lDFMHeC86m%MDI|JRtQT&w(+ro6%84iTK z;9!^nhd`QkWzXY*BZ(Kne2AV)+0CHGQa=4Ig^cs4`BX(vbWz1{3mgaEgQ5%j0*2vN za4JN9rRG)rAH10Ok(6~VL@%XuMaM$SBb5&8O87O$Ng2&=iJDusmmSTG94FtMMNsT$ z(3eHz8*~R0UD|=z(JYGWscV^Y2fqKOoBls^_B6jn-;#x{rNYs-@Kk=^P2~R?@c-fR z1tuuD-|_$P7q$DbmWbcq44>aNW5=1LX`#hr_N=Iv%I~SJ`veb9vGN6NwJ0mjlAhQg{h3FO}o@d3UQ$C5$sJ4H# z74JLD-2Z;H`1e+PhLvA~-KNdTSS!ENt@t2oe|A({Wb9qsfcWpw$pgB12C>@L>-wWQ z`ARqMB-VKhIy-cooxX0KO02d3x_J+}c?P<%be){3n;&qxl9RuC{D$uL%{1nG)$@yn zN1XJZQx3kL4xOH&rsgH+=J)94i|FK7-FzdRje~A}Nv!jebpAVZemVx!7JWy@U2imB z_3n2w-|D-z-wm4r%Nc)X06rmZ&DOWyz5k<@Pc%H&^RI7L){pd{lYPGGZ&0SCYMA8}aR~xTiL>f9G(xKg<<#-MD~ol z2EFi~a0=W47ebLMFM!*j*i49gc@dQRoDD_36uELYL`GHfMdm?~GsPA`CC>aGGyu;0AIJX(lDOr9#u@*wu5kFHYZh#+f;4wE zqE*M-rN6& zjQ_8kx$p7+UpLn$rNo}=Bj?M!i^j~}F$>s5&4&^Fg*En{5-bmtbs;X}&P|{-Popf1 zr>L%0`Z3jxx6@nL>HDx3m|D$VK-S%pIXKn~9J!>jL)dK1?O_g%Oyf}H*kq+u+7@uM zly5uf8?t3CQc9MXTSy+FAL*l>2Yqo%pOIz7ZJUFZGgSQ=n>bgFUt+~)_c!CmnDt*d zr>9G``21?|rFPu9-g&dk{O1slwoy2yzLbzL9)hT!kZIKWGfy3F+9>S#{?x3Eg4CHj z>(&JC#H#mVU(ecp2dY17J6)djzTS-_(xcxc``u_`r$@aTa@}9+i$td@(&-p*iB?A>6O%hBCkBM%ak= zU=eHrZ-UL?64(tcg{MKW{pbttgemYYm=5oTgW-eF4IhGqkY}#u0X+iCiSz6u(#IT5 zx#d0VMKJpc+$(>}dl(Pxz9n_8Y*1u=P$KEYQ2H3-AZ0%w8F6MND$e#-tpWM%jy!PxzoD?NpuE`c%`^X( zg&_QSC1uL_Z>g^+6b||eyDLK=^6hCfO{D3-C!@L51MQyM(+BWSHy(kL`j?jaN(#jP zuWUW7@$n5RW*AMPDC=chUuuny=cEmC`S2SYEbK0ah@4}eE4F{KrI}Eab91B5mEuO7 zyNhFwAzZKevn$$7JipnJWerD6+xFhJ9y?CLo{)V_-ejI2!P%S|_%qai{Qff!{P&O7 z+kOA^@wqbI{@s5T-!#!ka(sX1;1k?*3EnX^b68GV_Q=60Y2qM!=ztWQO$%}CoaIU# zoSl}ED+xG!9*~hLf2C*QKrB^`W;9_?T7Mi=r@FGmpo!BsHr@InY?$y&(X+*ZaGC4MY`!?0H{DxJU^6_|CMr+uxjGR2bJ5cBj74K=rSKZXF^2F*p z92-FK)@^oHN`0!Ssu86@|SDuWf!kjxu2gFF{wE`>%S4tmt7WXL-1| zY?8}UkNV zI%hh)m`?Ae(_`xNWjei>PQNppA&G=I@Avt47A$$FaQzQMdrjSWaa-(A5b6`+mVeM= z#IzCJdna^SKeSH&dxj$e*OKFxk2yT;v>mBAn}frqnEqgNYX#}_O*)^!IvY8iZJSP? z`>yI&ewA18{a1%IyK&{4U#-Xs|9dg=GzyZ0xV?SrE?4QF#4Y`9=g$rAy{5}*?=4q; zx&xmlXUOqWBF*o=q20AVKGyK=%bSh4@O8caB%MAwRy~)_woT`wH&&ZBoqkYf+ZL;S zS*I7)>Em>IVV$koudzu><~L~m=J8R(-$lqR(ljW6#$*H-r=f?D@f!3m5s^d0MopxU z)8QE~euBAfl5MLc>neF8=;KaCS2Dv~KgqVonmU^kE;fDLW;n78mGRfzYNr4154ydc zv4xfZ;Pn5UIY7=Dz|I=Lhu9jxX8+%As%l68h_(MOeeQgx&pqkqe(tyGF(`Gg``nF3 zNMHHc_dgnQd5HkU}_(1x~c0c*A+e38j{Lfqi(*KXa|KBf-|M@CP%R~0y->)6}6aCeT z7niA?=+Mw>Pf&O5D+dm>Ou{hvO?yklJZJnFg zmB`l2grc0^C;I#px8I*$>}RpT^zwiwS?nETT(K$Ty3jl>+gDZ|4rB%CPgIRn;@4Dd z^R2vvlJ_9{Uc?8!t6UXJWP8a|?sc-gzuZ+83{e(q>~pJ?pV&CcCTxBt`aiP_s0WK! zIxSE*t|U~MtN4Es-9T$XsU-X--;{cJ$;W(G(Dm_!FQhd>CpK55U();XdBY!AbMZGj2d!upzk&Lc zy7s=+zz7kpCafZ?Cu|~YB^YnBwh*B+A&XE(SVZ`%Y&HG+?^ISot^fM5|E|{izs`C9 z^`j`ir|sR8U9&4QW1uTDSXMlCQWy1ph|PMv?&dzVGqt!hb6ufJVpJP=kkEZl3f4TSBZJIOj%DCcgm z%UY<~N~`_oT3L^cqU+IY?a0|2TX@L2uH81<&&#$$JV6d*6Uw!|+Ut3lWwg&*ZnX=D zL~0Ytc?nh-MZAY9{lN+S+ibrj?dEryxj*>sz43g^bZu9KIzIoD zto5Jge*4qkzkA@u8-5!0s9_{=?RD?aei7G>Wv9wH_HRaf*2{J+znv!VO~PxOlklUAtr;#~g~t~vtNPB#+!#5|-V*FT>GrzgdOPN?{x4>UqT14L=>@M-y=QiYzTT$4j@V@#g z%B(YGEYF+^QH#v&=E@hgj^Z4doA5dFOOp6I+sAUX#cG*URUTP?rZwql_;m@EGBGB@ zH^IlR#GcQvjPgjH>{G3nTuauRSwcA~??LrpeBn~^kvS->e^T{h+`+l>Ta))Zi?Y3G zzPA$#K1w*E@yrLVyXNt(*Sw4&=`NK%YD)a7DTA)L@QB=ok2bsHy>pn`g8^cN99xG(8%^Df`ewc*t-Z9kGV`!wTRmth#35V!l9 zZ(1}+@Vu7$X^(;<`Zst2KPf8zf30ly&sm$_ydrzYnzy@d`3QsOjHBiF@I~9|ANA9w zJb$H*VVF98n0x0b@6}u}q~et#{RH&kT$7 zP5tSkb${{_4tJgteOUv}LQy_e6tZq}5qKe?cVyCwMtRr)JUTYYfp-G2Vgb;q#csqT^GbR>1-Za=HzYpuNT($`0y+NR^?{#T4y_pfn$lSWH9 zJ2!qUG4;pN|6cfJYT7A@A1%huflA+Xudsg#!o7J>w&B(YZ>$xGJZ7as_o=-pc zY$@m7DZ<%)1_Ioxy^4)zyo|=2zi|bb7hfuxe#YMq? zd^%)D#*Rt78+*=r4b?DV{Oq->-d?e`-Kdw(c)ZPGeteIs^y^1Ikl(KUaqk?v z=3?K9yaD`<9#r{%)VpNcl2?xW=jX+f9+-N5{Rdg2L8Y&JYQo*0t|-{pXiDd;j#@D=7`oxDt0PZ_Un=^Dwtz(| z65^J0@9^Xu9^<1E7d`et({nfcY#5zX`qYlQ8$7;Ya^rhej=Xi{|By8M@tvGs}-EjL%@_Mg-Q<0~sf546Cf~IfzW*BgKTjy6 zOn^%YN&^MOo}k$S=vupJVq8+}-+#|UuW?}3ZLCixM^?9Y+G_zuf2Xw3X@;l7Yjng- zT0pFRgBY;k-E2glWD2%~W>mrj_3J)4Z*b?eGrPoIf&Yr?KFGm&Zi8EO49UHvn$ z!s8DyeXE@9pP7rjUuVmp9iX!YsIvxW)MB5NhM|8h?}DZefXXJXW(E}Z zH=bzAI7M~LuhR}tm+%>36aDtq(?kyu=dz3C_q&h^OuNA-xkk-pkaT-H(vo9N?m&MB zIY;6R*{R}P&A6N|c7&q4u;**1b9@LLM6osZ-IhQ0wXUHp^Y66E-i&-?YfAVhWk2!) zQ-@Mj_FuAhRHv$P$~P>!+@b@GF1Or=U2a>hiExr`>`rIjsI%+S*?sAJ@#*Xvb@GL7 z>~Un8^wTnOe(biYeopJN&p7F*{P~T!SKU0)i&cLtys^jjN77zvwc@{DJ$`0xt9N6U z7j*qeov+0JlW`K_o?m$7>u)Tn)9l|bO}pa1jl|dAB}$%h1)iEcx6Yj0hu?d2jyZo= zXLqU_W7OHN>g@MowNus26W00e)7gva>{oSms=Bdpon56)j@HR>I=fljyn3B|rp}&L zC-2YG*t_cNX?6CNI(h0iWe>c!Jf*W!)!Bc(pyZ|%CnR+27w)y|_IcmDyKeEM6zp$R zx_9`8JFc8_!?ID^zxew8jPc#X=Y+iHT~2*~D2S?aulc-7k)cF}6Z_NT2=Y{UoRZy=r=#Z~>}x)+$Zay0*S1d;8BONz zij0<@iCjq7f_x@2+Gg@ELN=TA7m?4XVrO$|;Goq&JUQ2}{BOGeG#vT=FKP$u$p4P~ z|Cf^gYs?Mce&-W1EMOGTXdi6ZRVTCQWLI6EI98b_RvB0)bLwQv$CV5`e0!bvTP~XX z62e}fou9hhA? z2(&-%AbF)_-l9!gmkxL6s8Tb2P62we_jRJlthub(000Tl;ya7Bf6 zc-I3sJf*97u<4~GWl&nmSy4V(!~x8{*80*q0C7Bv*vq3;EqyjYEs9q8nptC$W@?`4 zF{N^+?S>@~43riXhr|twy|NgCRjSFWnc=?!>i*SHY+St{>?*Hrh^SXY!PJa2L zj9uyE8nJ)hpIl&%{Va;qjC^2^|NL)z$basu)p-BkQxvxC{~i6m)BjKEnCA5Vd-cro zIBNj?IoAN9|1V8m4R!zb+yA$1=tf&MbWDd)_J5DT&DhX2xTMnlk76B|?VmkwSlP^} zRd%ZE|HN+2LlC<@vHy$3-mjB2?{cG6Rc-y|K=Gj`?U_wgZ&)(?%`t|d zlbv*9Ej1-O>0}$7J)lnKqSJ|dO}jLoV7AHJCx0i!nSLH;@waR}u%oLBZTmj4>q{km z2F!qB-*-0b52YPWf#V?a&edAN>2MnHLGU6d_J3mc$GMRkpxF5>gJS0=--s+Il@;ycLM z303>-l}}yve7*h6H|%8jJ(^|7@PD&DLo)ZIEuGR1=PKW8DOqK~jFiEt=r0;2ScmKr zvKE09JkgM)bwln#yrhWCZeM4Ib)69$b2uTFu$6l_+q_PxuPlefQ})&sRKKWPr$?e( zCsbBa;3*~>b)Bx({p^rVH`}H3$6LZuDA&19T_;XmXGAC?IFWsFPc3T8(dH)l25aLi z`u9ek#D#oFn{oyFy3L}l+tf%*oMo*O+|=;!P|bCMC4C{C?zc1L+|q)PK2KRNEPsrJgQEcI;9AKhWy#8S#H^CPlV@x{VY%Nc&Et&o5qKoNDk?7b zZ$JO}$fL4NCdjK$L6G-(i#k58koQde%u@Jm$-PIvU(#oa-t2d}S=2kNn+Gdps+F&P zGsdM{PvUK(;?d8jqJeppw|Ezh<i9T(0LtSDxx}A=2md!x&ZMY<$#bb*}BVSLO#x{fpkM*b`FoaAiGh6%QAx z`+DBGuU8OGi*1kW{pSHGw)#6%6DsFRa#HUMc&K#RcVOf)zi9Fo*Q)>V!Qm-^mQn8A$4o7 zAujc`g|ybg<$d+4`jYySW2AAC`ng@*uTlB#zE~}uXO^>ae@(H@h_G)N4!c?rCH|<{ZAN`st8A^BB<=@R;O8>HNhwLZ*J}&*n^V-#%J&I2ErPH1MUOG~pU3jc^ z|FP;?b-Hxj-0N8F(RZo$>ZV)!Uh&DwsZ0O$qr2$QUXxMA#X6TdR(lkkE>Wk0)!FyN zYR{yblif?r-EVN#^iTTE{c`bJ=M6b|S*wI+>5Imw%hl;@Z&CSI{B*&#dLEPmGTq08_#hx(MAX!1L@PMx#AO`dwy8{?njz#4dp7n~ew@2&cnbI0MRc=@44| zVza+2_bug@Z-Q(KI8Ne=;HmHy$UJppF-(I?A>9^Z2}G}K+zy!{ZrlTJge%}v@L~87 zd;)#~pM+n+)ljbW6#NmcfxLdkGq5gv7UC++_&aO{pMxhr$)^om4^M@g;b{08WSweb z6D)vlK-Q@?-h|YlIxYY=5Er@NZ7B7ym|*sgO&?}b4|G3eO>VXANy}$7d$1`8w_ztGSA7Cz|vlO9wXVivah+o&pOn3ym z6ed8a$3{@fDetM-k2U+Z)!)FB=)LDe?f?Df58JD)>&8Y&qm1S z-eA4;$dPapOtRwKt0DWjM|FHMe1~{Gd>59$t*{J!04Kqp;e}AHCu_;qs%1p3gYocY zSQp*}8^GnTA-oSB2_Jwgk{o#)9u0Zt4c2jwtc5M%^YAnBmA-##;!?kJ_}lCon|)@f zUuh?%LfQIqyu63~p!AVb;QzCC9`IEZYaiawL9QmKs8`gWC|E#BK)@DALJchmiW&`R zkZ6(o`w=h?~x2sAE)lJ9sM8 zbAB4s^R04w=)x2@1=0sQXF~c^=PXEH>o7v1n+wl{C&Ke!37iE_h8II!&r6^SFNHJU zTzDS57G3~vg%`sGQ0*MR?90~3(%$_pGluS2O@p~^;z-yW9tG8J91VAe*-+2l@o+ty zJgtRu^Gb4+Grz^WfqB;tTR2I~SZJy*wk+F|^7wDUFQbW%@{x{*_0%dQ>Y8{`44V&QOQ z*!W$fQ-qoGOLHrwm&!k|lV5j|UuW}w$d(+$Fu&y=gLGw0t(e!~3%kJ_gX0}SNnvgQ z_3~|K8QY|G>RlGJGq71FQdwW$MB4I3+VX#{h?7mZ;HS1JRc*(1e6P)Chs~J1_6GDL zl$pBnVcKlmHk-9AFKD#3zmv1oo-b~DH8k^^_ug3X#%E3Det+9_$odUczxlZ8(T*<= zZ5(iY*|KeUDYvy8CpO!+?b|_{?K@hVyUjLjvo+gn#5P|=ec6a@wqToW*Jca0+191Q zCo_9}r`M;-9@Ln+BxX&oV_r~q^#+vg{x7&Qd>`U!c0PdGPG@Gn|Ee>tb^*(=h_eu? zzq<{V!$=)o`nz=JAdhB&``dbZps)X4{!HoObJ4f&kI=c*XAW}WbVys6b3Z$;s<@

0A}IAkzXCEykjUV7GigL#sgmNn{L*lz@`5~VhMnaM9oBDHMoL;lUWwG4%&hb} z>iZ2WD9Fn#D=RGMRFv3pSQiFHC}zZj@*YXr)~KF6a;inV-)qy>W$TD#=qM=kPIc`e zFRZCQyi69#SW!|HtXz`>qq5*6FPVkXiELJ#J(lz)mR|~r%S);%YyYfXp`t9eBzqeh z``hcF>PJLJ7HyiaFP(k^hmpr}j!MhO)Hq~A`V3O3t718tCA6hu9X|5t%&ZKJOSXgQ zUwbxFFN;49=Zh*v!PUs@Ba*#u_QI9wMytbljLh59tl|A9o4!9a5Vt3G<;MP6*D0J} z;spJ86!u+SRi>bz91{p=mL=|vdg9^66j7GUuI=qkLl`GfRi-YG?L+>Gk+OYdkyoj@ zU0Gf_KzS))eEzz?)a7Ls=2uk|n(ZlWNXv~WE-7R%GE=8G7*pr3E7@JKV<)p*J}r^% z5R7l8_3|qU2}P3*uwBA3mg~kjHoGVePwW%sgT=h6aABp_e#O)@<}l5+H165n zej9Sl^4>n)qF(w!sIt5yH#~-+AHDkZ5zALH`b%(pzfiAtb=YsW+8Gh&!vJknTGZ@w zW5hOc^YaTUX`hy-+H6C|rL#%3i3JMIQ(maloFg5-&JpF3!ZIz>E8*I{=2|;zxMxf} zRju-`et8P_oPOUu#asU6K3+N5F9*M8_~o_!_7sf(D`vCReM-i*r`@7>o$g(c;M75pY$t{n^}-E;13CYI3L*NP>KjN=+Nz_d%T zgx$1`Vzvg>)FlOVsnvB|J8xcB6Ni{oy-g4e^Q~O!avFI8^J`2I~5&10az6ccJh#Wo%O84XzCGS+XS1Clrzg&yKk@z2rrqys`g!s->+oS&;(KhmwoR9@ z>0GurA=_9F(dyJTozeC!rA-I7*$}4U0FRGb{&U9U3tK$B-^VL|d~(>s(x3p%Ycb*-_>v2x5pk(nzsImiNt&u+d|4I?am)^-HNwwzVGLo7eBCY3BJ)owS3nl z=gywC-Od-^ab#N2@cY*DG~SBCH$LvWaQ9E1Z+K7h^NaFtSTyS{6fav`jx9dP7Vl+? zSF`ED2lZ4to4s}Qz6;wn=`-T{8JB!s_B@@JEq=(Ro7-$hHd}|yc4UjcwCTLIF;G^R z>$0}%f7*2XPp7n7hupEtcJCeVDL#C2{*PRL^R>tS((~Q1Crot`*2ceL|0djKOR?FG zZ1H(ETa7K=(H2i;8@nf38^XEfx{r9j`;aTny#AU|dt~Mv^20ma|E~~$5FdBW?ioi9 zxOdWz8$Uj#QRw|O-#U&he$+N*&{wA4d-1%?2fq7!#;r>~8TMwup$!STvDsK`HkpOy zx%(t;{txSaZF$=zU6vGFbHS(dZ{N^g_f-FCWJ^!xT#2AaSLqx?y{2b*?IMCYFGIb; zS3$Z{0J&OWEDIZegYLI!fj&WyVk%g%4=Z=egRK`U&1NyE2uc7^>8};8qS2@ z!yDiZ#0xEi@$e3q0H22~;Y;uza5>}d*;3hiAizah9|-IATcTK z$FKr^3fZT-7EXY~m^p*tzhOH32@<>FA{022U{g2+?g-C-#GE-(Au(spG}r;22|L1> zurr(kkA+u4Vt7p4UKLzO`69Ro61!#M^oY@N7E^v4-Upw7&p~3TOxzr?SGATdwQO1KaF5O#nc!Gqvx*aLnAiJ>uZb|=H{DbI#K z!Tne{?@5AlkdT8S1;4YM%MqXTA1GpFEmT+IVJLFusd&B+VzVHCp z9v%n}fL-A6P;pkdFcs#*Uhrht8&<(X;dqz?CqczuO@+hYOgJ3g2^IhJ3gn!*8=&IL z^!-s|;)C{wO<*eg2h4-<@Fds`W9XV8#ZB_ zRrpVMC)@|#1>3{B;X#ml!yO27;c+kzR>DF!0WOAT!~5X*@Bw%wd=SoqOW;j#DZCFp z0hhq1;A8M<_%wVGz5-u?ufg}=D)=G%9DW49fgi&S@H6-yxEeN~L;DuCfg9mIez^nO zK)Eyg4)%uM!^7agoR>_$ES2&VxhYweWa&Jsb^hg{MOLK=&MYKb#F8gcrd_;N|}BY|Ge+S=XVjbk(-I z;1lp3sP=Yd_T+uZ_~tn>x9Sr+z3Ww(M%+$PR4bEMjhS5b<7T z5*NweK`hxE4BQ&i>EenOPO?kP7xT?io11vDQB%04`?qk0KiSZX@f3{FTYd)j(n@By zTJu!y!D%&dWUJVRV#pRTD~{}bwzn&7(YQ|?cwx+BUPhhl*2$|FE1213j!pG<2IyX# zp<8YLFRuzSPHvF*FXjXIo5ub4rs9|nAT1L&O)N`yN>(UTQfc!&)c6WAQ$nSsp|ZL> z5nG+5TW&LNq+Y+1svjpn^gaOZTi0OR-pA>8B{ST@yk-R7EM&;W8JFWVa#J5bJj(== z`fGpEtK5;TH29`hcE@Jaoy;sdx^fA~emQ-PY=Tvlg*oGmty%W)<{6H|C!oeAEqk|? zE2}Ea8DCKx4r6eZ{kTu2XAk~5)3YCE`Q^ZV9QMoK_`jdxmya0cEq__W`hm^QEbq)`rv1JEf_MQvJtiuo6XW@gS5qM*=)4+W%IMyZf&-@7ce@+ z#}yZaUjB5@y7YAud+nG%`28XFZ-I~NspXGNyFHxQVd~U}Qoe8xdUN|5?B6`vY>l?O zi#8jfEndcE!?xL~qqQ~KY@#+>wao@;vtef$TlKxp7l$qR>709iy5p6NZzX+xliijq zU5PHy?{oQ%kiVtdsh^d7N)vW1qthJ&cc*+DYzMR9{%|zx26JIAI2O|FImIv^o(TEd z!5(Jv@}VNR*HfMfxzrA-kE^~P)yI6ZRtA?+rtfxLxDGu>x=?NXE14f_=T(>f)p;d) zBn)(~+B(`SL5mIeCPMW~Qb0Q-q)@vMVbXHmP6e4@58eai+2OzaWG!7XKG6DILS@ z0Hb* z!6aXUKQ$Dk`|rf>Uf#Kcghc+99^cv_Xosm4dF0wrHyJ}iYbUR2j9=G*I>o(_i>}OD zo_uq@4WPACGA2J%Rb78^b$wtN(0U083#r#Jv~~(Yl_a@RM3VNmfckP%??uUJ*?HC5 z$S0c4+q&wf)of$@5HF0-Y`Z1xYlVHHH5Q6cRoFB<*r#k8t%<-Z*QU(h-gf-sVSKhw zNg+wwwEUgb`>koa+Bj2fhQ(KzF;cqhQR)xp(%rVEL_2<`GU(4Rl)%_t@wo4DQua+ zBWnFVHsW{Le}eHKrZv}@B1Z|c?&%kp^&G4=%M+_6X@a`i`Rt^h^~9mxz)5bvpXUBw z&iQN2---!*;sVpYP2vO}tf@=VI$AEGu4f%}U4y#2YStw(N$1dyi{o!SVJfTrdcJf) zRaP5yBk0LeIf(J|?$w&uzS?no8(2ra-)LH+knm160Hp{ zT3dxJF2`n*uzmYvv)R~ec;_^dO(>`Ak+WtrnVxm;`}a+6wB%fTt~MK<&30(B?b&RK z(b{4c7~9^NPi>sCcpJPH-VX1DcR*sAoO|I4_#*rjz6KLH=GWnVP~Ql4g73qg@DoVP zj6>U9awR#dq2jC7Kyo9Qc)3cbxDRq1Igi5A;8J)td<Mesk6 z7#rsoNQ{m1D_j9_Q9@HN;6z61M0 z#bsT7#lxk+ z`{7Xd5LB%Dqc8_P2FJoDVFi2!hT$@JDts264xfj!;R{fDfa2(`fiJ@wq2lNkz}KO4 zi8r90N7=SLS;~{K^gK!~naQk)*d!CT)E6F1IR%~oQz6fo(+{2r2f*oYAiMw$f;Ygy z@FtiJ?}oTK+y~%LxCCavXW>!s1$Z=k1tQ|PPeR2TO~%GtJKjk4?jYu90u2eie@%An zHgClp$?p9cb71>c+)?__7MsN#)wY4(+_m{8@kg?SKTHghVvk0%zT%H++r}@Z-FN;E z*~huP>mmLpJi%ytegII+1{kve#%zGG_@8a;8{nXmsuwFDvX|sD>vv=}z0Ibdy~M`? z@o@v@A9UIEO&+?k>C@|vJa*aT=ko4Hc&jV6AXfV` zH9`Xh+}Qh{#2rJsb=Ci=!;a28yz_*l&Yj7T(J^)Cu*|fKqXwp=DPzVEhOqHS)_~zT zsRJ|8QV19|X*ps!Kq9<_b>*6g`2b@+Krbpd+skdTr9Qx*ld6~Z{~z@MZbVPl^f2=w z%-DRKQ~O|BI>n3s^&4631+1O-t|iO+6I%V|J_+Ry&@y3WKTQQbj~c&4sHDJDN9GPF zXre87xvtc_Zp_n0@Ezi06aSktwlJJC#@|@&_UQfLPo_QEm+F*jqz|3% zKW6hM*!%-FeZ=O^iB?as`EzXkE}LJ==7*7ebRM(U-+KM9zCFf;TRo0P5q3(djDMmP zET^0Y70WvY63Xt5gM7Pb#=XGw=u+okc63qMOpNbLSV4ICbr><^I&_3P1cMbb3N=#`9`R|T=i;S zV0V?i7ioK4btZZ&bEN$>()L>5VyovMe=EK?7#koM6F|09#S-uOX$z+(b8L#8f!GTPM~w~)0n)qMc#E6=Yuf=@6W93B1QY*QSWywGVC8UC zg}&ph(ft*(sJw$(w;>&WaT#A5n@Cj8ju20M5WA@5g71PgqD!S|P0ey`rQfr#wy*Dr zwLNW0>nZo;$!u$Ud12v6`9+Aqio4t{p?3aE)dhJkL;em_$Lc1AI9OeEK|V}B)VMm< zQt`RvY(L1SsP>!Vsw|#V$lr>4T{g~(Tm6Z1tFk+O)AG4~If!F@(mRh%;V^Ic6@EGR zec{AS*I(?HgWoeIdB3Y18TWdzoGna0GwT|B!K~{&%Pj9*Z>s8ydwuIxd)(`}rz7OuU02Ml2^)!K^!>X5AjDt9=it9Na@&6ZfiX7Ua6DD;{<@*Vbm| ziPoNDv%}c*bemlzTKkO64r8->M618s>?Ah(k}V&g&CX-9pZrzgRXgX%f12^>E|2cF z&&pLdjB2y^#+T+ij&5)Ks#_ngYO@FCHP(JNAD7x@&$QWvZ1xbF9VS|Pi!F}TX8*C- zRid>k)|dUzX7{t%<-Vam+m-jM_l_kNkH3?#T+gFk-<@dUh2_f5;_^@L<*85|;WT&> zJQH3GWxv73;>>`7-R4os7gARI+r{v8_%M7AJ_0|6Pr)zYLP*S|i7(w3-buM5yc>3h z_dsGKokfsbe0S|yzLB)|?13Sa(pyEjt-^#gh$sOk$ z0?8F;##?>^rc-_g4u$W+VekVu9FiN(jJLcNj-*VEI5Vy?x!{~^%H-5@2yJ&;LSlzq za_X7mBB!3oL%1jWC-wV7#m6ciVH?;9Dn7OwRQ##pWlw@bU>O_=m5(tCo&p&I)Z}G6 z7M?+wF+WWn#uCW2bju+z$gc7lo(U(xbKzNVCOj8j055?TLB-iBZgnoa5?&3jg7e@! zcq>%A>H>HRyaysmn7oJ!;KP(}gO9=6;j@r?$9)bihA+Se;7jl!xDq}Ke};-rZNxiT z@u@9f9F+5iuGQTc9zuS-Js>gACT>^x4|`Hx!SAW?H8=#m35P-MO*b3919RZNU@m+Y z7QheSShx}@f8vMmT(}0#hHK#!@N;+#xj(`kU<3M!1gLo69bt30Gu$4whP%LBVItfOwufz?@;CCVx!vI2 zusduA`@wzT5ZC~YhB`jwcl;QZ!d0*wegYLY{3)CSJG1S=i>7DCOypcV-jQZ~|vut~^lWChO2ZPbb-gT6>ZKpCrB23Nrn?WwZDJ;Jo zv&+06Z8_a<%b1G7!k{s=<9>dxE!yv!wf5V?@$w)jr?V#62sO!mr~NvI*2Ej>9ORZ2 zlpq5bdl;ymbj+gRtZg4#TjS^GNK>?X4)*M-X5H`a5*1oC3tPg3C5iX4!-s^_E!_?JkPqu z2YK7tY~L%Jduv}4=biW2aLJ*>mYL<_a&k*J@xjf-qS|){Zx!>u&ik$?CXwIzYwV}s zystPsIPcx6&-=4Ab=Bv+rY@{M~mtp4Dwp=8@aqf_`Uguiw5IzpUfccOA0q)~^@u zvUD5@UVYhKZMIaK&D3VowApZNK7&8o_PVXvSZ%iHKVo~GO<&~8Iz|SPy>JKWrZH=h z?NWRTc7n299tOE>-2U(*I0$|W)8Pk@*PgQy(v2G1=CSZI%GedmxAt_K)nn9rPW^bw z>!4&W?6Ah>p?3Llk28h8YqzT@wic?*m^13+TT<=={{aWXoguGQ&n60GE6s$mm0}+; zW8KI`A{(OGvpYm&Gq%G@xF_XFa4+b>w(uJ`irJTojJ%|F>9ww7*F-8=SCq|iFL(rO z3wuM^W)6iVetjuCoN~Ee*7oNyd$N%Cx3-@^-NnqB?q&IwP`1E*Aa-Q;0QfM}OZE|{ zm*}HV*J&x#d3g-#xSxVL27Tj>9mv=Y$HJE=t6j?><`m~uI1|bycp;RH@iO=vR6F&O z_vIEN�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∓t2AbHXva+x=Ph)>-3Vc(mOvy2E2^j-&U& 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℘CTr`S=7odTrD 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%0Aq))^Je1Cja13#5iQ)a6OWP$5rrUY~bGea2jr^ zW71Gl#R_J9b)!GnoQJ<@^x<{*&{_13tLqM;gLx7X$$~k)oE=m%KR%x1z;t3uOJHa) zW%QwIt%j(T%WNTyFD1}4wp1~3spttiPIkk;&yvfSvewX?@A762ys_o1A)37T_tvxN z^M+WO>l_)o{xkZ!)Jnrn2`mjcRZMx>2nVNY_qEe-6-i^t)Pv|?Ud@3ywp=}^hW}?e z*>rAOwy8dw?cOA~9?d3~<-M~4TglU{wRC8j=S$vsB&(hmih;Uj@8q0+j#(_ng*F~s zPjILr`&iu2;�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

    EXOwsI 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

    (R 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%0AG*WXzCqxuKMa z5a7DI1;+h0;V>f(w*AV@cI}7XzbXF?2JeCLYq=XAJ8g%6ck?*cClvqT;Cz17$~*2x zv&VsV3UXJP8<9CZoY}?yt^NONUVwdlik7)QtbHBjtr_~GIh9c^iQne0%1asX_z94)@^3+2zps+Tn;?(nkXYW@ zr{8yL2cJNr5M&?y$KfLF{}lXCLIiR4Pip_a0zb&%GOp78J-EitR$jC9dUQTVCGxg> zX?W{5rpWD0samZ~Mnd;GzCe@t+Cq*MG`8k6~R6ycy-+j^F5?V*Lfb&f~Uz zy$^n^$8G&;e4sLV8-ro)&)EFgCK=z%0Dscs+@IM9ISP^JO7O)V=l;xwTEA$ijL)Ai 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 z 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 z%0A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 +********************** diff --git a/PowerEditor/gcc/delete.bat b/PowerEditor/gcc/delete.bat new file mode 100644 index 00000000..f984df76 --- /dev/null +++ b/PowerEditor/gcc/delete.bat @@ -0,0 +1,4 @@ +@echo off +FOR /F "tokens=*" %%G IN ('dir /b /s ..\src\*.o') DO del "%%G" +del resources.res +@echo on \ No newline at end of file diff --git a/PowerEditor/gcc/include/eh.h b/PowerEditor/gcc/include/eh.h new file mode 100644 index 00000000..783ad7f7 --- /dev/null +++ b/PowerEditor/gcc/include/eh.h @@ -0,0 +1,7 @@ +#ifndef EH_H + +typedef void (*exFunc)(unsigned int, EXCEPTION_POINTERS *); + +void _set_se_translator(exFunc) {}; + +#endif //EH_H diff --git a/PowerEditor/gcc/include/various.h b/PowerEditor/gcc/include/various.h new file mode 100644 index 00000000..10f04502 --- /dev/null +++ b/PowerEditor/gcc/include/various.h @@ -0,0 +1,51 @@ +//this file contains definitions not available in gcc 3.4.5, +//but are needed for Notepad++ +//the makefile will automatically include this header file + +//GetLongPathName = 410 +//Multimonitor: 410 +#define _WIN32_WINDOWS 0x0410 +//Toolbar imagelist = 300 +//TCS_BOTTOM = 300 +//LVS_EX_BORDERSELECT = 500 +//TBSTYLE_EX_HIDECLIPPEDBUTTONS = 501 +#define _WIN32_IE 0x501 +//Theme (uxtheme) +#define _WIN32_WINNT 0x0501 + +//#include + +#if (_WIN32_IE >= 0x0400) +#define TCN_GETOBJECT (TCN_FIRST - 3) +#endif + +#if (_WIN32_IE >= 0x0500) +#define RBN_CHEVRONPUSHED (RBN_FIRST - 10) +#endif // _WIN32_IE >= 0x0500 +/* +#ifndef max +#define max(a,b) (((a) > (b)) ? (a) : (b)) +#endif + +#ifndef min +#define min(a,b) (((a) < (b)) ? (a) : (b)) +#endif +*/ + +static inline int max(unsigned int a, unsigned int b) { + return (((a) > (b)) ? (a) : (b)); +} + +static inline int min(unsigned int a, unsigned int b) { + return (((a) < (b)) ? (a) : (b)); +} + +//__try and __except dont work in gcc, so heres some defines to take em out +#define __try +#define __except(x) if(false) + +#define GetExceptionCode() 0 +#define GetExceptionInformation() NULL + +//Missing unicode CRT funcs +double _wtof(const wchar_t * string); diff --git a/PowerEditor/gcc/makefile b/PowerEditor/gcc/makefile new file mode 100644 index 00000000..440fec33 --- /dev/null +++ b/PowerEditor/gcc/makefile @@ -0,0 +1,203 @@ +# this file is part of notepad++ +# Copyright (C)2008 Harry Bruin +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# 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. + +# Directories: +NPP_DIR = ../src +SCI_DIR = ../../scintilla/include +GCC_DIR = . +GCCINCLUDE_DIR = $(GCC_DIR)/include + +#MISC: +MISC_DIR = $(NPP_DIR)/MISC + COMMON_DIR = $(MISC_DIR)/Common + EXCEPTION_DIR = $(MISC_DIR)/Exception + PLUGINS_DIR = $(MISC_DIR)/PluginsManager + PROCESS_DIR = $(MISC_DIR)/Process + REGEXT_DIR = $(MISC_DIR)/RegExt + +#ScintillaComponent: +SCINT_DIR = $(NPP_DIR)/ScitillaComponent + +#TinyXml +TIXML_DIR = $(NPP_DIR)/TinyXml + +#WinControls +WIN_DIR = $(NPP_DIR)/WinControls + ABOUT_DIR = $(WIN_DIR)/AboutDlg + CONTEXT_DIR = $(WIN_DIR)/ContextMenu + COLOUR_DIR = $(WIN_DIR)/ColourPicker + DOCKING_DIR = $(WIN_DIR)/DockingWnd + GRID_DIR = $(WIN_DIR)/Grid + IMLIST_DIR = $(WIN_DIR)/ImageListSet + OPENSAVE_DIR = $(WIN_DIR)/OpenSaveFileDialog + # PANNER_DIR = $(WIN_DIR)/Panner + PREFERENCE_DIR = $(WIN_DIR)/Preference + SHORTCUT_DIR = $(WIN_DIR)/shortcut + SPLITTER_DIR = $(WIN_DIR)/SplitterContainer + STATICDLG_DIR = $(WIN_DIR)/StaticDialog + RUNDLG_DIR = $(STATICDLG_DIR)/RunDlg + STATUSBAR_DIR = $(WIN_DIR)/StatusBar + TABBAR_DIR = $(WIN_DIR)/TabBar + TASKLIST_DIR = $(WIN_DIR)/TaskList + TOOLBAR_DIR = $(WIN_DIR)/ToolBar + TOOLTIP_DIR = $(WIN_DIR)/ToolTip + TRAYICON_DIR = $(WIN_DIR)/TrayIcon + TREEVIEW_DIR = $(WIN_DIR)/TreeView + WINDOWSDLG_DIR = $(WIN_DIR)/WindowsDlg + + +# Sources: +SRC_NPP = $(wildcard $(NPP_DIR)/*.cpp) +SRC_GCCINCLUDE = $(wildcard $(GCCINCLUDE_DIR)/*.cpp) + +#MISC +SRC_MISC = $(wildcard $(MISC_DIR)/*.cpp) + SRC_COMMON = $(wildcard $(COMMON_DIR)/*.cpp) + SRC_EXCEPTION = $(wildcard $(EXCEPTION_DIR)/*.cpp) + SRC_PLUGINS = $(wildcard $(PLUGINS_DIR)/*.cpp) + SRC_PROCESS = $(wildcard $(PROCESS_DIR)/*.cpp) + SRC_REGEXT = $(wildcard $(REGEXT_DIR)/*.cpp) + +#ScintillaComponent +SRC_SCINT = $(wildcard $(SCINT_DIR)/*.cpp) + +#TinyXml +SRC_TIXML = $(wildcard $(TIXML_DIR)/*.cpp) + +#WinControls +SRC_WIN = $(wildcard $(WIN_DIR)/*.cpp) + SRC_ABOUT = $(wildcard $(ABOUT_DIR)/*.cpp) + SRC_CONTEXT = $(wildcard $(CONTEXT_DIR)/*.cpp) + SRC_COLOUR = $(wildcard $(COLOUR_DIR)/*.cpp) + SRC_DOCKING = $(wildcard $(DOCKING_DIR)/*.cpp) + SRC_GRID = $(wildcard $(GRID_DIR)/*.cpp) + SRC_IMLIST = $(wildcard $(IMLIST_DIR)/*.cpp) + SRC_OPENSAVE = $(wildcard $(OPENSAVE_DIR)/*.cpp) + SRC_PREFERENCE = $(wildcard $(PREFERENCE_DIR)/*.cpp) + SRC_SHORTCUT = $(wildcard $(SHORTCUT_DIR)/*.cpp) + SRC_SPLITTER = $(wildcard $(SPLITTER_DIR)/*.cpp) + SRC_STATICDLG = $(wildcard $(STATICDLG_DIR)/*.cpp) + SRC_RUNDLG = $(wildcard $(RUNDLG_DIR)/*.cpp) + SRC_STATUSBAR = $(wildcard $(STATUSBAR_DIR)/*.cpp) + SRC_TABBAR = $(wildcard $(TABBAR_DIR)/*.cpp) + SRC_TASKLIST = $(wildcard $(TASKLIST_DIR)/*.cpp) + SRC_TOOLBAR = $(wildcard $(TOOLBAR_DIR)/*.cpp) + SRC_TOOLTIP = $(wildcard $(TOOLTIP_DIR)/*.cpp) + SRC_TRAYICON = $(wildcard $(TRAYICON_DIR)/*.cpp) + SRC_TREEVIEW = $(wildcard $(TREEVIEW_DIR)/*.cpp) + SRC_WINDOWSDLG = $(wildcard $(WINDOWSDLG_DIR)/*.cpp) + +# Objects: +OBJ_NPP = $(patsubst %.cpp,%.o,$(SRC_NPP)) +OBJ_GCCINCLUDE = $(patsubst %.cpp,%.o,$(SRC_GCCINCLUDE)) + +#MISC +OBJ_MISC = $(patsubst %.cpp,%.o,$(SRC_MISC)) + OBJ_COMMON = $(patsubst %.cpp,%.o,$(SRC_COMMON)) + OBJ_EXCEPTION = $(patsubst %.cpp,%.o,$(SRC_EXCEPTION)) + OBJ_PLUGINS = $(patsubst %.cpp,%.o,$(SRC_PLUGINS)) + OBJ_PROCESS = $(patsubst %.cpp,%.o,$(SRC_PROCESS)) + OBJ_REGEXT = $(patsubst %.cpp,%.o,$(SRC_REGEXT)) + +#ScintillaComponent +OBJ_SCINT = $(patsubst %.cpp,%.o,$(SRC_SCINT)) + +#TinyXml +OBJ_TIXML = $(patsubst %.cpp,%.o,$(SRC_TIXML)) + +#WinControls +OBJ_WIN = $(patsubst %.cpp,%.o,$(SRC_WIN)) + OBJ_ABOUT = $(patsubst %.cpp,%.o,$(SRC_ABOUT)) + OBJ_CONTEXT = $(patsubst %.cpp,%.o,$(SRC_CONTEXT)) + OBJ_COLOUR = $(patsubst %.cpp,%.o,$(SRC_COLOUR)) + OBJ_DOCKING = $(patsubst %.cpp,%.o,$(SRC_DOCKING)) + OBJ_GRID = $(patsubst %.cpp,%.o,$(SRC_GRID)) + OBJ_IMLIST = $(patsubst %.cpp,%.o,$(SRC_IMLIST)) + OBJ_OPENSAVE = $(patsubst %.cpp,%.o,$(SRC_OPENSAVE)) + OBJ_PREFERENCE = $(patsubst %.cpp,%.o,$(SRC_PREFERENCE)) + OBJ_SHORTCUT = $(patsubst %.cpp,%.o,$(SRC_SHORTCUT)) + OBJ_SPLITTER = $(patsubst %.cpp,%.o,$(SRC_SPLITTER)) + OBJ_STATICDLG = $(patsubst %.cpp,%.o,$(SRC_STATICDLG)) + OBJ_RUNDLG = $(patsubst %.cpp,%.o,$(SRC_RUNDLG)) + OBJ_STATUSBAR = $(patsubst %.cpp,%.o,$(SRC_STATUSBAR)) + OBJ_TABBAR = $(patsubst %.cpp,%.o,$(SRC_TABBAR)) + OBJ_TASKLIST = $(patsubst %.cpp,%.o,$(SRC_TASKLIST)) + OBJ_TOOLBAR = $(patsubst %.cpp,%.o,$(SRC_TOOLBAR)) + OBJ_TOOLTIP = $(patsubst %.cpp,%.o,$(SRC_TOOLTIP)) + OBJ_TRAYICON = $(patsubst %.cpp,%.o,$(SRC_TRAYICON)) + OBJ_TREEVIEW = $(patsubst %.cpp,%.o,$(SRC_TREEVIEW)) + OBJ_WINDOWSDLG = $(patsubst %.cpp,%.o,$(SRC_WINDOWSDLG)) + +# Collections +DIRS_WIN = $(WIN_DIR) $(ABOUT_DIR) $(CONTEXT_DIR) $(COLOUR_DIR) $(DOCKING_DIR) $(GRID_DIR) $(IMLIST_DIR) $(OPENSAVE_DIR) $(PREFERENCE_DIR) $(SHORTCUT_DIR) $(SPLITTER_DIR) $(STATICDLG_DIR) $(RUNDLG_DIR) $(STATUSBAR_DIR) $(TABBAR_DIR) $(TASKLIST_DIR) $(TOOLBAR_DIR) $(TOOLTIP_DIR) $(TRAYICON_DIR) $(TREEVIEW_DIR) $(WINDOWSDLG_DIR) +DIRS_TIXML = $(TIXML_DIR) +DIRS_SCINT = $(SCINT_DIR) +DIRS_MISC = $(MISC_DIR) $(COMMON_DIR) $(EXCEPTION_DIR) $(PLUGINS_DIR) $(PROCESS_DIR) $(REGEXT_DIR) +DIRS = $(NPP_DIR) $(DIRS_WIN) $(DIRS_TIXML) $(DIRS_SCINT) $(DIRS_MISC) $(SCI_DIR) + +SRCS_WIN = $(SRC_WIN) $(SRC_ABOUT) $(SRC_CONTEXT) $(SRC_COLOUR) $(SRC_DOCKING) $(SRC_GRID) $(SRC_IMLIST) $(SRC_OPENSAVE) $(SRC_PREFERENCE) $(SRC_SHORTCUT) $(SRC_SPLITTER) $(SRC_STATICDLG) $(SRC_RUNDLG) $(SRC_STATUSBAR) $(SRC_TABBAR) $(SRC_TASKLIST) $(SRC_TOOLBAR) $(SRC_TOOLTIP) $(SRC_TRAYICON) $(SRC_TREEVIEW) $(SRC_WINDOWSDLG) +SRCS_TIXML = $(SRC_TIXML) +SRCS_SCINT = $(SRC_SCINT) +SRCS_MISC = $(SRC_MISC) $(SRC_COMMON) $(SRC_EXCEPTION) $(SRC_PLUGINS) $(SRC_PROCESS) $(SRC_REGEXT) +SRCS = $(SRC_NPP) $(SRCS_WIN) $(SRCS_TIXML) $(SRCS_SCINT) $(SRCS_MISC) $(SRC_GCCINCLUDE) + +OBJS_WIN = $(OBJ_WIN) $(OBJ_ABOUT) $(OBJ_CONTEXT) $(OBJ_COLOUR) $(OBJ_DOCKING) $(OBJ_GRID) $(OBJ_IMLIST) $(OBJ_OPENSAVE) $(OBJ_PREFERENCE) $(OBJ_SHORTCUT) $(OBJ_SPLITTER) $(OBJ_STATICDLG) $(OBJ_RUNDLG) $(OBJ_STATUSBAR) $(OBJ_TABBAR) $(OBJ_TASKLIST) $(OBJ_TOOLBAR) $(OBJ_TOOLTIP) $(OBJ_TRAYICON) $(OBJ_TREEVIEW) $(OBJ_WINDOWSDLG) +OBJS_TIXML = $(OBJ_TIXML) +OBJS_SCINT = $(OBJ_SCINT) +OBJS_MISC = $(OBJ_MISC) $(OBJ_COMMON) $(OBJ_EXCEPTION) $(OBJ_PLUGINS) $(OBJ_PROCESS) $(OBJ_REGEXT) +OBJS = $(OBJ_NPP) $(OBJS_WIN) $(OBJS_TIXML) $(OBJS_SCINT) $(OBJS_MISC) $(OBJ_GCCINCLUDE) + +# Main resource file +SRC_RES = ./resources.rc +OBJ_RES = $(patsubst %.rc,%.res,$(SRC_RES)) + +# Parameters +INCLUDESPECIAL = -include./include/various.h -includeCommon.h +# Comment this out for ANSI build +UNICODE = -DUNICODE -D_UNICODE + +CXX = g++ +#CXXFLAGS = -O2 $(INCLUDESPECIAL) +CXXFLAGS = $(INCLUDESPECIAL) -DTIXML_USE_STL $(UNICODE) +INCLUDES = $(patsubst %,-I%,$(DIRS)) -I./include +LDFLAGS = -Wl,--subsystem,windows +LIBS = -lcomdlg32 -lcomctl32 -lgdi32 -lole32 -loleacc -lshell32 -lshlwapi + +RC = windres + +OUT_NPP = NotepadPP.exe + +EXEC = ../bin/$(OUT_NPP) + +all: NotepadPP + +# Main Notepad++ rule +NotepadPP: $(OBJS) $(OBJ_RES) + $(CXX) $(CXXFLAGS) $(INCLUDES) $(LDFLAGS) $(OBJS) $(OBJ_RES) -o $(EXEC) $(LIBS) + +NotepadPPUnicode: $(OBJS) $(OBJ_RES) + $(CXX) $(CXXFLAGS) $(INCLUDES) $(LDFLAGS) $(OBJS) $(OBJ_RES) -o $(EXEC) $(LIBS) + +%.o: %.cpp + $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@ + +%.res: %.rc + $(RC) $(INCLUDES) $(UNICODE) --input=$< --output=$@ --input-format=rc --output-format=coff + +# Cleanup +clean: + @delete.bat diff --git a/PowerEditor/gcc/readme.txt b/PowerEditor/gcc/readme.txt new file mode 100644 index 00000000..26b20b6a --- /dev/null +++ b/PowerEditor/gcc/readme.txt @@ -0,0 +1,5 @@ +makefile was renewed after the v5.0 release. +It was testing with a MingW distribution containing +gcc (GCC) 3.4.5 (mingw-vista special r3) +The default make rule should suffice for building Notepad++, +the clean rule call batch file with commands to remove .o files and resource file \ No newline at end of file diff --git a/PowerEditor/gcc/resources.rc b/PowerEditor/gcc/resources.rc new file mode 100644 index 00000000..c39177f0 --- /dev/null +++ b/PowerEditor/gcc/resources.rc @@ -0,0 +1,19 @@ +#include "./include/various.h" + +#define TEXT(quote) quote + +#include "../src/ScitillaComponent/columnEditor.rc" +#include "../src/ScitillaComponent/FindReplaceDlg.rc" +#include "../src/ScitillaComponent/UserDefineDialog.rc" +#include "../src/MISC/RegExt/regExtDlg.rc" +#include "../src/WinControls/ColourPicker/ColourPopup.rc" +#include "../src/WinControls/ColourPicker/WordStyleDlg.rc" +#include "../src/WinControls/DockingWnd/DockingGUIWidget.rc" +#include "../src/WinControls/Grid/ShortcutMapper.rc" +#include "../src/WinControls/Preference/preference.rc" +#include "../src/WinControls/shortcut/RunMacroDlg.rc" +#include "../src/WinControls/shortcut/shortcut.rc" +#include "../src/WinControls/TaskList/TaskListDlg.rc" +#include "../src/WinControls/StaticDialog/RunDlg/RunDlg.rc" +#include "../src/WinControls/WindowsDlg/WindowsDlg.rc" +#include "../src/Notepad_plus.rc" diff --git a/PowerEditor/installer/bin/xmlUpdater.exe b/PowerEditor/installer/bin/xmlUpdater.exe new file mode 100644 index 0000000000000000000000000000000000000000..8f65ebb313b64b2e51e9db901323a2ad353aaaec GIT binary patch literal 100247 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 eY)tmU0 + + + + + diff --git a/PowerEditor/installer/externalTools/md5summer.exe b/PowerEditor/installer/externalTools/md5summer.exe new file mode 100644 index 0000000000000000000000000000000000000000..d33cbcc6892fe60615d454f43dcdead98ccc4a72 GIT binary patch literal 907264 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�D{Fmy!fhk3?muqK>=mEvG&F@#pA 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

    )o&K#-IIjZc-IsV73 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

    Pz1bn$=)_sF+3Rh2i!IrUjoEW`*$WLh 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 K{121=ar+lGl{dQp literal 0 HcmV?d00001 diff --git a/PowerEditor/installer/images/header.bmp b/PowerEditor/installer/images/header.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f49d7def548e111d869ce92ba53534e7bcb572cd GIT binary patch literal 25818 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 CQL(uI literal 0 HcmV?d00001 diff --git a/PowerEditor/installer/images/headerLeft.bmp b/PowerEditor/installer/images/headerLeft.bmp new file mode 100644 index 0000000000000000000000000000000000000000..903d555e5e2fc421cfab5f5cc5302486d6b51d86 GIT binary patch literal 26270 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 literal 0 HcmV?d00001 diff --git a/PowerEditor/installer/images/headerRight.bmp b/PowerEditor/installer/images/headerRight.bmp new file mode 100644 index 0000000000000000000000000000000000000000..eb1879a516a91238e82e72e5c6e2c45cae0e39bc GIT binary patch literal 26270 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 literal 0 HcmV?d00001 diff --git a/PowerEditor/installer/images/splash.bmp b/PowerEditor/installer/images/splash.bmp new file mode 100644 index 0000000000000000000000000000000000000000..aba252a085076d46396702ff087e310f265b9e69 GIT binary patch literal 1205354 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%0DI*R> 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 Ba3cT! literal 0 HcmV?d00001 diff --git a/PowerEditor/installer/images/wizard.bmp b/PowerEditor/installer/images/wizard.bmp new file mode 100644 index 0000000000000000000000000000000000000000..5c2f11d435b953f1999f3c044a4dfd276843ded2 GIT binary patch literal 154542 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 literal 0 HcmV?d00001 diff --git a/PowerEditor/installer/langsModel.xml b/PowerEditor/installer/langsModel.xml new file mode 100644 index 00000000..ba690cfa --- /dev/null +++ b/PowerEditor/installer/langsModel.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/PowerEditor/installer/nppSetup.nsi b/PowerEditor/installer/nppSetup.nsi new file mode 100644 index 00000000..1fe18599 --- /dev/null +++ b/PowerEditor/installer/nppSetup.nsi @@ -0,0 +1,1011 @@ +;this file is part of installer for Notepad++ +;Copyright (C)2006 Don HO +; +;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. +; +;This program is distributed in the hope that it will be useful, +;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. + +; Define the application name +!define APPNAME "Notepad++" +!define APPVERSION "5.3.1" +!define APPNAMEANDVERSION "Notepad++ v5.3.1" +!define APPWEBSITE "http://notepad-plus.sourceforge.net/" + +!define VERSION_MAJOR 5 +!define VERSION_MINOR 31 + +; Main Install settings +Name "${APPNAMEANDVERSION}" +InstallDir "$PROGRAMFILES\Notepad++" +InstallDirRegKey HKLM "Software\${APPNAME}" "" +OutFile "..\bin\npp.5.3.1.Installer.exe" + +; GetWindowsVersion + ; + ; Based on Yazno's function, http://yazno.tripod.com/powerpimpit/ + ; Updated by Joost Verburg + ; + ; Returns on top of stack + ; + ; Windows Version (95, 98, ME, NT x.x, 2000, XP, 2003, Vista) + ; or + ; '' (Unknown Windows Version) + ; + ; Usage: + ; Call GetWindowsVersion + ; Pop $R0 + ; ; at this point $R0 is "NT 4.0" or whatnot + +Function GetWindowsVersion + + Push $R0 + Push $R1 + + ClearErrors + + ReadRegStr $R0 HKLM \ + "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion + + IfErrors 0 lbl_winnt + + ; we are not NT + ReadRegStr $R0 HKLM \ + "SOFTWARE\Microsoft\Windows\CurrentVersion" VersionNumber + + StrCpy $R1 $R0 1 + StrCmp $R1 '4' 0 lbl_error + + StrCpy $R1 $R0 3 + + StrCmp $R1 '4.0' lbl_win32_95 + StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98 + + lbl_win32_95: + StrCpy $R0 '95' + Goto lbl_done + + lbl_win32_98: + StrCpy $R0 '98' + Goto lbl_done + + lbl_win32_ME: + StrCpy $R0 'ME' + Goto lbl_done + + lbl_winnt: + + StrCpy $R1 $R0 1 + + StrCmp $R1 '3' lbl_winnt_x + StrCmp $R1 '4' lbl_winnt_x + + StrCpy $R1 $R0 3 + + StrCmp $R1 '5.0' lbl_winnt_2000 + StrCmp $R1 '5.1' lbl_winnt_XP + StrCmp $R1 '5.2' lbl_winnt_2003 + StrCmp $R1 '6.0' lbl_winnt_vista lbl_error + + lbl_winnt_x: + StrCpy $R0 "NT $R0" 6 + Goto lbl_done + + lbl_winnt_2000: + Strcpy $R0 '2000' + Goto lbl_done + + lbl_winnt_XP: + Strcpy $R0 'XP' + Goto lbl_done + + lbl_winnt_2003: + Strcpy $R0 '2003' + Goto lbl_done + + lbl_winnt_vista: + Strcpy $R0 'Vista' + Goto lbl_done + + lbl_error: + Strcpy $R0 '' + lbl_done: + + Pop $R1 + Exch $R0 + +FunctionEnd + +Function LaunchNpp + Exec '"$INSTDIR\notepad++.exe" "$INSTDIR\change.log" ' +FunctionEnd + +; Modern interface settings +!include "MUI.nsh" +!include "x64.nsh" + +!define MUI_ICON ".\images\npp_inst.ico" + +!define MUI_WELCOMEFINISHPAGE_BITMAP ".\images\wizard.bmp" +!define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH + +!define MUI_HEADERIMAGE +;!define MUI_HEADERIMAGE_RIGHT +;!define MUI_HEADERIMAGE_BITMAP ".\images\headerRight.bmp" ; optional +!define MUI_HEADERIMAGE_BITMAP ".\images\headerLeft.bmp" ; optional +!define MUI_ABORTWARNING + + + +!insertmacro MUI_PAGE_WELCOME +!insertmacro MUI_PAGE_LICENSE "..\license.txt" +!insertmacro MUI_PAGE_DIRECTORY +!insertmacro MUI_PAGE_COMPONENTS +!insertmacro MUI_PAGE_INSTFILES + +!define MUI_FINISHPAGE_RUN +;!define MUI_FINISHPAGE_RUN_TEXT "Run Npp" +!define MUI_FINISHPAGE_RUN_FUNCTION "LaunchNpp" +!insertmacro MUI_PAGE_FINISH + +!insertmacro MUI_UNPAGE_CONFIRM +!insertmacro MUI_UNPAGE_INSTFILES + +; Set languages (first is default language) +;!insertmacro MUI_LANGUAGE "English" + +;Languages + + !insertmacro MUI_LANGUAGE "English" + !insertmacro MUI_LANGUAGE "French" + !insertmacro MUI_LANGUAGE "TradChinese" + !insertmacro MUI_LANGUAGE "Spanish" + !insertmacro MUI_LANGUAGE "Hungarian" + !insertmacro MUI_LANGUAGE "Russian" + !insertmacro MUI_LANGUAGE "German" + !insertmacro MUI_LANGUAGE "Dutch" + !insertmacro MUI_LANGUAGE "SimpChinese" + !insertmacro MUI_LANGUAGE "Italian" + !insertmacro MUI_LANGUAGE "Danish" + !insertmacro MUI_LANGUAGE "Polish" + !insertmacro MUI_LANGUAGE "Czech" + !insertmacro MUI_LANGUAGE "Slovenian" + !insertmacro MUI_LANGUAGE "Slovak" + !insertmacro MUI_LANGUAGE "Swedish" + !insertmacro MUI_LANGUAGE "Norwegian" + !insertmacro MUI_LANGUAGE "PortugueseBR" + !insertmacro MUI_LANGUAGE "Ukrainian" + !insertmacro MUI_LANGUAGE "Turkish" + !insertmacro MUI_LANGUAGE "Catalan" + !insertmacro MUI_LANGUAGE "Arabic" + !insertmacro MUI_LANGUAGE "Lithuanian" + !insertmacro MUI_LANGUAGE "Finnish" + !insertmacro MUI_LANGUAGE "Greek" + !insertmacro MUI_LANGUAGE "Romanian" + !insertmacro MUI_LANGUAGE "Korean" + !insertmacro MUI_LANGUAGE "Hebrew" + !insertmacro MUI_LANGUAGE "Portuguese" + !insertmacro MUI_LANGUAGE "Farsi" + !insertmacro MUI_LANGUAGE "Bulgarian" + !insertmacro MUI_LANGUAGE "Indonesian" + !insertmacro MUI_LANGUAGE "Japanese" + !insertmacro MUI_LANGUAGE "Croatian" + !insertmacro MUI_LANGUAGE "Serbian" + !insertmacro MUI_LANGUAGE "Thai" + !insertmacro MUI_LANGUAGE "NorwegianNynorsk" + !insertmacro MUI_LANGUAGE "Belarusian" + !insertmacro MUI_LANGUAGE "Albanian" + !insertmacro MUI_LANGUAGE "Malay" + !insertmacro MUI_LANGUAGE "Galician" + !insertmacro MUI_LANGUAGE "Basque" + !insertmacro MUI_LANGUAGE "Luxembourgish" + + ;!insertmacro MUI_LANGUAGE "Latvian" + ;!insertmacro MUI_LANGUAGE "Macedonian" + ;!insertmacro MUI_LANGUAGE "Estonian" + ; !insertmacro MUI_LANGUAGE "Mongolian" + ;!insertmacro MUI_LANGUAGE "Breton" + ;!insertmacro MUI_LANGUAGE "Icelandic" + ;!insertmacro MUI_LANGUAGE "Bosnian" + ;!insertmacro MUI_LANGUAGE "Kurdish" + ;!insertmacro MUI_LANGUAGE "Irish" + ;!insertmacro MUI_LANGUAGE "Uzbek" + ;!insertmacro MUI_LANGUAGE "Afrikaans" + +!insertmacro MUI_RESERVEFILE_LANGDLL + +;Installer Functions + + +Function .onInit + + ;Test if window9x + Call GetWindowsVersion + Pop $R0 + + StrCmp $R0 "95" 0 +3 + MessageBox MB_OK "The installer contains only Unicode version of Notepad++, which is not compatible with your Windows 95.$\nPlease use ANSI version in zipped package, which you can download here :$\nhttps://sourceforge.net/project/showfiles.php?group_id=95717&package_id=102072" + Abort + + StrCmp $R0 "98" 0 +3 + MessageBox MB_OK "The installer contains only Unicode version of Notepad++, which is not compatible with your Windows 98.$\nPlease use ANSI version in zipped package, which you can download here :$\nhttps://sourceforge.net/project/showfiles.php?group_id=95717&package_id=102072" + Abort + + StrCmp $R0 "ME" 0 +3 + MessageBox MB_OK "The installer contains only Unicode version of Notepad++,, which is not compatible with your Windows ME.$\nPlease use ANSI version in zipped package, which you can download here :$\nhttps://sourceforge.net/project/showfiles.php?group_id=95717&package_id=102072" + Abort + + !insertmacro MUI_LANGDLL_DISPLAY + # the plugins dir is automatically deleted when the installer exits + ;InitPluginsDir + ;File /oname=$PLUGINSDIR\splash.bmp ".\images\splash.bmp" + #optional + #File /oname=$PLUGINSDIR\splash.wav "C:\myprog\sound.wav" + + ;splash::show 1000 $PLUGINSDIR\splash + + ;Pop $0 ; $0 has '1' if the user closed the splash screen early, + ; '0' if everything closed normally, and '-1' if some error occurred. + +FunctionEnd + +LangString langFileName ${LANG_ENGLISH} "english.xml" +LangString langFileName ${LANG_FRENCH} "french.xml" +LangString langFileName ${LANG_TRADCHINESE} "chinese.xml" +LangString langFileName ${LANG_GERMAN} "german.xml" +LangString langFileName ${LANG_SPANISH} "spanish.xml" +LangString langFileName ${LANG_HUNGARIAN} "hungarian.xml" +LangString langFileName ${LANG_RUSSIAN} "russian.xml" +LangString langFileName ${LANG_DUTCH} "dutch.xml" +LangString langFileName ${LANG_SIMPCHINESE} "chineseSimplified.xml" +LangString langFileName ${LANG_ITALIAN} "italian.xml" +LangString langFileName ${LANG_DANISH} "danish.xml" +LangString langFileName ${LANG_POLISH} "polish.xml" +LangString langFileName ${LANG_CZECH} "czech.xml" +LangString langFileName ${LANG_SLOVENIAN} "slovenian.xml" +LangString langFileName ${LANG_SLOVAK} "slovak.xml" +LangString langFileName ${LANG_SWEDISH} "swedish.xml" +LangString langFileName ${LANG_NORWEGIAN} "norwegian.xml" +LangString langFileName ${LANG_PORTUGUESEBR} "brazilian_portuguese.xml" +LangString langFileName ${LANG_UKRAINIAN} "ukrainian.xml" +LangString langFileName ${LANG_TURKISH} "turkish.xml" +LangString langFileName ${LANG_CATALAN} "catalan.xml" +LangString langFileName ${LANG_ARABIC} "arabic.xml" +LangString langFileName ${LANG_LITHUANIAN} "lithuanian.xml" +LangString langFileName ${LANG_FINNISH} "finnish.xml" +LangString langFileName ${LANG_GREEK} "greek.xml" +LangString langFileName ${LANG_ROMANIAN} "romanian.xml" +LangString langFileName ${LANG_KOREAN} "korean.xml" +LangString langFileName ${LANG_HEBREW} "hebrew.xml" +LangString langFileName ${LANG_PORTUGUESE} "portuguese.xml" +LangString langFileName ${LANG_FARSI} "farsi.xml" +LangString langFileName ${LANG_BULGARIAN} "bulgarian.xml" +LangString langFileName ${LANG_INDONESIAN} "indonesian.xml" +LangString langFileName ${LANG_JAPANESE} "japanese.xml" +LangString langFileName ${LANG_CROATIAN} "croatian.xml" +LangString langFileName ${LANG_SERBIAN} "serbian.xml" +LangString langFileName ${LANG_THAI} "thai.xml" +LangString langFileName ${LANG_NORWEGIANNYNORSK} "nynorsk.xml" +LangString langFileName ${LANG_BELARUSIAN} "belarusian.xml" +LangString langFileName ${LANG_ALBANIAN} "albanian.xml" +LangString langFileName ${LANG_MALAY} "malay.xml" +LangString langFileName ${LANG_GALICIAN} "galician.xml" +LangString langFileName ${LANG_BASQUE} "basque.xml" +LangString langFileName ${LANG_LUXEMBOURGISH} "luxembourgish.xml" + + +;-------------------------------- +;Variables + Var IS_LOCAL +;-------------------------------- + +Section /o "Don't use %APPDATA%" makeLocal + StrCpy $IS_LOCAL "1" +SectionEnd + +Var UPDATE_PATH + +Section -"Notepad++" mainSection + + ; Set Section properties + SetOverwrite on + + StrCpy $UPDATE_PATH $INSTDIR + + ;SetOutPath "$TEMP\" + File /oname=$TEMP\xmlUpdater.exe ".\bin\xmlUpdater.exe" + + SetOutPath "$INSTDIR\" + + ; if isLocal -> copy file "doLocalConf.xml" + StrCmp $IS_LOCAL "1" 0 IS_NOT_LOCAL + File "..\bin\doLocalConf.xml" + goto GLOBAL_INST + +IS_NOT_LOCAL: + IfFileExists $INSTDIR\doLocalConf.xml 0 +2 + Delete $INSTDIR\doLocalConf.xml + + StrCpy $UPDATE_PATH "$APPDATA\Notepad++" + CreateDirectory $UPDATE_PATH\plugins\config + +GLOBAL_INST: + SetOutPath "$TEMP\" + File "langsModel.xml" + File "configModel.xml" + File "stylesModel.xml" + + File "..\bin\langs.model.xml" + File "..\bin\config.model.xml" + File "..\bin\stylers.model.xml" + File "..\bin\stylers_remove.xml" + + ;UPGRATE $INSTDIR\langs.xml + nsExec::ExecToStack '"$TEMP\xmlUpdater.exe" "$TEMP\langsModel.xml" "$TEMP\langs.model.xml" "$INSTDIR\langs.xml"' + nsExec::ExecToStack '"$TEMP\xmlUpdater.exe" "$TEMP\configModel.xml" "$TEMP\config.model.xml" "$UPDATE_PATH\config.xml"' + nsExec::ExecToStack '"$TEMP\xmlUpdater.exe" "$TEMP\stylesModel.xml" "$TEMP\stylers_remove.xml" "$UPDATE_PATH\stylers.xml"' + nsExec::ExecToStack '"$TEMP\xmlUpdater.exe" "$TEMP\stylesModel.xml" "$TEMP\stylers.model.xml" "$UPDATE_PATH\stylers.xml"' + + SetOutPath "$INSTDIR\" + File "..\bin\langs.model.xml" + File "..\bin\config.model.xml" + File "..\bin\stylers.model.xml" + File "..\bin\stylers_remove.xml" + + SetOverwrite off + File /oname=$INSTDIR\langs.xml "..\bin\langs.model.xml" + File "..\bin\contextMenu.xml" + File "..\bin\shortcuts.xml" + + ; Set Section Files and Shortcuts + + SetOverwrite on + File "..\license.txt" + File "..\bin\LINEDRAW.TTF" + File "..\bin\SciLexer.dll" + File "..\bin\change.log" + File "..\bin\notepad++.exe" + File "..\bin\readme.txt" + File "..\bin\NppHelp.chm" + + SetOutPath "$INSTDIR\localization\" + File ".\nativeLang\" + + IfFileExists "$UPDATE_PATH\nativeLang.xml" 0 +2 + Delete "$UPDATE_PATH\nativeLang.xml" + + IfFileExists "$INSTDIR\nativeLang.xml" 0 +2 + Delete "$INSTDIR\nativeLang.xml" + + StrCmp $LANGUAGE ${LANG_ENGLISH} +2 0 + CopyFiles "$INSTDIR\localization\$(langFileName)" "$INSTDIR\nativeLang.xml" + + ; remove all the npp shortcuts from current user + Delete "$DESKTOP\Notepad++.lnk" + Delete "$SMPROGRAMS\Notepad++\Notepad++.lnk" + Delete "$SMPROGRAMS\Notepad++\readme.lnk" + Delete "$SMPROGRAMS\Notepad++\Uninstall.lnk" + CreateDirectory "$SMPROGRAMS\Notepad++" + CreateShortCut "$SMPROGRAMS\Notepad++\Uninstall.lnk" "$INSTDIR\uninstall.exe" + + + ;clean + Delete "$INSTDIR\plugins\NPPTextFX\AsciiToEBCDIC.bin" + Delete "$INSTDIR\plugins\NPPTextFX\libTidy.dll" + Delete "$INSTDIR\plugins\NPPTextFX\TIDYCFG.INI" + Delete "$INSTDIR\plugins\NPPTextFX\W3C-CSSValidator.htm" + Delete "$INSTDIR\plugins\NPPTextFX\W3C-HTMLValidator.htm" + RMDir "$INSTDIR\plugins\NPPTextFX\" + + ; remove unstable plugins + IfFileExists "$INSTDIR\plugins\HexEditorPlugin.dll" 0 +3 + MessageBox MB_OK "Due to the problem of compability with this version,$\nHexEditorPlugin.dll is about to be deleted." + Delete "$INSTDIR\plugins\HexEditorPlugin.dll" + + IfFileExists "$INSTDIR\plugins\HexEditor.dll" 0 +3 + MessageBox MB_OK "Due to the problem of compability with this version,$\nHexEditor.dll is about to be deleted.$\nYou can download it via menu $\"?->Get more plugins$\" if you really need it." + Delete "$INSTDIR\plugins\HexEditor.dll" + + IfFileExists "$INSTDIR\plugins\MultiClipboard.dll" 0 +3 + MessageBox MB_OK "Due to the problem of compability with this version,$\nMultiClipboard.dll is about to be deleted.$\nYou can download it via menu $\"?->Get more plugins$\" if you really need it." + Delete "$INSTDIR\plugins\MultiClipboard.dll" + + Delete "$INSTDIR\plugins\NppDocShare.dll" + + IfFileExists "$INSTDIR\plugins\FunctionList.dll" 0 +3 + MessageBox MB_OK "Due to the problem of compability with this version,$\nFunctionList.dll is about to be deleted.$\nYou can download it via menu $\"?->Get more plugins$\" if you really need it." + Delete "$INSTDIR\plugins\FunctionList.dll" + + IfFileExists "$INSTDIR\plugins\NPPTextFX.ini" 0 +2 + Delete "$INSTDIR\plugins\NPPTextFX.ini" + + IfFileExists "$INSTDIR\plugins\NppAutoIndent.dll" 0 +3 + MessageBox MB_OK "Due to the stabilty issue,$\nNppAutoIndent.dll is about to be deleted.$\nYou can download it via menu $\"?->Get more plugins$\" if you really need it." + Delete "$INSTDIR\plugins\NppAutoIndent.dll" + + IfFileExists "$INSTDIR\plugins\ComparePlugin.dll" 0 +3 + MessageBox MB_OK "Due to the problem of compability with this version,$\nComparePlugin.dll is about to be deleted.$\nYou can download it via menu $\"?->Get more plugins$\" if you really need it." + Delete "$INSTDIR\plugins\ComparePlugin.dll" + + ; detect the right of + UserInfo::GetAccountType + Pop $1 + StrCmp $1 "Admin" 0 +2 + + SetShellVarContext all + ; add all the npp shortcuts for all user or current user + CreateDirectory "$SMPROGRAMS\Notepad++" + CreateShortCut "$DESKTOP\Notepad++.lnk" "$INSTDIR\notepad++.exe" + CreateShortCut "$SMPROGRAMS\Notepad++\Notepad++.lnk" "$INSTDIR\notepad++.exe" + CreateShortCut "$SMPROGRAMS\Notepad++\readme.lnk" "$INSTDIR\readme.txt" + SetShellVarContext current + WriteRegStr HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\notepad++.exe" "" "$INSTDIR\notepad++.exe" +SectionEnd + +Section "Context Menu Entry" explorerContextMenu + SetOverwrite try + SetOutPath "$INSTDIR\" + ${If} ${RunningX64} + File /oname=$INSTDIR\nppcm.dll "..\bin\nppcm64.dll" + ${Else} + File "..\bin\nppcm.dll" + ${EndIf} + + Exec 'regsvr32 /s "$INSTDIR\nppcm.dll"' + Exec 'regsvr32 /u /s "$INSTDIR\nppshellext.dll"' + Delete "$INSTDIR\nppshellext.dll" +SectionEnd + +SubSection "Auto-completion Files" autoCompletionComponent + SetOverwrite off + + Section C + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\c.xml" + SectionEnd + + Section C++ + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\cpp.xml" + SectionEnd + + Section Java + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\java.xml" + SectionEnd + + Section C# + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\cs.xml" + SectionEnd + + Section HTML + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\html.xml" + SectionEnd + + Section RC + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\rc.xml" + SectionEnd + + Section SQL + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\sql.xml" + SectionEnd + + Section PHP + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\php.xml" + SectionEnd + + Section CSS + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\css.xml" + SectionEnd + + Section VB + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\vb.xml" + SectionEnd + + Section Perl + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\perl.xml" + SectionEnd + + Section JavaScript + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\javascript.xml" + SectionEnd + + Section Python + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\python.xml" + SectionEnd + + Section ActionScript + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\actionscript.xml" + SectionEnd + + Section LISP + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\lisp.xml" + SectionEnd + + Section VHDL + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\vhdl.xml" + SectionEnd + + Section TeX + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\tex.xml" + SectionEnd + + Section DocBook + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\xml.xml" + SectionEnd + + Section NSIS + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\nsis.xml" + SectionEnd + + Section AWK + SetOutPath "$INSTDIR\plugins\APIs" + File "..\bin\plugins\APIs\awk.xml" + SectionEnd +SubSectionEnd + +SubSection "Plugins" Plugins + + SetOverwrite on + + Section "NPPTextFX" NPPTextFX + SetOutPath "$INSTDIR\plugins" + File "..\bin\plugins\NPPTextFX.dll" + + SetOutPath "$INSTDIR\plugins\Config\tidy" + File "..\bin\plugins\Config\tidy\AsciiToEBCDIC.bin" + File "..\bin\plugins\Config\tidy\libTidy.dll" + File "..\bin\plugins\Config\tidy\TIDYCFG.INI" + File "..\bin\plugins\Config\tidy\W3C-CSSValidator.htm" + File "..\bin\plugins\Config\tidy\W3C-HTMLValidator.htm" + + SetOutPath "$INSTDIR\plugins\doc" + File "..\bin\plugins\doc\NPPTextFXdemo.TXT" + SectionEnd + + + Section "NppNetNote" NppNetNote + Delete "$INSTDIR\plugins\NppNetNote.dll" + SetOutPath "$INSTDIR\plugins" + File "..\bin\plugins\NppNetNote.dll" + SectionEnd + + + Section "Spell-Checker" SpellChecker + Delete "$INSTDIR\plugins\SpellChecker.dll" + SetOutPath "$INSTDIR\plugins" + File "..\bin\plugins\SpellChecker.dll" + SectionEnd + + Section "NppExec" NppExec + Delete "$INSTDIR\plugins\NppExec.dll" + SetOutPath "$INSTDIR\plugins" + File "..\bin\plugins\NppExec.dll" + SetOutPath "$INSTDIR\plugins\doc" + File "..\bin\plugins\doc\NppExec.txt" + File "..\bin\plugins\doc\NppExec_Guide.txt" + File "..\bin\plugins\doc\NppExec_TechInfo.txt" + SectionEnd + + Section "MIME Tools" MIMETools + Delete "$INSTDIR\plugins\NppTools.dll" + Delete "$INSTDIR\plugins\mimeTools.dll" + SetOutPath "$INSTDIR\plugins" + File "..\bin\plugins\mimeTools.dll" + SectionEnd + + Section "FTP synchronize" FTP_synchronize + Delete "$INSTDIR\plugins\FTP_synchronizeA.dll" + SetOutPath "$INSTDIR\plugins" + File "..\bin\plugins\FTP_synchronize.dll" + SetOutPath "$INSTDIR\plugins\doc" + File "..\bin\plugins\doc\FTP_synchonize.ReadMe.txt" + SectionEnd + + Section "NppExport" NppExport + Delete "$INSTDIR\plugins\NppExport.dll" + SetOutPath "$INSTDIR\plugins" + File "..\bin\plugins\NppExport.dll" + SectionEnd +/* + Section "ComparePlugin" ComparePlugin + Delete "$INSTDIR\plugins\ComparePlugin.dll" + SetOutPath "$INSTDIR\plugins" + File "..\bin\plugins\ComparePlugin.dll" + SectionEnd + + + Section "NppAutoIndent" NppAutoIndent + Delete "$INSTDIR\plugins\NppAutoIndent.dll" + SetOutPath "$INSTDIR\plugins" + File "..\bin\plugins\NppAutoIndent.dll" + + StrCmp $IS_LOCAL "1" 0 NOT_LOCAL + SetOutPath "$INSTDIR\plugins\Config\" + goto LOCAL + NOT_LOCAL: + SetOutPath "$APPDATA\Notepad++\plugins\Config\" + LOCAL: + File "..\bin\plugins\Config\NppAutoIndent.ini" + + SectionEnd +*/ + Section "Document Monitor" DocMonitor + Delete "$INSTDIR\plugins\docMonitor.dll" + SetOutPath "$INSTDIR\plugins" + File "..\bin\plugins\docMonitor.dll" + SectionEnd +SubSectionEnd + +Section /o "As default html viewer" htmlViewer + SetOutPath "$INSTDIR\" + File "..\bin\nppIExplorerShell.exe" + WriteRegStr HKLM "SOFTWARE\Microsoft\Internet Explorer\View Source Editor\Editor Name" "" "$INSTDIR\nppIExplorerShell.exe" +SectionEnd + +InstType "o" + +Section "Auto-Updater" AutoUpdater + SetOutPath "$INSTDIR\updater" + File "..\bin\updater\GUP.exe" + File "..\bin\updater\libcurl.dll" + File "..\bin\updater\gup.xml" + File "..\bin\updater\License.txt" + File "..\bin\updater\gpl.txt" + File "..\bin\updater\readme.txt" + File "..\bin\updater\getDownLoadUrl.php" +SectionEnd + +;-------------------------------- +;Descriptions + + ;Language strings + + ;Assign language strings to sections + !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN + !insertmacro MUI_DESCRIPTION_TEXT ${makeLocal} 'Enable this option to make Notepad++ load/write the configuration files from/to its install directory. Check it if you use Notepad++ in an USB device.' + !insertmacro MUI_DESCRIPTION_TEXT ${explorerContextMenu} 'Explorer context menu entry for Notepad++ : Open whatever you want in Notepad++ from Windows Explorer.' + !insertmacro MUI_DESCRIPTION_TEXT ${autoCompletionComponent} 'Install the API files you need for the auto-completion feature (Ctrl+Space).' + !insertmacro MUI_DESCRIPTION_TEXT ${Plugins} 'You may need those plugins to extend the capacity of Notepad++.' + !insertmacro MUI_DESCRIPTION_TEXT ${htmlViewer} 'Open the html file in Notepad++ while you choose from IE.' + !insertmacro MUI_DESCRIPTION_TEXT ${AutoUpdater} 'Keep your Notepad++ update: Check this option to install an update module which searches Notepad++ update on Internet and install it for you.' + !insertmacro MUI_FUNCTION_DESCRIPTION_END + +;-------------------------------- + +Section -FinishSection + + WriteRegStr HKLM "Software\${APPNAME}" "" "$INSTDIR" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayName" "${APPNAME}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "UninstallString" "$INSTDIR\uninstall.exe" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayIcon" "$INSTDIR\notepad++.exe" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayVersion" "${APPVERSION}" + WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "URLInfoAbout" "${APPWEBSITE}" + WriteUninstaller "$INSTDIR\uninstall.exe" + +SectionEnd + + +;Uninstall section + +SubSection un.autoCompletionComponent + Section un.PHP + Delete "$INSTDIR\plugins\APIs\php.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.CSS + Delete "$INSTDIR\plugins\APIs\css.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.HTML + Delete "$INSTDIR\plugins\APIs\html.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.SQL + Delete "$INSTDIR\plugins\APIs\sql.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.RC + Delete "$INSTDIR\plugins\APIs\rc.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.VB + Delete "$INSTDIR\plugins\APIs\vb.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.Perl + Delete "$INSTDIR\plugins\APIs\perl.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.C + Delete "$INSTDIR\plugins\APIs\c.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.C++ + Delete "$INSTDIR\plugins\APIs\cpp.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.Java + Delete "$INSTDIR\plugins\APIs\java.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.C# + Delete "$INSTDIR\plugins\APIs\cs.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.JavaScript + Delete "$INSTDIR\plugins\APIs\javascript.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.Python + Delete "$INSTDIR\plugins\APIs\python.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.ActionScript + Delete "$INSTDIR\plugins\APIs\actionscript.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.LISP + Delete "$INSTDIR\plugins\APIs\lisp.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.VHDL + Delete "$INSTDIR\plugins\APIs\vhdl.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.TeX + Delete "$INSTDIR\plugins\APIs\tex.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.DocBook + Delete "$INSTDIR\plugins\APIs\xml.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.NSIS + Delete "$INSTDIR\plugins\APIs\nsis.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + + Section un.AWK + Delete "$INSTDIR\plugins\APIs\awk.xml" + RMDir "$INSTDIR\plugins\APIs\" + SectionEnd + +SubSectionEnd + +SubSection un.Plugins + Section un.NPPTextFX + Delete "$INSTDIR\plugins\NPPTextFX.dll" + Delete "$INSTDIR\plugins\NPPTextFX.ini" + Delete "$APPDATA\Notepad++\NPPTextFX.ini" + Delete "$INSTDIR\plugins\doc\NPPTextFXdemo.TXT" + Delete "$INSTDIR\plugins\Config\tidy\AsciiToEBCDIC.bin" + Delete "$INSTDIR\plugins\Config\tidy\libTidy.dll" + Delete "$INSTDIR\plugins\Config\tidy\TIDYCFG.INI" + Delete "$INSTDIR\plugins\Config\tidy\W3C-CSSValidator.htm" + Delete "$INSTDIR\plugins\Config\tidy\W3C-HTMLValidator.htm" + RMDir "$INSTDIR\plugins\tidy\" + RMDir "$INSTDIR\plugins\" + SectionEnd + + Section un.NppNetNote + Delete "$INSTDIR\plugins\NppNetNote.dll" + Delete "$INSTDIR\plugins\Config\NppNetNote.ini" + RMDir "$INSTDIR\plugins\" + SectionEnd + + Section un.NppAutoIndent + Delete "$INSTDIR\plugins\NppAutoIndent.dll" + Delete "$INSTDIR\plugins\Config\NppAutoIndent.ini" + RMDir "$INSTDIR\plugins\" + SectionEnd + + Section un.MIMETools + Delete "$INSTDIR\plugins\NppTools.dll" + Delete "$INSTDIR\plugins\mimeTools.dll" + RMDir "$INSTDIR\plugins\" + SectionEnd + + Section un.FTP_synchronize + Delete "$INSTDIR\plugins\FTP_synchronize.dll" + Delete "$INSTDIR\plugins\Config\FTP_synchronize.ini" + Delete "$INSTDIR\plugins\doc\FTP_synchonize.ReadMe.txt" + RMDir "$INSTDIR\plugins\" + SectionEnd + + Section un.NppExport + Delete "$INSTDIR\plugins\NppExport.dll" + RMDir "$INSTDIR\plugins\" + SectionEnd + + Section un.DocMonitor + Delete "$INSTDIR\plugins\docMonitor.dll" + Delete "$INSTDIR\plugins\Config\docMonitor.ini" + RMDir "$INSTDIR\plugins\" + SectionEnd + + + + + Section un.FileBrowserLite + Delete "$INSTDIR\plugins\LightExplorer.dll" + Delete "$INSTDIR\lightExplorer.ini" + RMDir "$INSTDIR\plugins\" + SectionEnd + Section un.HexEditor + Delete "$INSTDIR\plugins\HexEditor.dll" + RMDir "$INSTDIR\plugins\" + SectionEnd + Section un.ConvertExt + Delete "$INSTDIR\plugins\ConvertExt.dll" + Delete "$APPDATA\Notepad++\ConvertExt.ini" + Delete "$APPDATA\Notepad++\ConvertExt.enc" + Delete "$APPDATA\Notepad++\ConvertExt.lng" + Delete "$INSTDIR\ConvertExt.ini" + Delete "$INSTDIR\ConvertExt.enc" + Delete "$INSTDIR\ConvertExt.lng" + RMDir "$INSTDIR\plugins\" + SectionEnd + Section un.SpellChecker + Delete "$INSTDIR\plugins\SpellChecker.dll" + RMDir "$INSTDIR\plugins\" + SectionEnd + Section un.NppExec + Delete "$INSTDIR\plugins\NppExec.dll" + Delete "$INSTDIR\plugins\doc\NppExec.txt" + Delete "$INSTDIR\plugins\doc\NppExec_TechInfo.txt" + Delete "$INSTDIR\plugins\Config\NppExec.ini" + RMDir "$INSTDIR\plugins\" + RMDir "$INSTDIR\plugins\doc\" + SectionEnd + Section un.QuickText + Delete "$INSTDIR\plugins\QuickText.dll" + Delete "$INSTDIR\QuickText.ini" + Delete "$INSTDIR\plugins\doc\quickText_README.txt" + RMDir "$INSTDIR\plugins\" + SectionEnd + Section un.ComparePlugin + Delete "$INSTDIR\plugins\ComparePlugin.dll" + RMDir "$INSTDIR\plugins\" + SectionEnd +SubSectionEnd + +Section un.htmlViewer + DeleteRegKey HKLM "SOFTWARE\Microsoft\Internet Explorer\View Source Editor" + Delete "$INSTDIR\nppIExplorerShell.exe" +SectionEnd + +Section un.AutoUpdater + Delete "$INSTDIR\updater\GUP.exe" + Delete "$INSTDIR\updater\libcurl.dll" + Delete "$INSTDIR\updater\gup.xml" + Delete "$INSTDIR\updater\License.txt" + Delete "$INSTDIR\updater\gpl.txt" + Delete "$INSTDIR\updater\readme.txt" + Delete "$INSTDIR\updater\getDownLoadUrl.php" + RMDir "$INSTDIR\updater\" +SectionEnd + +Section un.explorerContextMenu + Exec 'regsvr32 /u /s "$INSTDIR\nppcm.dll"' + Delete "$INSTDIR\nppcm.dll" +SectionEnd + +Section Uninstall + ;Remove from registry... + DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" + DeleteRegKey HKLM "SOFTWARE\${APPNAME}" + DeleteRegKey HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\notepad++.exe" + + ; Delete self + Delete "$INSTDIR\uninstall.exe" + + ; Delete Shortcuts + Delete "$SMPROGRAMS\Notepad++\Uninstall.lnk" + RMDir "$SMPROGRAMS\Notepad++" + + UserInfo::GetAccountType + Pop $1 + StrCmp $1 "Admin" 0 +2 + SetShellVarContext all + + Delete "$DESKTOP\Notepad++.lnk" + Delete "$SMPROGRAMS\Notepad++\Notepad++.lnk" + Delete "$SMPROGRAMS\Notepad++\readme.lnk" + + + ; Clean up Notepad++ + Delete "$INSTDIR\LINEDRAW.TTF" + Delete "$INSTDIR\SciLexer.dll" + Delete "$INSTDIR\change.log" + Delete "$INSTDIR\license.txt" + + Delete "$INSTDIR\notepad++.exe" + Delete "$INSTDIR\readme.txt" + + + Delete "$INSTDIR\config.xml" + Delete "$INSTDIR\config.model.xml" + Delete "$INSTDIR\langs.xml" + Delete "$INSTDIR\langs.model.xml" + Delete "$INSTDIR\stylers.xml" + Delete "$INSTDIR\stylers.model.xml" + Delete "$INSTDIR\stylers_remove.xml" + Delete "$INSTDIR\contextMenu.xml" + Delete "$INSTDIR\shortcuts.xml" + Delete "$INSTDIR\nativeLang.xml" + Delete "$INSTDIR\session.xml" + + SetShellVarContext current + Delete "$APPDATA\Notepad++\config.xml" + Delete "$APPDATA\Notepad++\stylers.xml" + Delete "$APPDATA\Notepad++\contextMenu.xml" + Delete "$APPDATA\Notepad++\shortcuts.xml" + Delete "$APPDATA\Notepad++\nativeLang.xml" + Delete "$APPDATA\Notepad++\session.xml" + Delete "$APPDATA\Notepad++\insertExt.ini" + + RMDir "$APPDATA\Notepad++" + + StrCmp $1 "Admin" 0 +2 + SetShellVarContext all + + ; Remove remaining directories + RMDir "$SMPROGRAMS\Notepad++" + RMDir "$INSTDIR\" + RMDir "$APPDATA\Notepad++" + +SectionEnd + +Function un.onInit + + !insertmacro MUI_UNGETLANGUAGE + +FunctionEnd + +BrandingText "Don HO" + +; eof diff --git a/PowerEditor/installer/packageAll.bat b/PowerEditor/installer/packageAll.bat new file mode 100644 index 00000000..f31835dc --- /dev/null +++ b/PowerEditor/installer/packageAll.bat @@ -0,0 +1,48 @@ +copy /Y ".\nativeLang\*.*" ..\bin\localization +cd ..\bin\ + +del /F /S /Q .\zipped.package.release\unicode\*.* +copy /Y license.txt .\zipped.package.release\unicode\ +copy /Y readme.txt .\zipped.package.release\unicode\ +copy /Y NppHelp.chm .\zipped.package.release\unicode\ +copy /Y change.log .\zipped.package.release\unicode\ +copy /Y config.model.xml .\zipped.package.release\unicode\ +copy /Y langs.model.xml .\zipped.package.release\unicode\ +copy /Y stylers.model.xml .\zipped.package.release\unicode\ +copy /Y contextMenu.xml .\zipped.package.release\unicode\ +copy /Y shortcuts.xml .\zipped.package.release\unicode\ +copy /Y doLocalConf.xml .\zipped.package.release\unicode\ +copy /Y LINEDRAW.TTF .\zipped.package.release\unicode\ +copy /Y "notepad++.exe" .\zipped.package.release\unicode\ +copy /Y SciLexer.dll .\zipped.package.release\unicode\ +copy /Y ".\plugins\*.*" .\zipped.package.release\unicode\plugins\ +copy /Y ".\plugins\APIs\*.xml" .\zipped.package.release\unicode\plugins\APIs +copy /Y ".\plugins\doc\*.*" .\zipped.package.release\unicode\plugins\doc +copy /Y ".\plugins\Config\tidy\*.*" .\zipped.package.release\unicode\plugins\Config\tidy +copy /Y ".\localization\*.*" .\zipped.package.release\unicode\localization + + +del /F /S /Q .\zipped.package.release\ansi\config.xml +del /F /S /Q .\zipped.package.release\ansi\langs.xml +del /F /S /Q .\zipped.package.release\ansi\stylers.xml +del /F /S /Q .\zipped.package.release\ansi\session.xml +copy /Y SciLexer.dll .\zipped.package.release\ansi\ +copy /Y license.txt .\zipped.package.release\ansi\ +copy /Y readme.txt .\zipped.package.release\ansi\ +copy /Y NppHelp.chm .\zipped.package.release\ansi\ +copy /Y change.log .\zipped.package.release\ansi\ +copy /Y config.model.xml .\zipped.package.release\ansi\ +copy /Y langs.model.xml .\zipped.package.release\ansi\ +copy /Y stylers.model.xml .\zipped.package.release\ansi\ +copy /Y contextMenu.xml .\zipped.package.release\ansi\ +copy /Y shortcuts.xml .\zipped.package.release\ansi\ +copy /Y doLocalConf.xml .\zipped.package.release\ansi\ +copy /Y LINEDRAW.TTF .\zipped.package.release\ansi\ +copy /Y ".\plugins\Config\tidy\*.*" .\zipped.package.release\ansi\plugins\Config\tidy + +"C:\Program Files\7-Zip\7z.exe" a -tzip -r npp.bin.zip .\zipped.package.release\* +"C:\Program Files\7-Zip\7z.exe" a -r npp.bin.7z .\zipped.package.release\* +"C:\Program Files\NSIS\makensis.exe" ..\installer\nppSetup.nsi + +cd ..\installer\ + diff --git a/PowerEditor/installer/stylesGlobalModel.xml b/PowerEditor/installer/stylesGlobalModel.xml new file mode 100644 index 00000000..67054406 --- /dev/null +++ b/PowerEditor/installer/stylesGlobalModel.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/PowerEditor/installer/stylesLexerModel.xml b/PowerEditor/installer/stylesLexerModel.xml new file mode 100644 index 00000000..cb4a9ce5 --- /dev/null +++ b/PowerEditor/installer/stylesLexerModel.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/PowerEditor/license.txt b/PowerEditor/license.txt new file mode 100644 index 00000000..ba835c30 --- /dev/null +++ b/PowerEditor/license.txt @@ -0,0 +1,88 @@ +GNU GENERAL PUBLIC LICENSE +Version 2, June 1991 + +Copyright (C) 1989, 1991 Free Software Foundation, Inc. +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. + +Preamble +The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification follow. + +TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. + +1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. + +2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: + + +a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. + +b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. + +c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) +These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. +Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. + +3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: + +a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + +b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, + +c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) +The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. +If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. + +4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. + +5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. + +6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. + +7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. + +This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. + +8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. + +9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. + +10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. + +NO WARRANTY + +11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + +END OF TERMS AND CONDITIONS diff --git a/PowerEditor/src/CMakeLists.txt b/PowerEditor/src/CMakeLists.txt new file mode 100644 index 00000000..02acdb45 --- /dev/null +++ b/PowerEditor/src/CMakeLists.txt @@ -0,0 +1,182 @@ +# @file:/CMakeLists.txt + +# TODO +# - Move defs XX_INCLUDE_DIR, XX_LIBRARIES, XX_LIBRARY_DIRS to the subdirector?es' +# scripts. I could not find a way to export a variables defined in a subscript +# so as a workaround, I define the variables myself in the top script. This is +# not optimal. + +# + +PROJECT(Notepad++) + +SET(projIncludDir ../../scintilla/include/ + ./ + ./ScitillaComponent/ + ./WinControls/ + ./WinControls/AboutDlg/ + ./WinControls/ColourPicker/ + ./WinControls/ContextMenu/ + ./WinControls/DockingWnd/ + ./WinControls/Grid/ + ./WinControls/ImageListSet/ + ./WinControls/OpenSaveFileDialog/ + ./WinControls/Preference/ + ./WinControls/shortcut/ + ./WinControls/SplitterContainer/ + ./WinControls/StaticDialog/ + ./WinControls/StaticDialog/RunDlg + ./WinControls/StatusBar/ + ./WinControls/TabBar/ + ./WinControls/TaskList/ + ./WinControls/ToolBar/ + ./WinControls/TrayIcon/ + ./WinControls/TreeView/ + ./WinControls/WindowsDlg/ + ./MISC/ + ./MISC/PluginsManager/ + ./MISC/RegExt/ + ./MISC/SysMsg/ + ./TinyXml/) + +set(parameters ./Parameters.h ./Parameters.cpp) + +set(scintilla ./ScitillaComponent/ScintillaEditView.h ./ScitillaComponent/ScintillaEditView.cpp) +set(buffer ./ScitillaComponent/ScintillaEditView.h ./ScitillaComponent/ScintillaEditView.cpp) + +set(tinystr ./TinyXml/tinystr.h ./TinyXml/tinystr.cpp) +set(tinyxml ./TinyXml/tinyxml.h ./TinyXml/tinyxml.cpp) +set(tinyxmlerror ./TinyXml/tinyxmlerror.cpp) +set(tinyxmlparser ./TinyXml/tinyxmlparser.cpp) +SET (tinyxmlObjs ${tinystr} ${tinyxml} ${tinyxmlerror} ${tinyxmlparser}) + +SET(objs ./winmain.cpp + ./Notepad_plus.cpp + ./Notepad_plus.h + + ./UniConversion.cpp + ./UniConversion.h + ./Utf8_16.cpp + ./Utf8_16.h + + + + ./ScitillaComponent/DocTabView.cpp + ./ScitillaComponent/DocTabView.h + ./ScitillaComponent/FindReplaceDlg.cpp + ./ScitillaComponent/FindReplaceDlg.h + ./ScitillaComponent/GoToLineDlg.cpp + ./ScitillaComponent/GoToLineDlg.h + ./ScitillaComponent/Printer.cpp + ./ScitillaComponent/Printer.h + ./ScitillaComponent/UserDefineDialog.cpp + ./ScitillaComponent/UserDefineDialog.h + ./WinControls/AboutDlg/AboutDlg.cpp + ./WinControls/AboutDlg/AboutDlg.h + ./WinControls/AboutDlg/URLCtrl.cpp + ./WinControls/AboutDlg/URLCtrl.h + ./WinControls/ColourPicker/ColourPicker.cpp + ./WinControls/ColourPicker/ColourPicker.h + ./WinControls/ColourPicker/ColourPopup.cpp + ./WinControls/ColourPicker/ColourPopup.h + #./WinControls/ColourPicker/FontPreviewCombo.cpp + ./WinControls/ColourPicker/WordStyleDlg.cpp + ./WinControls/ColourPicker/WordStyleDlg.h + ./WinControls/DockingWnd/DockingCont.cpp + ./WinControls/DockingWnd/DockingCont.h + ./WinControls/DockingWnd/DockingManager.cpp + ./WinControls/DockingWnd/DockingManager.h + ./WinControls/DockingWnd/DockingSplitter.cpp + ./WinControls/DockingWnd/DockingSplitter.h + #./WinControls/DockingWnd/DropData.cpp + ./WinControls/DockingWnd/Gripper.cpp + ./WinControls/DockingWnd/Gripper.h + ./WinControls/DockingWnd/common_func.cpp + ./WinControls/DockingWnd/common_func.h + ./WinControls/Grid/BabyGrid.cpp + ./WinControls/Grid/BabyGrid.h + ./WinControls/Grid/BabyGridWrapper.cpp + ./WinControls/Grid/BabyGridWrapper.h + ./WinControls/Grid/ShortcutMapper.cpp + ./WinControls/Grid/ShortcutMapper.h + ./WinControls/ImageListSet/ImageListSet.cpp + ./WinControls/ImageListSet/ImageListSet.h + ./WinControls/OpenSaveFileDialog/FileDialog.cpp + ./WinControls/OpenSaveFileDialog/FileDialog.h + ./WinControls/Preference/preferenceDlg.cpp + ./WinControls/Preference/preferenceDlg.h + ./WinControls/shortcut/shortcut.cpp + ./WinControls/shortcut/shortcut.h + ./WinControls/shortcut/RunMacroDlg.cpp + ./WinControls/shortcut/RunMacroDlg.h + ./WinControls/SplitterContainer/Splitter.cpp + ./WinControls/SplitterContainer/Splitter.h + ./WinControls/SplitterContainer/SplitterContainer.cpp + ./WinControls/SplitterContainer/SplitterContainer.h + ./WinControls/StaticDialog/StaticDialog.cpp + ./WinControls/StaticDialog/StaticDialog.h + ./WinControls/StaticDialog/RunDlg/RunDlg.cpp + ./WinControls/StaticDialog/RunDlg/RunDlg.h + ./WinControls/StatusBar/StatusBar.cpp + ./WinControls/StatusBar/StatusBar.h + ./WinControls/TabBar/TabBar.cpp + ./WinControls/TabBar/TabBar.h + ./WinControls/TabBar/ControlsTab.cpp + ./WinControls/TabBar/ControlsTab.h + ./WinControls/TaskList/TaskList.cpp + ./WinControls/TaskList/TaskList.h + ./WinControls/ToolBar/ToolBar.cpp + ./WinControls/ToolBar/ToolBar.h + ./WinControls/TrayIcon/trayIconControler.cpp + ./WinControls/TrayIcon/trayIconControler.h + ./WinControls/TreeView/TreeView.cpp + ./WinControls/TreeView/TreeView.h + ./WinControls/WindowsDlg/SizeableDlg.cpp + ./WinControls/WindowsDlg/SizeableDlg.h + ./WinControls/WindowsDlg/WindowsDlg.cpp + ./WinControls/WindowsDlg/WindowsDlg.h + ./WinControls/WindowsDlg/WinMgr.cpp + ./WinControls/WindowsDlg/WinMgr.h + ./WinControls/WindowsDlg/WinRect.cpp + ./MISC/PluginsManager/PluginsManager.cpp + ./MISC/PluginsManager/PluginsManager.h + ./MISC/RegExt/regExtDlg.cpp + ./MISC/RegExt/regExtDlg.h + ./MISC/SysMsg/SysMsg.cpp + ./MISC/SysMsg/SysMsg.h + ${tinyxmlObjs} + +) + + +SET(rcFiles ./Notepad_plus.rc + ./ScitillaComponent/FindReplaceDlg.rc + ./ScitillaComponent/UserDefineDialog.rc + ./WinControls/ColourPicker/ColourPopup.rc + ./WinControls/ColourPicker/WordStyleDlg.rc + ./WinControls/DockingWnd/DockingGUIWidget.rc + ./WinControls/Grid/ShortcutMapper.rc + ./WinControls/Preference/preference.rc + ./WinControls/shortcut/RunMacroDlg.rc + ./WinControls/shortcut/shortcut.rc + ./WinControls/StaticDialog/RunDlg/RunDlg.rc + ./WinControls/TaskList/TaskListDlg.rc + ./WinControls/WindowsDlg/WindowsDlg.rc + +) +SET(vendorIncludDir ../../../vendor/Gemalto/Current/SDK_IASAPI/Output/include) + +IF (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + SET(option WIN32) + SET(win32_LIBRARIES comctl32.lib shlwapi.lib shell32.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib) + #SET(defs -DUNICODE -D_UNICODE) +ENDIF (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") + +#ADD_DEFINITIONS(${defs}) + +INCLUDE_DIRECTORIES(${projIncludDir}) + +ADD_EXECUTABLE(notepad++ ${option} ${objs} ${rcFiles}) + +TARGET_LINK_LIBRARIES (notepad++ ${win32_LIBRARIES}) + diff --git a/PowerEditor/src/MISC/Common/Common.cpp b/PowerEditor/src/MISC/Common/Common.cpp new file mode 100644 index 00000000..34407a3b --- /dev/null +++ b/PowerEditor/src/MISC/Common/Common.cpp @@ -0,0 +1,377 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +//#include "Common.h" //use force include +#include +#include +#include "Common.h" + + +WcharMbcsConvertor * WcharMbcsConvertor::_pSelf = new WcharMbcsConvertor; + +void systemMessage(const TCHAR *title) +{ + LPVOID lpMsgBuf; + FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, + ::GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language + (LPTSTR) &lpMsgBuf, + 0, + NULL );// Process any inserts in lpMsgBuf. + MessageBox( NULL, (LPTSTR)lpMsgBuf, title, MB_OK | MB_ICONSTOP); + ::LocalFree(lpMsgBuf); +} + +void printInt(int int2print) +{ + TCHAR str[32]; + wsprintf(str, TEXT("%d"), int2print); + ::MessageBox(NULL, str, TEXT(""), MB_OK); +}; + +void printStr(const TCHAR *str2print) +{ + ::MessageBox(NULL, str2print, TEXT(""), MB_OK); +}; + +void writeLog(const TCHAR *logFileName, const char *log2write) +{ + FILE *f = generic_fopen(logFileName, TEXT("a+")); + fwrite(log2write, sizeof(log2write[0]), strlen(log2write), f); + fputc('\n', f); + fflush(f); + fclose(f); +} + +void folderBrowser(HWND parent, int outputCtrlID, const TCHAR *defaultStr) +{ + // This code was copied and slightly modifed from: + // http://www.bcbdev.com/faqs/faq62.htm + + // SHBrowseForFolder returns a PIDL. The memory for the PIDL is + // allocated by the shell. Eventually, we will need to free this + // memory, so we need to get a pointer to the shell malloc COM + // object that will free the PIDL later on. + LPMALLOC pShellMalloc = 0; + if (::SHGetMalloc(&pShellMalloc) == NO_ERROR) + { + // If we were able to get the shell malloc object, + // then proceed by initializing the BROWSEINFO stuct + BROWSEINFO info; + memset(&info, 0, sizeof(info)); + info.hwndOwner = parent; + info.pidlRoot = NULL; + TCHAR szDisplayName[MAX_PATH]; + info.pszDisplayName = szDisplayName; + info.lpszTitle = TEXT("Select a folder to search from"); + info.ulFlags = 0; + info.lpfn = BrowseCallbackProc; + TCHAR directory[MAX_PATH]; + ::GetDlgItemText(parent, outputCtrlID, directory, sizeof(directory)); + if (!directory[0] && defaultStr) + info.lParam = reinterpret_cast(defaultStr); + else + info.lParam = reinterpret_cast(directory); + + // Execute the browsing dialog. + LPITEMIDLIST pidl = ::SHBrowseForFolder(&info); + + // pidl will be null if they cancel the browse dialog. + // pidl will be not null when they select a folder. + if (pidl) + { + // Try to convert the pidl to a display generic_string. + // Return is true if success. + TCHAR szDir[MAX_PATH]; + if (::SHGetPathFromIDList(pidl, szDir)) + // Set edit control to the directory path. + ::SetDlgItemText(parent, outputCtrlID, szDir); + pShellMalloc->Free(pidl); + } + pShellMalloc->Release(); + } +} + +void ClientRectToScreenRect(HWND hWnd, RECT* rect) +{ + POINT pt; + + pt.x = rect->left; + pt.y = rect->top; + ::ClientToScreen( hWnd, &pt ); + rect->left = pt.x; + rect->top = pt.y; + + pt.x = rect->right; + pt.y = rect->bottom; + ::ClientToScreen( hWnd, &pt ); + rect->right = pt.x; + rect->bottom = pt.y; +}; + +std::vector tokenizeString(const std::generic_string & tokenString, const char delim) { + //Vector is created on stack and copied on return + std::vector tokens; + + // Skip delimiters at beginning. + std::string::size_type lastPos = tokenString.find_first_not_of(delim, 0); + // Find first "non-delimiter". + std::string::size_type pos = tokenString.find_first_of(delim, lastPos); + + while (pos != std::string::npos || lastPos != std::string::npos) + { + // Found a token, add it to the vector. + tokens.push_back(tokenString.substr(lastPos, pos - lastPos)); + // Skip delimiters. Note the "not_of" + lastPos = tokenString.find_first_not_of(delim, pos); + // Find next "non-delimiter" + pos = tokenString.find_first_of(delim, lastPos); + } + return tokens; +} + +void ScreenRectToClientRect(HWND hWnd, RECT* rect) +{ + POINT pt; + + pt.x = rect->left; + pt.y = rect->top; + ::ScreenToClient( hWnd, &pt ); + rect->left = pt.x; + rect->top = pt.y; + + pt.x = rect->right; + pt.y = rect->bottom; + ::ScreenToClient( hWnd, &pt ); + rect->right = pt.x; + rect->bottom = pt.y; +}; + +int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep) +{ + if (code == EXCEPTION_ACCESS_VIOLATION) + return EXCEPTION_EXECUTE_HANDLER; + + return EXCEPTION_CONTINUE_SEARCH; +} + +int getCpFromStringValue(const char * encodingStr) +{ + if (!encodingStr) + return CP_ACP; + + if (stricmp("windows-1250", encodingStr) == 0) + return 1250; + if (stricmp("windows-1251", encodingStr) == 0) + return 1251; + if (stricmp("windows-1252", encodingStr) == 0) + return 1252; + if (stricmp("windows-1253", encodingStr) == 0) + return 1253; + if (stricmp("windows-1254", encodingStr) == 0) + return 1254; + if (stricmp("windows-1255", encodingStr) == 0) + return 1255; + if (stricmp("windows-1256", encodingStr) == 0) + return 1256; + if (stricmp("windows-1257", encodingStr) == 0) + return 1257; + if (stricmp("windows-1258", encodingStr) == 0) + return 1258; + + if (stricmp("big5", encodingStr) == 0) + return 950; + if (stricmp("gb2312", encodingStr) == 0) + return 936; + if (stricmp("shift_jis", encodingStr) == 0) + return 932; + if (stricmp("euc-kr", encodingStr) == 0) + return 51949; + if (stricmp("tis-620", encodingStr) == 0) + return 874; + + if (stricmp("iso-8859-8", encodingStr) == 0) + return 28598; + + if (stricmp("utf-8", encodingStr) == 0) + return 65001; + + return CP_ACP; +} + +std::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++) + { + 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]; + } + } + cleanedName[j] = 0; + return cleanedName; +}; + +const wchar_t * WcharMbcsConvertor::char2wchar(const char * mbcs2Convert, UINT codepage) +{ + if (!_wideCharStr) + { + _wideCharStr = new wchar_t[initSize]; + _wideCharAllocLen = initSize; + } + + int len = MultiByteToWideChar(codepage, 0, mbcs2Convert, -1, _wideCharStr, 0); + if (len > 0) + { + if (len > int(_wideCharAllocLen)) + { + delete [] _wideCharStr; + _wideCharAllocLen = len; + _wideCharStr = new wchar_t[_wideCharAllocLen]; + } + MultiByteToWideChar(codepage, 0, mbcs2Convert, -1, _wideCharStr, len); + } + else + _wideCharStr[0] = 0; + + return _wideCharStr; +} + +// "mstart" and "mend" are pointers to indexes in mbcs2Convert, +// which are converted to the corresponding indexes in the returned wchar_t string. +const wchar_t * WcharMbcsConvertor::char2wchar(const char * mbcs2Convert, UINT codepage, int *mstart, int *mend) +{ + if (!_wideCharStr) + { + _wideCharStr = new wchar_t[initSize]; + _wideCharAllocLen = initSize; + } + + int len = MultiByteToWideChar(codepage, 0, mbcs2Convert, -1, _wideCharStr, 0); + if (len > 0) + { + if (len > int(_wideCharAllocLen)) + { + delete [] _wideCharStr; + _wideCharAllocLen = len; + _wideCharStr = new wchar_t[_wideCharAllocLen]; + } + MultiByteToWideChar(codepage, 0, mbcs2Convert, -1, _wideCharStr, len); + *mstart = MultiByteToWideChar(codepage, 0, mbcs2Convert, *mstart, _wideCharStr, 0); + *mend = MultiByteToWideChar(codepage, 0, mbcs2Convert, *mend, _wideCharStr, 0); + } + else + { + _wideCharStr[0] = 0; + *mstart = 0; + *mend = 0; + } + return _wideCharStr; +} + +const char * WcharMbcsConvertor::wchar2char(const wchar_t * wcharStr2Convert, UINT codepage) +{ + if (!_multiByteStr) + { + _multiByteStr = new char[initSize]; + _multiByteAllocLen = initSize; + } + + int len = WideCharToMultiByte(codepage, 0, wcharStr2Convert, -1, _multiByteStr, 0, NULL, NULL); + if (len > 0) + { + if (len > int(_multiByteAllocLen)) + { + delete [] _multiByteStr; + _multiByteAllocLen = len; + _multiByteStr = new char[_multiByteAllocLen]; + } + WideCharToMultiByte(codepage, 0, wcharStr2Convert, -1, _multiByteStr, len, NULL, NULL); + } + else + _multiByteStr[0] = 0; + + return _multiByteStr; +} + +const char * WcharMbcsConvertor::wchar2char(const wchar_t * wcharStr2Convert, UINT codepage, long *mstart, long *mend) +{ + if (!_multiByteStr) + { + _multiByteStr = new char[initSize]; + _multiByteAllocLen = initSize; + } + + int len = WideCharToMultiByte(codepage, 0, wcharStr2Convert, -1, _multiByteStr, 0, NULL, NULL); + if (len > 0) + { + if (len > int(_multiByteAllocLen)) + { + delete [] _multiByteStr; + _multiByteAllocLen = len; + _multiByteStr = new char[_multiByteAllocLen]; + } + WideCharToMultiByte(codepage, 0, wcharStr2Convert, -1, _multiByteStr, len, NULL, NULL); + *mstart = WideCharToMultiByte(codepage, 0, wcharStr2Convert, *mstart, _multiByteStr, 0, NULL, NULL); + *mend = WideCharToMultiByte(codepage, 0, wcharStr2Convert, *mend, _multiByteStr, 0, NULL, NULL); + } + else + _multiByteStr[0] = 0; + + return _multiByteStr; +} + +std::wstring string2wstring(const std::string & rString, UINT codepage) +{ + int len = MultiByteToWideChar(codepage, 0, rString.c_str(), -1, NULL, 0); + if(len > 0) + { + std::vector vw(len); + MultiByteToWideChar(codepage, 0, rString.c_str(), -1, &vw[0], len); + return &vw[0]; + } + else + return L""; +} + +std::string wstring2string(const std::wstring & rwString, UINT codepage) +{ + int len = WideCharToMultiByte(codepage, 0, rwString.c_str(), -1, NULL, 0, NULL, NULL); + if(len > 0) + { + std::vector vw(len); + WideCharToMultiByte(codepage, 0, rwString.c_str(), -1, &vw[0], len, NULL, NULL); + return &vw[0]; + } + else + return ""; +} diff --git a/PowerEditor/src/MISC/Common/Common.h b/PowerEditor/src/MISC/Common/Common.h new file mode 100644 index 00000000..3b25eb90 --- /dev/null +++ b/PowerEditor/src/MISC/Common/Common.h @@ -0,0 +1,136 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef M30_IDE_COMMUN_H +#define M30_IDE_COMMUN_H + +#include +#include +#include +#include +#include + +#ifdef UNICODE +#include +#endif + +#define CP_ANSI_LATIN_1 1252 +#define CP_BIG5 950 + +#ifdef UNICODE + #define NppMainEntry wWinMain + #define generic_strtol wcstol + #define generic_strncpy wcsncpy + #define generic_stricmp wcsicmp + #define generic_strncmp wcsncmp + #define generic_strnicmp wcsnicmp + #define generic_strncat wcsncat + #define generic_strchr wcschr + #define generic_atoi _wtoi + #define generic_itoa _itow + #define generic_atof _wtof + #define generic_strtok wcstok + #define generic_strftime wcsftime + #define generic_fprintf fwprintf + #define generic_sscanf swscanf + #define generic_fopen _wfopen + #define generic_fgets fgetws + #define generic_stat _wstat + #define generic_string wstring + #define COPYDATA_FILENAMES COPYDATA_FILENAMESW +#else + #define NppMainEntry WinMain + #define generic_strtol strtol + #define generic_strncpy strncpy + #define generic_stricmp stricmp + #define generic_strncmp strncmp + #define generic_strnicmp strnicmp + #define generic_strncat strncat + #define generic_strchr strchr + #define generic_atoi atoi + #define generic_itoa itoa + #define generic_atof atof + #define generic_strtok strtok + #define generic_strftime strftime + #define generic_fprintf fprintf + #define generic_sscanf sscanf + #define generic_fopen fopen + #define generic_fgets fgets + #define generic_stat _stat + #define generic_string string + #define COPYDATA_FILENAMES COPYDATA_FILENAMESA +#endif + +void folderBrowser(HWND parent, int outputCtrlID, const TCHAR *defaultStr = NULL); + +// Set a call back with the handle after init to set the path. +// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/callbackfunctions/browsecallbackproc.asp +static int __stdcall BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM, LPARAM pData) +{ + if (uMsg == BFFM_INITIALIZED) + ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData); + return 0; +}; + +void systemMessage(const TCHAR *title); +//DWORD ShortToLongPathName(LPCTSTR lpszShortPath, LPTSTR lpszLongPath, DWORD cchBuffer); +void printInt(int int2print); +void printStr(const TCHAR *str2print); + +void writeLog(const TCHAR *logFileName, const char *log2write); +int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep); +int getCpFromStringValue(const char * encodingStr); +std::generic_string purgeMenuItemString(const TCHAR * menuItemStr, bool keepAmpersand = false); +std::vector tokenizeString(const std::generic_string & tokenString, const char delim); + +void ClientRectToScreenRect(HWND hWnd, RECT* rect); +void ScreenRectToClientRect(HWND hWnd, RECT* rect); + +std::wstring string2wstring(const std::string & rString, UINT codepage); +std::string wstring2string(const std::wstring & rwString, UINT codepage); + +class WcharMbcsConvertor { +public: + static WcharMbcsConvertor * getInstance() {return _pSelf;}; + static void destroyInstance() {delete _pSelf;}; + + const wchar_t * char2wchar(const char* mbStr, UINT codepage); + const wchar_t * char2wchar(const char * mbcs2Convert, UINT codepage, int *mstart, int *mend); + const char * wchar2char(const wchar_t* wcStr, UINT codepage); + const char * wchar2char(const wchar_t * wcStr, UINT codepage, long *mstart, long *mend); + +protected: + WcharMbcsConvertor() : _multiByteStr(NULL), _wideCharStr(NULL), _multiByteAllocLen(0), _wideCharAllocLen(0), initSize(1024) { + }; + ~WcharMbcsConvertor() { + if (_multiByteStr) + delete [] _multiByteStr; + if (_wideCharStr) + delete [] _wideCharStr; + }; + static WcharMbcsConvertor * _pSelf; + + const int initSize; + char *_multiByteStr; + size_t _multiByteAllocLen; + wchar_t *_wideCharStr; + size_t _wideCharAllocLen; + +}; + + +#endif //M30_IDE_COMMUN_H diff --git a/PowerEditor/src/MISC/Exception/MiniDumper.cpp b/PowerEditor/src/MISC/Exception/MiniDumper.cpp new file mode 100644 index 00000000..ca6a79fb --- /dev/null +++ b/PowerEditor/src/MISC/Exception/MiniDumper.cpp @@ -0,0 +1,82 @@ +#include "MiniDumper.h" +//#include "Common.h" +#include + +LPCTSTR msgTitle = TEXT("Notepad++ crash analysis"); + +MiniDumper::MiniDumper() +{ +} + +bool MiniDumper::writeDump(EXCEPTION_POINTERS * pExceptionInfo) +{ + TCHAR szDumpPath[MAX_PATH]; + TCHAR szScratch[MAX_PATH]; + LPCTSTR szResult = NULL; + bool retval = false; + + HMODULE hDll = ::LoadLibrary( TEXT("DBGHELP.DLL") ); //that wont work on older windows version than XP, #care :) + + if (hDll) + { + MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress( hDll, "MiniDumpWriteDump" ); + if (pDump) + { + //lstrcpy(szDumpPath, TEXT("C:\\N++RECOV\\NppDump.dmp")); + ::GetModuleFileName(NULL, szDumpPath, MAX_PATH); + ::PathRemoveFileSpec(szDumpPath); + lstrcat(szDumpPath, TEXT("\\NppDump.dmp")); + + // ask the user if they want to save a dump file + int msgret = ::MessageBox(NULL, TEXT("Do you want to save a dump file?\r\nDoing so can aid in developing Notepad++."), msgTitle, MB_YESNO); + if (msgret == IDYES) + { + // create the file + HANDLE hFile = ::CreateFile( szDumpPath, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, + FILE_ATTRIBUTE_NORMAL, NULL ); + + if (hFile!=INVALID_HANDLE_VALUE) + { + _MINIDUMP_EXCEPTION_INFORMATION ExInfo; + + ExInfo.ThreadId = ::GetCurrentThreadId(); + ExInfo.ExceptionPointers = pExceptionInfo; + ExInfo.ClientPointers = NULL; + + // write the dump + BOOL bOK = pDump( GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL ); + if (bOK) + { + wsprintf( szScratch, TEXT("Saved dump file to '%s'"), szDumpPath ); + szResult = szScratch; + retval = true; + } + else + { + wsprintf( szScratch, TEXT("Failed to save dump file to '%s' (error %d)"), szDumpPath, GetLastError() ); + szResult = szScratch; + } + ::CloseHandle(hFile); + } + else + { + wsprintf( szScratch, TEXT("Failed to create dump file '%s' (error %d)"), szDumpPath, GetLastError() ); + szResult = szScratch; + } + } + } + else + { + szResult = TEXT("The debugging DLL is outdated,\r\nfind a recent copy of dbghelp.dll and install it."); + } + } + else + { + szResult = TEXT("Unable to load the debugging DLL,\r\nfind a recent copy of dbghelp.dll and install it."); + } + + if (szResult) + ::MessageBox(NULL, szResult, msgTitle, MB_OK); + + return retval; +} diff --git a/PowerEditor/src/MISC/Exception/MiniDumper.h b/PowerEditor/src/MISC/Exception/MiniDumper.h new file mode 100644 index 00000000..31b5ec30 --- /dev/null +++ b/PowerEditor/src/MISC/Exception/MiniDumper.h @@ -0,0 +1,22 @@ +//Adapted from http://www.codeproject.com/KB/debug/postmortemdebug_standalone1.aspx#_Reading_a_Minidump_with%20Visual%20Stud +//Modified for use by Npp +#ifndef MDUMP_H +#define MDUMP_H + +#include +#include "dbghelp.h" + +// based on dbghelp.h +typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType, + const PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, + const PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, + const PMINIDUMP_CALLBACK_INFORMATION CallbackParam + ); + +class MiniDumper { +public: + MiniDumper(); + bool writeDump(EXCEPTION_POINTERS * pExceptionInfo); +}; + +#endif //MDUMP_H \ No newline at end of file diff --git a/PowerEditor/src/MISC/Exception/Win32Exception.cpp b/PowerEditor/src/MISC/Exception/Win32Exception.cpp new file mode 100644 index 00000000..cb129c32 --- /dev/null +++ b/PowerEditor/src/MISC/Exception/Win32Exception.cpp @@ -0,0 +1,49 @@ +//This code was retrieved from +//http://www.thunderguy.com/semicolon/2002/08/15/visual-c-exception-handling/3/ +//(Visual C++ exception handling) +//By Bennett +//Formatting Slightly modified for N++ + +#include "Win32Exception.h" +#include "eh.h" + +Win32Exception::Win32Exception(EXCEPTION_POINTERS * info) { + _location = info->ExceptionRecord->ExceptionAddress; + _code = info->ExceptionRecord->ExceptionCode; + _info = info; + switch (_code) { + case EXCEPTION_ACCESS_VIOLATION: + _event = "Access violation"; + break; + case EXCEPTION_FLT_DIVIDE_BY_ZERO: + case EXCEPTION_INT_DIVIDE_BY_ZERO: + _event = "Division by zero"; + break; + default: + _event = "Unlisted exception"; + } +} + +void Win32Exception::installHandler() { + _set_se_translator(Win32Exception::translate); +} + +void Win32Exception::removeHandler() { + _set_se_translator(NULL); +} + +void Win32Exception::translate(unsigned code, EXCEPTION_POINTERS * info) { + // Windows guarantees that *(info->ExceptionRecord) is valid + switch (code) { + case EXCEPTION_ACCESS_VIOLATION: + throw Win32AccessViolation(info); + break; + default: + throw Win32Exception(info); + } +} + +Win32AccessViolation::Win32AccessViolation(EXCEPTION_POINTERS * info) : Win32Exception(info) { + _isWrite = info->ExceptionRecord->ExceptionInformation[0] == 1; + _badAddress = reinterpret_cast(info->ExceptionRecord->ExceptionInformation[1]); +} diff --git a/PowerEditor/src/MISC/Exception/Win32Exception.h b/PowerEditor/src/MISC/Exception/Win32Exception.h new file mode 100644 index 00000000..47dc2846 --- /dev/null +++ b/PowerEditor/src/MISC/Exception/Win32Exception.h @@ -0,0 +1,46 @@ +//This code was retrieved from +//http://www.thunderguy.com/semicolon/2002/08/15/visual-c-exception-handling/3/ +//(Visual C++ exception handling) +//By Bennett +//Formatting Slightly modified for N++ + +#include "windows.h" +#include + +typedef const void* ExceptionAddress; // OK on Win32 platform + +class Win32Exception : public std::exception +{ +public: + static void installHandler(); + static void removeHandler(); + virtual const char* what() const throw() { return _event; }; + ExceptionAddress where() const { return _location; }; + unsigned int code() const { return _code; }; + EXCEPTION_POINTERS* info() const { return _info; }; + +protected: + Win32Exception(EXCEPTION_POINTERS * info); //Constructor only accessible by exception handler + static void translate(unsigned code, EXCEPTION_POINTERS * info); + +private: + const char * _event; + ExceptionAddress _location; + unsigned int _code; + + EXCEPTION_POINTERS * _info; +}; + +class Win32AccessViolation: public Win32Exception +{ +public: + bool isWrite() const { return _isWrite; }; + ExceptionAddress badAddress() const { return _badAddress; }; +private: + Win32AccessViolation(EXCEPTION_POINTERS * info); + + bool _isWrite; + ExceptionAddress _badAddress; + + friend void Win32Exception::translate(unsigned code, EXCEPTION_POINTERS* info); +}; diff --git a/PowerEditor/src/MISC/FileNameStringSplitter.h b/PowerEditor/src/MISC/FileNameStringSplitter.h new file mode 100644 index 00000000..b787f5b7 --- /dev/null +++ b/PowerEditor/src/MISC/FileNameStringSplitter.h @@ -0,0 +1,92 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef FILENAME_STRING_SPLITTER_H +#define FILENAME_STRING_SPLITTER_H + +typedef std::vector stringVector; + +class FileNameStringSplitter +{ +public : + FileNameStringSplitter(const TCHAR *fileNameStr) { + //if (!fileNameStr) return; + TCHAR *pStr = NULL; + bool isInsideQuotes = false; + TCHAR str[MAX_PATH]; + int i = 0; + bool fini = false; + for (pStr = (TCHAR *)fileNameStr ; !fini ; ) + { + switch (*pStr) + { + case '"' : + if (isInsideQuotes) + { + str[i] = '\0'; + if (str[0]) + _fileNames.push_back(std::generic_string(str)); + i = 0; + } + isInsideQuotes = !isInsideQuotes; + pStr++; + break; + + case ' ' : + if (isInsideQuotes) + { + str[i] = *pStr; + i++; + } + else + { + str[i] = '\0'; + if (str[0]) + _fileNames.push_back(std::generic_string(str)); + i = 0; + } + pStr++; + break; + + case '\0' : + str[i] = *pStr; + if (str[0]) + _fileNames.push_back(std::generic_string(str)); + fini = true; + break; + + default : + str[i] = *pStr; + i++; pStr++; + break; + } + } + }; + + const TCHAR * getFileName(int index) const { + return _fileNames[index].c_str(); + }; + + int size() const { + return int(_fileNames.size()); + }; + +private : + stringVector _fileNames; +}; + +#endif //FILENAME_STRING_SPLITTER_H diff --git a/PowerEditor/src/MISC/PluginsManager/Notepad_plus_msgs.h b/PowerEditor/src/MISC/PluginsManager/Notepad_plus_msgs.h new file mode 100644 index 00000000..22812aae --- /dev/null +++ b/PowerEditor/src/MISC/PluginsManager/Notepad_plus_msgs.h @@ -0,0 +1,428 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef NOTEPAD_PLUS_MSGS_H +#define NOTEPAD_PLUS_MSGS_H + +//#include "menuCmdID.h" + +enum LangType {L_TXT, L_PHP , L_C, L_CPP, L_CS, L_OBJC, L_JAVA, L_RC,\ + L_HTML, L_XML, L_MAKEFILE, L_PASCAL, L_BATCH, L_INI, L_NFO, L_USER,\ + L_ASP, L_SQL, L_VB, L_JS, L_CSS, L_PERL, L_PYTHON, L_LUA,\ + L_TEX, L_FORTRAN, L_BASH, L_FLASH, L_NSIS, L_TCL, L_LISP, L_SCHEME,\ + L_ASM, L_DIFF, L_PROPS, L_PS, L_RUBY, L_SMALLTALK, L_VHDL, L_KIX, L_AU3,\ + L_CAML, L_ADA, L_VERILOG, L_MATLAB, L_HASKELL, L_INNO, L_SEARCHRESULT,\ + L_CMAKE, L_YAML,\ + // The end of enumated language type, so it should be always at the end + L_EXTERNAL}; +enum winVer{WV_UNKNOWN, WV_WIN32S, WV_95, WV_98, WV_ME, WV_NT, WV_W2K, WV_XP, WV_S2003, WV_XPX64, WV_VISTA}; + + +//#include "deprecatedSymbols.h" + +//Here you can find how to use these messages : http://notepad-plus.sourceforge.net/uk/plugins-HOWTO.php +#define NPPMSG (WM_USER + 1000) + + #define NPPM_GETCURRENTSCINTILLA (NPPMSG + 4) + #define NPPM_GETCURRENTLANGTYPE (NPPMSG + 5) + #define NPPM_SETCURRENTLANGTYPE (NPPMSG + 6) + + #define NPPM_GETNBOPENFILES (NPPMSG + 7) + #define ALL_OPEN_FILES 0 + #define PRIMARY_VIEW 1 + #define SECOND_VIEW 2 + + #define NPPM_GETOPENFILENAMES (NPPMSG + 8) + + + #define NPPM_MODELESSDIALOG (NPPMSG + 12) + #define MODELESSDIALOGADD 0 + #define MODELESSDIALOGREMOVE 1 + + #define NPPM_GETNBSESSIONFILES (NPPMSG + 13) + #define NPPM_GETSESSIONFILES (NPPMSG + 14) + #define NPPM_SAVESESSION (NPPMSG + 15) + #define NPPM_SAVECURRENTSESSION (NPPMSG + 16) + + struct sessionInfo { + TCHAR* sessionFilePathName; + int nbFile; + TCHAR** files; + }; + + #define NPPM_GETOPENFILENAMESPRIMARY (NPPMSG + 17) + #define NPPM_GETOPENFILENAMESSECOND (NPPMSG + 18) + + #define NPPM_CREATESCINTILLAHANDLE (NPPMSG + 20) + #define NPPM_DESTROYSCINTILLAHANDLE (NPPMSG + 21) + #define NPPM_GETNBUSERLANG (NPPMSG + 22) + + #define NPPM_GETCURRENTDOCINDEX (NPPMSG + 23) + #define MAIN_VIEW 0 + #define SUB_VIEW 1 + + #define NPPM_SETSTATUSBAR (NPPMSG + 24) + #define STATUSBAR_DOC_TYPE 0 + #define STATUSBAR_DOC_SIZE 1 + #define STATUSBAR_CUR_POS 2 + #define STATUSBAR_EOF_FORMAT 3 + #define STATUSBAR_UNICODE_TYPE 4 + #define STATUSBAR_TYPING_MODE 5 + + #define NPPM_GETMENUHANDLE (NPPMSG + 25) + #define NPPPLUGINMENU 0 + + #define NPPM_ENCODESCI (NPPMSG + 26) + //ascii file to unicode + //int NPPM_ENCODESCI(MAIN_VIEW/SUB_VIEW, 0) + //return new unicodeMode + + #define NPPM_DECODESCI (NPPMSG + 27) + //unicode file to ascii + //int NPPM_DECODESCI(MAIN_VIEW/SUB_VIEW, 0) + //return old unicodeMode + + #define NPPM_ACTIVATEDOC (NPPMSG + 28) + //void NPPM_ACTIVATEDOC(int view, int index2Activate) + + #define NPPM_LAUNCHFINDINFILESDLG (NPPMSG + 29) + //void NPPM_LAUNCHFINDINFILESDLG(TCHAR * dir2Search, TCHAR * filtre) + + #define NPPM_DMMSHOW (NPPMSG + 30) + #define NPPM_DMMHIDE (NPPMSG + 31) + #define NPPM_DMMUPDATEDISPINFO (NPPMSG + 32) + //void NPPM_DMMxxx(0, tTbData->hClient) + + #define NPPM_DMMREGASDCKDLG (NPPMSG + 33) + //void NPPM_DMMREGASDCKDLG(0, &tTbData) + + #define NPPM_LOADSESSION (NPPMSG + 34) + //void NPPM_LOADSESSION(0, const TCHAR* file name) + + #define NPPM_DMMVIEWOTHERTAB (NPPMSG + 35) + //void WM_DMM_VIEWOTHERTAB(0, tTbData->pszName) + + #define NPPM_RELOADFILE (NPPMSG + 36) + //BOOL NPPM_RELOADFILE(BOOL withAlert, TCHAR *filePathName2Reload) + + #define NPPM_SWITCHTOFILE (NPPMSG + 37) + //BOOL NPPM_SWITCHTOFILE(0, TCHAR *filePathName2switch) + + #define NPPM_SAVECURRENTFILE (NPPMSG + 38) + //BOOL WM_SWITCHTOFILE(0, 0) + + #define NPPM_SAVEALLFILES (NPPMSG + 39) + //BOOL NPPM_SAVEALLFILES(0, 0) + + #define NPPM_SETMENUITEMCHECK (NPPMSG + 40) + //void WM_PIMENU_CHECK(UINT funcItem[X]._cmdID, TRUE/FALSE) + + #define NPPM_ADDTOOLBARICON (NPPMSG + 41) + //void WM_ADDTOOLBARICON(UINT funcItem[X]._cmdID, toolbarIcons icon) + struct toolbarIcons { + HBITMAP hToolbarBmp; + HICON hToolbarIcon; + }; + + #define NPPM_GETWINDOWSVERSION (NPPMSG + 42) + //winVer NPPM_GETWINDOWSVERSION(0, 0) + + #define NPPM_DMMGETPLUGINHWNDBYNAME (NPPMSG + 43) + //HWND WM_DMM_GETPLUGINHWNDBYNAME(const TCHAR *windowName, const TCHAR *moduleName) + // if moduleName is NULL, then return value is NULL + // if windowName is NULL, then the first found window handle which matches with the moduleName will be returned + + #define NPPM_MAKECURRENTBUFFERDIRTY (NPPMSG + 44) + //BOOL NPPM_MAKECURRENTBUFFERDIRTY(0, 0) + + #define NPPM_GETENABLETHEMETEXTUREFUNC (NPPMSG + 45) + //BOOL NPPM_GETENABLETHEMETEXTUREFUNC(0, 0) + + #define NPPM_GETPLUGINSCONFIGDIR (NPPMSG + 46) + //void NPPM_GETPLUGINSCONFIGDIR(int strLen, TCHAR *str) + + #define NPPM_MSGTOPLUGIN (NPPMSG + 47) + //BOOL NPPM_MSGTOPLUGIN(TCHAR *destModuleName, CommunicationInfo *info) + // return value is TRUE when the message arrive to the destination plugins. + // if destModule or info is NULL, then return value is FALSE + struct CommunicationInfo { + long internalMsg; + const TCHAR * srcModuleName; + void * info; // defined by plugin + }; + + #define NPPM_MENUCOMMAND (NPPMSG + 48) + //void NPPM_MENUCOMMAND(0, int cmdID) + // uncomment //#include "menuCmdID.h" + // in the beginning of this file then use the command symbols defined in "menuCmdID.h" file + // to access all the Notepad++ menu command items + + #define NPPM_TRIGGERTABBARCONTEXTMENU (NPPMSG + 49) + //void NPPM_TRIGGERTABBARCONTEXTMENU(int view, int index2Activate) + + #define NPPM_GETNPPVERSION (NPPMSG + 50) + // int NPPM_GETNPPVERSION(0, 0) + // return version + // ex : v4.6 + // HIWORD(version) == 4 + // LOWORD(version) == 6 + + #define NPPM_HIDETABBAR (NPPMSG + 51) + // BOOL NPPM_HIDETABBAR(0, BOOL hideOrNot) + // if hideOrNot is set as TRUE then tab bar will be hidden + // otherwise it'll be shown. + // return value : the old status value + + #define NPPM_ISTABBARHIDDEN (NPPMSG + 52) + // BOOL NPPM_ISTABBARHIDDEN(0, 0) + // returned value : TRUE if tab bar is hidden, otherwise FALSE + + #define NPPM_GETPOSFROMBUFFERID (NPPMSG + 57) + // INT NPPM_GETPOSFROMBUFFERID(INT bufferID, 0) + // Return VIEW|INDEX from a buffer ID. -1 if the bufferID non existing + // + // VIEW takes 2 highest bits and INDEX (0 based) takes the rest (30 bits) + // Here's the values for the view : + // MAIN_VIEW 0 + // SUB_VIEW 1 + + #define NPPM_GETFULLPATHFROMBUFFERID (NPPMSG + 58) + // INT NPPM_GETFULLPATHFROMBUFFERID(INT bufferID, TCHAR *fullFilePath) + // Get full path file name from a bufferID. + // Return -1 if the bufferID non existing, otherwise the number of TCHAR copied/to copy + // User should call it with fullFilePath be NULL to get the number of TCHAR (not including the nul character), + // allocate fullFilePath with the return values + 1, then call it again to get full path file name + + #define NPPM_GETBUFFERIDFROMPOS (NPPMSG + 59) + //wParam: Position of document + //lParam: View to use, 0 = Main, 1 = Secondary + //Returns 0 if invalid + + #define NPPM_GETCURRENTBUFFERID (NPPMSG + 60) + //Returns active Buffer + + #define NPPM_RELOADBUFFERID (NPPMSG + 61) + //Reloads Buffer + //wParam: Buffer to reload + //lParam: 0 if no alert, else alert + + + #define NPPM_GETBUFFERLANGTYPE (NPPMSG + 64) + //wParam: BufferID to get LangType from + //lParam: 0 + //Returns as int, see LangType. -1 on error + + #define NPPM_SETBUFFERLANGTYPE (NPPMSG + 65) + //wParam: BufferID to set LangType of + //lParam: LangType + //Returns TRUE on success, FALSE otherwise + //use int, see LangType for possible values + //L_USER and L_EXTERNAL are not supported + + #define NPPM_GETBUFFERENCODING (NPPMSG + 66) + //wParam: BufferID to get encoding from + //lParam: 0 + //returns as int, see UniMode. -1 on error + + #define NPPM_SETBUFFERENCODING (NPPMSG + 67) + //wParam: BufferID to set encoding of + //lParam: format + //Returns TRUE on success, FALSE otherwise + //use int, see UniMode + //Can only be done on new, unedited files + + #define NPPM_GETBUFFERFORMAT (NPPMSG + 68) + //wParam: BufferID to get format from + //lParam: 0 + //returns as int, see formatType. -1 on error + + #define NPPM_SETBUFFERFORMAT (NPPMSG + 69) + //wParam: BufferID to set format of + //lParam: format + //Returns TRUE on success, FALSE otherwise + //use int, see formatType + +/* + #define NPPM_ADDREBAR (NPPMSG + 57) + // BOOL NPPM_ADDREBAR(0, REBARBANDINFO *) + // Returns assigned ID in wID value of struct pointer + #define NPPM_UPDATEREBAR (NPPMSG + 58) + // BOOL NPPM_ADDREBAR(INT ID, REBARBANDINFO *) + //Use ID assigned with NPPM_ADDREBAR + #define NPPM_REMOVEREBAR (NPPMSG + 59) + // BOOL NPPM_ADDREBAR(INT ID, 0) + //Use ID assigned with NPPM_ADDREBAR +*/ + #define NPPM_HIDETOOLBAR (NPPMSG + 70) + // BOOL NPPM_HIDETOOLBAR(0, BOOL hideOrNot) + // if hideOrNot is set as TRUE then tool bar will be hidden + // otherwise it'll be shown. + // return value : the old status value + + #define NPPM_ISTOOLBARHIDDEN (NPPMSG + 71) + // BOOL NPPM_ISTOOLBARHIDDEN(0, 0) + // returned value : TRUE if tool bar is hidden, otherwise FALSE + + #define NPPM_HIDEMENU (NPPMSG + 72) + // BOOL NPPM_HIDEMENU(0, BOOL hideOrNot) + // if hideOrNot is set as TRUE then menu will be hidden + // otherwise it'll be shown. + // return value : the old status value + + #define NPPM_ISMENUHIDDEN (NPPMSG + 73) + // BOOL NPPM_ISMENUHIDDEN(0, 0) + // returned value : TRUE if menu is hidden, otherwise FALSE + + #define NPPM_HIDESTATUSBAR (NPPMSG + 74) + // BOOL NPPM_HIDESTATUSBAR(0, BOOL hideOrNot) + // if hideOrNot is set as TRUE then STATUSBAR will be hidden + // otherwise it'll be shown. + // return value : the old status value + + #define NPPM_ISSTATUSBARHIDDEN (NPPMSG + 75) + // BOOL NPPM_ISSTATUSBARHIDDEN(0, 0) + // returned value : TRUE if STATUSBAR is hidden, otherwise FALSE + + #define NPPM_GETSHORTCUTBYCMDID (NPPMSG + 76) + // BOOL NPPM_GETSHORTCUTBYCMDID(int cmdID, ShortcutKey *sk) + // get your plugin command current mapped shortcut into sk via cmdID + // You may need it after getting NPPN_READY notification + // returned value : TRUE if this function call is successful and shorcut is enable, otherwise FALSE + + #define NPPM_DOOPEN (NPPMSG + 77) + // BOOL NPPM_DOOPEN(0, const TCHAR *fullPathName2Open) + // fullPathName2Open indicates the full file path name to be opened. + // The return value is TRUE (1) if the operation is successful, otherwise FALSE (0). + +#define RUNCOMMAND_USER (WM_USER + 3000) + #define NPPM_GETFULLCURRENTPATH (RUNCOMMAND_USER + FULL_CURRENT_PATH) + #define NPPM_GETCURRENTDIRECTORY (RUNCOMMAND_USER + CURRENT_DIRECTORY) + #define NPPM_GETFILENAME (RUNCOMMAND_USER + FILE_NAME) + #define NPPM_GETNAMEPART (RUNCOMMAND_USER + NAME_PART) + #define NPPM_GETEXTPART (RUNCOMMAND_USER + EXT_PART) + #define NPPM_GETCURRENTWORD (RUNCOMMAND_USER + CURRENT_WORD) + #define NPPM_GETNPPDIRECTORY (RUNCOMMAND_USER + NPP_DIRECTORY) + // BOOL NPPM_GETXXXXXXXXXXXXXXXX(size_t strLen, TCHAR *str) + // where str is the allocated TCHAR array, + // strLen is the allocated array size + // The return value is TRUE when get generic_string operation success + // Otherwise (allocated array size is too small) FALSE + + #define NPPM_GETCURRENTLINE (RUNCOMMAND_USER + CURRENT_LINE) + // INT NPPM_GETCURRENTLINE(0, 0) + // return the caret current position line + #define NPPM_GETCURRENTCOLUMN (RUNCOMMAND_USER + CURRENT_COLUMN) + // INT NPPM_GETCURRENTCOLUMN(0, 0) + // return the caret current position column + + #define VAR_NOT_RECOGNIZED 0 + #define FULL_CURRENT_PATH 1 + #define CURRENT_DIRECTORY 2 + #define FILE_NAME 3 + #define NAME_PART 4 + #define EXT_PART 5 + #define CURRENT_WORD 6 + #define NPP_DIRECTORY 7 + #define CURRENT_LINE 8 + #define CURRENT_COLUMN 9 + + +// Notification code +#define NPPN_FIRST 1000 + #define NPPN_READY (NPPN_FIRST + 1) // To notify plugins that all the procedures of launchment of notepad++ are done. + //scnNotification->nmhdr.code = NPPN_READY; + //scnNotification->nmhdr.hwndFrom = hwndNpp; + //scnNotification->nmhdr.idFrom = 0; + + #define NPPN_TBMODIFICATION (NPPN_FIRST + 2) // To notify plugins that toolbar icons can be registered + //scnNotification->nmhdr.code = NPPN_TB_MODIFICATION; + //scnNotification->nmhdr.hwndFrom = hwndNpp; + //scnNotification->nmhdr.idFrom = 0; + + #define NPPN_FILEBEFORECLOSE (NPPN_FIRST + 3) // To notify plugins that the current file is about to be closed + //scnNotification->nmhdr.code = NPPN_FILEBEFORECLOSE; + //scnNotification->nmhdr.hwndFrom = hwndNpp; + //scnNotification->nmhdr.idFrom = BufferID; + + #define NPPN_FILEOPENED (NPPN_FIRST + 4) // To notify plugins that the current file is just opened + //scnNotification->nmhdr.code = NPPN_FILEOPENED; + //scnNotification->nmhdr.hwndFrom = hwndNpp; + //scnNotification->nmhdr.idFrom = BufferID; + + #define NPPN_FILECLOSED (NPPN_FIRST + 5) // To notify plugins that the current file is just closed + //scnNotification->nmhdr.code = NPPN_FILECLOSED; + //scnNotification->nmhdr.hwndFrom = hwndNpp; + //scnNotification->nmhdr.idFrom = BufferID; + + #define NPPN_FILEBEFOREOPEN (NPPN_FIRST + 6) // To notify plugins that the current file is about to be opened + //scnNotification->nmhdr.code = NPPN_FILEBEFOREOPEN; + //scnNotification->nmhdr.hwndFrom = hwndNpp; + //scnNotification->nmhdr.idFrom = BufferID; + + #define NPPN_FILEBEFORESAVE (NPPN_FIRST + 7) // To notify plugins that the current file is about to be saved + //scnNotification->nmhdr.code = NPPN_FILEBEFOREOPEN; + //scnNotification->nmhdr.hwndFrom = hwndNpp; + //scnNotification->nmhdr.idFrom = BufferID; + + #define NPPN_FILESAVED (NPPN_FIRST + 8) // To notify plugins that the current file is just saved + //scnNotification->nmhdr.code = NPPN_FILECLOSED; + //scnNotification->nmhdr.hwndFrom = hwndNpp; + //scnNotification->nmhdr.idFrom = BufferID; + + #define NPPN_SHUTDOWN (NPPN_FIRST + 9) // To notify plugins that Notepad++ is about to be shutdowned. + //scnNotification->nmhdr.code = NPPN_SHUTDOWN; + //scnNotification->nmhdr.hwndFrom = hwndNpp; + //scnNotification->nmhdr.idFrom = 0; + + #define NPPN_BUFFERACTIVATED (NPPN_FIRST + 10) // To notify plugins that a buffer was activated (put to foreground). + //scnNotification->nmhdr.code = NPPN_BUFFERACTIVATED; + //scnNotification->nmhdr.hwndFrom = hwndNpp; + //scnNotification->nmhdr.idFrom = activatedBufferID; + + #define NPPN_LANGCHANGED (NPPN_FIRST + 11) // To notify plugins that the language in the current doc is just changed. + //scnNotification->nmhdr.code = NPPN_LANGCHANGED; + //scnNotification->nmhdr.hwndFrom = hwndNpp; + //scnNotification->nmhdr.idFrom = currentBufferID; + + #define NPPN_WORDSTYLESUPDATED (NPPN_FIRST + 12) // To notify plugins that user initiated a WordStyleDlg change. + //scnNotification->nmhdr.code = NPPN_WORDSTYLESUPDATED; + //scnNotification->nmhdr.hwndFrom = hwndNpp; + //scnNotification->nmhdr.idFrom = currentBufferID; + + #define NPPN_SHORTCUTREMAPPED (NPPN_FIRST + 13) // To notify plugins that plugin command shortcut is remapped. + //scnNotification->nmhdr.code = NPPN_SHORTCUTSREMAPPED; + //scnNotification->nmhdr.hwndFrom = ShortcutKeyStructurePointer; + //scnNotification->nmhdr.idFrom = cmdID; + //where ShortcutKeyStructurePointer is pointer of struct ShortcutKey: + //struct ShortcutKey { + // bool _isCtrl; + // bool _isAlt; + // bool _isShift; + // UCHAR _key; + //}; + + #define NPPN_FILEBEFORELOAD (NPPN_FIRST + 14) // To notify plugins that the current file is about to be loaded + //scnNotification->nmhdr.code = NPPN_FILEBEFOREOPEN; + //scnNotification->nmhdr.hwndFrom = hwndNpp; + //scnNotification->nmhdr.idFrom = NULL; + + #define NPPN_FILELOADFAILED (NPPN_FIRST + 15) // To notify plugins that file open operation failed + //scnNotification->nmhdr.code = NPPN_FILEOPENFAILED; + //scnNotification->nmhdr.hwndFrom = hwndNpp; + //scnNotification->nmhdr.idFrom = BufferID; + +#endif //NOTEPAD_PLUS_MSGS_H diff --git a/PowerEditor/src/MISC/PluginsManager/PluginInterface.h b/PowerEditor/src/MISC/PluginsManager/PluginInterface.h new file mode 100644 index 00000000..ddc5bd08 --- /dev/null +++ b/PowerEditor/src/MISC/PluginsManager/PluginInterface.h @@ -0,0 +1,69 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef PLUGININTERFACE_H +#define PLUGININTERFACE_H + +#include +#include "Scintilla.h" +#include "Notepad_plus_msgs.h" + +const int nbChar = 64; + +typedef const TCHAR * (__cdecl * PFUNCGETNAME)(); + +struct NppData { + HWND _nppHandle; + HWND _scintillaMainHandle; + HWND _scintillaSecondHandle; +}; + +typedef void (__cdecl * PFUNCSETINFO)(NppData); +typedef void (__cdecl * PFUNCPLUGINCMD)(); +typedef void (__cdecl * PBENOTIFIED)(SCNotification *); +typedef LRESULT (__cdecl * PMESSAGEPROC)(UINT Message, WPARAM wParam, LPARAM lParam); + + +struct ShortcutKey { + bool _isCtrl; + bool _isAlt; + bool _isShift; + UCHAR _key; +}; + +struct FuncItem { + TCHAR _itemName[nbChar]; + PFUNCPLUGINCMD _pFunc; + int _cmdID; + bool _init2Check; + ShortcutKey *_pShKey; +}; + +typedef FuncItem * (__cdecl * PFUNCGETFUNCSARRAY)(int *); + +// You should implement (or define an empty function body) those functions which are called by Notepad++ plugin manager +extern "C" __declspec(dllexport) void setInfo(NppData); +extern "C" __declspec(dllexport) const TCHAR * getName(); +extern "C" __declspec(dllexport) FuncItem * getFuncsArray(int *); +extern "C" __declspec(dllexport) void beNotified(SCNotification *); +extern "C" __declspec(dllexport) LRESULT messageProc(UINT Message, WPARAM wParam, LPARAM lParam); + +#ifdef UNICODE +extern "C" __declspec(dllexport) BOOL isUnicode(); +#endif //UNICODE + +#endif //PLUGININTERFACE_H diff --git a/PowerEditor/src/MISC/PluginsManager/PluginsManager.cpp b/PowerEditor/src/MISC/PluginsManager/PluginsManager.cpp new file mode 100644 index 00000000..f70bdb18 --- /dev/null +++ b/PowerEditor/src/MISC/PluginsManager/PluginsManager.cpp @@ -0,0 +1,301 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include +#include "PluginsManager.h" + +const TCHAR * USERMSG = TEXT("This plugin is not compatible with current version of Notepad++.\n\n\ +Do you want to remove this plugin from plugins directory to prevent this message from the next launch time?"); + +bool PluginsManager::loadPlugins(const TCHAR *dir) +{ + if (_isDisabled) + return false; + + vector dllNames; + vector dll2Remove; + const TCHAR *pNppPath = (NppParameters::getInstance())->getNppPath(); + + generic_string pluginsFullPathFilter = (dir && dir[0])?dir:pNppPath; + + pluginsFullPathFilter += TEXT("\\plugins\\*.dll"); + + WIN32_FIND_DATA foundData; + HANDLE hFindFile = ::FindFirstFile(pluginsFullPathFilter.c_str(), &foundData); + if (hFindFile != INVALID_HANDLE_VALUE) + { + generic_string plugins1stFullPath = (dir && dir[0])?dir:pNppPath; + plugins1stFullPath += TEXT("\\plugins\\"); + plugins1stFullPath += foundData.cFileName; + dllNames.push_back(plugins1stFullPath); + + while (::FindNextFile(hFindFile, &foundData)) + { + generic_string fullPath = (dir && dir[0])?dir:pNppPath; + fullPath += TEXT("\\plugins\\"); + fullPath += foundData.cFileName; + dllNames.push_back(fullPath); + } + ::FindClose(hFindFile); + + size_t i = 0; + + for ( ; i < dllNames.size() ; i++) + { + PluginInfo *pi = new PluginInfo; + try { + TCHAR tmpStr[MAX_PATH]; + lstrcpy(tmpStr, dllNames[i].c_str()); + lstrcpy(pi->_moduleName, PathFindFileName(tmpStr)); + + pi->_hLib = ::LoadLibrary(dllNames[i].c_str()); + if (!pi->_hLib) + throw generic_string(TEXT("Load Library is failed.\nMake \"Runtime Library\" setting of this project as \"Multi-threaded(/MT)\" may cure this problem.")); + + pi->_pFuncIsUnicode = (PFUNCISUNICODE)GetProcAddress(pi->_hLib, "isUnicode"); +#ifdef UNICODE + if (!pi->_pFuncIsUnicode || !pi->_pFuncIsUnicode()) + throw generic_string(TEXT("This ANSI plugin is not compatible with your Unicode Notepad++.")); +#else + if (pi->_pFuncIsUnicode) + throw generic_string(TEXT("This Unicode plugin is not compatible with your ANSI mode Notepad++.")); +#endif + + pi->_pFuncSetInfo = (PFUNCSETINFO)GetProcAddress(pi->_hLib, "setInfo"); + + if (!pi->_pFuncSetInfo) + throw generic_string(TEXT("Missing \"setInfo\" function")); + + pi->_pFuncGetName = (PFUNCGETNAME)GetProcAddress(pi->_hLib, "getName"); + if (!pi->_pFuncGetName) + throw generic_string(TEXT("Missing \"getName\" function")); + + pi->_pBeNotified = (PBENOTIFIED)GetProcAddress(pi->_hLib, "beNotified"); + if (!pi->_pBeNotified) + throw generic_string(TEXT("Missing \"beNotified\" function")); + + pi->_pMessageProc = (PMESSAGEPROC)GetProcAddress(pi->_hLib, "messageProc"); + if (!pi->_pMessageProc) + throw generic_string(TEXT("Missing \"messageProc\" function")); + + pi->_pFuncSetInfo(_nppData); + + pi->_pFuncGetFuncsArray = (PFUNCGETFUNCSARRAY)GetProcAddress(pi->_hLib, "getFuncsArray"); + if (!pi->_pFuncGetFuncsArray) + throw generic_string(TEXT("Missing \"getFuncsArray\" function")); + + pi->_funcItems = pi->_pFuncGetFuncsArray(&pi->_nbFuncItem); + + if ((!pi->_funcItems) || (pi->_nbFuncItem <= 0)) + throw generic_string(TEXT("Missing \"FuncItems\" array, or the nb of Function Item is not set correctly")); + + pi->_pluginMenu = ::CreateMenu(); + + GetLexerCountFn GetLexerCount = (GetLexerCountFn)::GetProcAddress(pi->_hLib, "GetLexerCount"); + // it's a lexer plugin + if (GetLexerCount) + { + GetLexerNameFn GetLexerName = (GetLexerNameFn)::GetProcAddress(pi->_hLib, "GetLexerName"); + if (!GetLexerName) + throw generic_string(TEXT("Loading GetLexerName function failed.")); + + GetLexerStatusTextFn GetLexerStatusText = (GetLexerStatusTextFn)::GetProcAddress(pi->_hLib, "GetLexerStatusText"); + + if (!GetLexerStatusText) + throw generic_string(TEXT("Loading GetLexerStatusText function failed.")); + + // Assign a buffer for the lexer name. + char lexName[MAX_EXTERNAL_LEXER_NAME_LEN]; + lexName[0] = '\0'; + TCHAR lexDesc[MAX_EXTERNAL_LEXER_DESC_LEN]; + lstrcpy(lexDesc, TEXT("")); + + int numLexers = GetLexerCount(); + + NppParameters * nppParams = NppParameters::getInstance(); + + ExternalLangContainer *containers[30]; +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); +#endif + for (int x = 0; x < numLexers; x++) + { + GetLexerName(x, lexName, MAX_EXTERNAL_LEXER_NAME_LEN); + GetLexerStatusText(x, lexDesc, MAX_EXTERNAL_LEXER_DESC_LEN); +#ifdef UNICODE + const TCHAR *pLexerName = wmc->char2wchar(lexName, CP_ACP); +#else + const TCHAR *pLexerName = lexName; +#endif + if (!nppParams->isExistingExternalLangName(pLexerName) && nppParams->ExternalLangHasRoom()) + containers[x] = new ExternalLangContainer(pLexerName, lexDesc); + else + containers[x] = NULL; + } + + TCHAR xmlPath[MAX_PATH]; + lstrcpy(xmlPath, nppParams->getNppPath()); + PathAppend(xmlPath, TEXT("plugins\\Config")); + PathAppend(xmlPath, pi->_moduleName); + PathRemoveExtension(xmlPath); + PathAddExtension(xmlPath, TEXT(".xml")); + + if (!PathFileExists(xmlPath)) + { + lstrcpyn( xmlPath, TEXT("\0"), MAX_PATH ); + lstrcpy( xmlPath, nppParams->getAppDataNppDir() ); + PathAppend(xmlPath, TEXT("plugins\\Config")); + PathAppend( xmlPath, pi->_moduleName ); + PathRemoveExtension( xmlPath ); + PathAddExtension( xmlPath, TEXT(".xml") ); + + if (! PathFileExists( xmlPath ) ) + { + throw generic_string(generic_string(xmlPath) + TEXT(" is missing.")); + } + } + + TiXmlDocument *_pXmlDoc = new TiXmlDocument(xmlPath); + + if (!_pXmlDoc->LoadFile()) + { + delete _pXmlDoc; + _pXmlDoc = NULL; + throw generic_string(generic_string(xmlPath) + TEXT(" failed to load.")); + } + + for (int x = 0; x < numLexers; x++) // postpone adding in case the xml is missing/corrupt + if (containers[x] != NULL) + nppParams->addExternalLangToEnd(containers[x]); + + nppParams->getExternalLexerFromXmlTree(_pXmlDoc); + nppParams->getExternalLexerDoc()->push_back(_pXmlDoc); +#ifdef UNICODE + const char *pDllName = wmc->wchar2char(dllNames[i].c_str(), CP_ACP); +#else + const char *pDllName = dllNames[i].c_str(); +#endif + ::SendMessage(_nppData._scintillaMainHandle, SCI_LOADLEXERLIBRARY, 0, (LPARAM)pDllName); + } + _pluginInfos.push_back(pi); + } + catch(generic_string s) + { + s += TEXT("\n\n"); + s += USERMSG; + if (::MessageBox(NULL, s.c_str(), dllNames[i].c_str(), MB_YESNO) == IDYES) + { + dll2Remove.push_back(dllNames[i]); + } + delete pi; + } + catch(...) + { + generic_string msg = TEXT("Fail loaded"); + msg += TEXT("\n\n"); + msg += USERMSG; + if (::MessageBox(NULL, msg.c_str(), dllNames[i].c_str(), MB_YESNO) == IDYES) + { + dll2Remove.push_back(dllNames[i]); + } + delete pi; + } + } + } + + for (size_t j = 0 ; j < dll2Remove.size() ; j++) + ::DeleteFile(dll2Remove[j].c_str()); + + return true; +} + +// return true if cmdID found and its shortcut is enable +// false otherwise +bool PluginsManager::getShortcutByCmdID(int cmdID, ShortcutKey *sk) +{ + if (cmdID == 0 || !sk) + return false; + + const vector & pluginCmdSCList = (NppParameters::getInstance())->getPluginCommandList(); + + for (size_t i = 0 ; i < pluginCmdSCList.size() ; i++) + { + if (pluginCmdSCList[i].getID() == cmdID) + { + const KeyCombo & kc = pluginCmdSCList[i].getKeyCombo(); + if (kc._key == 0x00) + return false; + + sk->_isAlt = kc._isAlt; + sk->_isCtrl = kc._isCtrl; + sk->_isShift = kc._isShift; + sk->_key = kc._key; + return true; + } + } + return false; +} + +void PluginsManager::setMenu(HMENU hMenu, const TCHAR *menuName) +{ + if (hasPlugins()) + { + vector & pluginCmdSCList = (NppParameters::getInstance())->getPluginCommandList(); + const TCHAR *nom_menu = (menuName && menuName[0])?menuName:TEXT("Plugins"); + + _hPluginsMenu = ::CreateMenu(); + ::InsertMenu(hMenu, 9, MF_BYPOSITION | MF_POPUP, (UINT_PTR)_hPluginsMenu, nom_menu); + + for (size_t i = 0 ; i < _pluginInfos.size() ; i++) + { + ::InsertMenu(_hPluginsMenu, i, MF_BYPOSITION | MF_POPUP, (UINT_PTR)_pluginInfos[i]->_pluginMenu, _pluginInfos[i]->_pFuncGetName()); + + for (int j = 0 ; j < _pluginInfos[i]->_nbFuncItem ; j++) + { + if (_pluginInfos[i]->_funcItems[j]._pFunc == NULL) + { + ::InsertMenu(_pluginInfos[i]->_pluginMenu, j, MF_BYPOSITION | MF_SEPARATOR, 0, TEXT("")); + continue; + } + + _pluginsCommands.push_back(PluginCommand(_pluginInfos[i]->_moduleName, j, _pluginInfos[i]->_funcItems[j]._pFunc)); + + int cmdID = ID_PLUGINS_CMD + (_pluginsCommands.size() - 1); + _pluginInfos[i]->_funcItems[j]._cmdID = cmdID; + generic_string itemName = _pluginInfos[i]->_funcItems[j]._itemName; + + if (_pluginInfos[i]->_funcItems[j]._pShKey) + { + ShortcutKey & sKey = *(_pluginInfos[i]->_funcItems[j]._pShKey); + PluginCmdShortcut pcs(Shortcut(itemName.c_str(), sKey._isCtrl, sKey._isAlt, sKey._isShift, sKey._key), cmdID, _pluginInfos[i]->_moduleName, j); + pluginCmdSCList.push_back(pcs); + itemName += TEXT("\t"); + itemName += pcs.toString(); + } + else + { //no ShortcutKey is provided, add an disabled shortcut (so it can still be mapped, Paramaters class can still index any changes and the toolbar wont funk out + PluginCmdShortcut pcs(Shortcut(itemName.c_str(), false, false, false, 0x00), cmdID, _pluginInfos[i]->_moduleName, j); //VK_NULL and everything disabled, the menu name is left alone + pluginCmdSCList.push_back(pcs); + } + ::InsertMenu(_pluginInfos[i]->_pluginMenu, j, MF_BYPOSITION, cmdID, itemName.c_str()); + + if (_pluginInfos[i]->_funcItems[j]._init2Check) + ::CheckMenuItem(_hPluginsMenu, cmdID, MF_BYCOMMAND | MF_CHECKED); + } + } + } +} diff --git a/PowerEditor/src/MISC/PluginsManager/PluginsManager.h b/PowerEditor/src/MISC/PluginsManager/PluginsManager.h new file mode 100644 index 00000000..66770e09 --- /dev/null +++ b/PowerEditor/src/MISC/PluginsManager/PluginsManager.h @@ -0,0 +1,155 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef PLUGINSMANAGER_H +#define PLUGINSMANAGER_H + +#include "resource.h" +#include "Parameters.h" +#include "PluginInterface.h" + +typedef BOOL (__cdecl * PFUNCISUNICODE)(); + +struct PluginCommand { + TCHAR _pluginName[64]; + int _funcID; + PFUNCPLUGINCMD _pFunc; + PluginCommand(const TCHAR *pluginName, int funcID, PFUNCPLUGINCMD pFunc): _funcID(funcID), _pFunc(pFunc){ + lstrcpy(_pluginName, pluginName); + }; +}; + +struct PluginInfo { + PluginInfo() :_hLib(NULL), _pluginMenu(NULL), _pFuncSetInfo(NULL),\ + _pFuncGetFuncsArray(NULL), _pFuncGetName(NULL), _funcItems(NULL),\ + _nbFuncItem(0){}; + ~PluginInfo(){ + if (_pluginMenu) + ::DestroyMenu(_pluginMenu); + + if (_hLib) + ::FreeLibrary(_hLib); + }; + + HINSTANCE _hLib; + HMENU _pluginMenu; + + PFUNCSETINFO _pFuncSetInfo; + PFUNCGETNAME _pFuncGetName; + PBENOTIFIED _pBeNotified; + PFUNCGETFUNCSARRAY _pFuncGetFuncsArray; + PMESSAGEPROC _pMessageProc; + PFUNCISUNICODE _pFuncIsUnicode; + + FuncItem *_funcItems; + int _nbFuncItem; + TCHAR _moduleName[64]; +}; + +class PluginsManager { +public: + PluginsManager() : _hPluginsMenu(NULL), _isDisabled(false) {}; + ~PluginsManager() { + + for (size_t i = 0 ; i < _pluginInfos.size() ; i++) + delete _pluginInfos[i]; + + if (_hPluginsMenu) + DestroyMenu(_hPluginsMenu); + }; + void init(const NppData & nppData) { + _nppData = nppData; + }; + bool loadPlugins(const TCHAR *dir = NULL); + + void runPluginCommand(size_t i) { + if (i < _pluginsCommands.size()) + if (_pluginsCommands[i]._pFunc != NULL) + _pluginsCommands[i]._pFunc(); + }; + + void runPluginCommand(const TCHAR *pluginName, int commandID) { + for (size_t i = 0 ; i < _pluginsCommands.size() ; i++) + { + if (!generic_stricmp(_pluginsCommands[i]._pluginName, pluginName)) + { + if (_pluginsCommands[i]._funcID == commandID) + _pluginsCommands[i]._pFunc(); + } + } + }; + + void setMenu(HMENU hMenu, const TCHAR *menuName); + bool getShortcutByCmdID(int cmdID, ShortcutKey *sk); + + void notify(SCNotification *notification) { + for (size_t i = 0 ; i < _pluginInfos.size() ; i++) + { + // To avoid the plugin change the data in SCNotification + // Each notification to pass to a plugin is a copy of SCNotification instance + SCNotification scNotif = *notification; + _pluginInfos[i]->_pBeNotified(&scNotif); + } + }; + + void relayNppMessages(UINT Message, WPARAM wParam, LPARAM lParam) { + for (size_t i = 0 ; i < _pluginInfos.size() ; i++) + { + _pluginInfos[i]->_pMessageProc(Message, wParam, lParam); + } + }; + + bool relayPluginMessages(UINT Message, WPARAM wParam, LPARAM lParam) { + const TCHAR * moduleName = (const TCHAR *)wParam; + if (!moduleName || !moduleName[0] || !lParam) + return false; + + for (size_t i = 0 ; i < _pluginInfos.size() ; i++) + { + if (generic_stricmp(_pluginInfos[i]->_moduleName, moduleName) == 0) + { + _pluginInfos[i]->_pMessageProc(Message, wParam, lParam); + return true; + } + } + return false; + }; + + HMENU getMenuHandle() { + return _hPluginsMenu; + }; + + void disable() {_isDisabled = true;}; + bool hasPlugins(){return (_pluginInfos.size()!= 0);}; + +private: + NppData _nppData; + HMENU _hPluginsMenu; + + vector _pluginInfos; + vector _pluginsCommands; + bool _isDisabled; +}; + +#define EXT_LEXER_DECL __stdcall + +// External Lexer function definitions... +typedef int (EXT_LEXER_DECL *GetLexerCountFn)(); +typedef void (EXT_LEXER_DECL *GetLexerNameFn)(unsigned int Index, char *name, int buflength); +typedef void (EXT_LEXER_DECL *GetLexerStatusTextFn)(unsigned int Index, TCHAR *desc, int buflength); + +#endif //PLUGINSMANAGER_H diff --git a/PowerEditor/src/MISC/PluginsManager/deprecatedSymbols.h b/PowerEditor/src/MISC/PluginsManager/deprecatedSymbols.h new file mode 100644 index 00000000..7fe8dc71 --- /dev/null +++ b/PowerEditor/src/MISC/PluginsManager/deprecatedSymbols.h @@ -0,0 +1,68 @@ +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +// +#define NOTEPADPLUS_USER (WM_USER + 1000) + +#define WM_GETCURRENTSCINTILLA (NOTEPADPLUS_USER + 4) +#define WM_GETCURRENTLANGTYPE (NOTEPADPLUS_USER + 5) +#define WM_SETCURRENTLANGTYPE (NOTEPADPLUS_USER + 6) +#define WM_NBOPENFILES (NOTEPADPLUS_USER + 7) +#define WM_GETOPENFILENAMES (NOTEPADPLUS_USER + 8) + +#define WM_MODELESSDIALOG (NOTEPADPLUS_USER + 12) +#define WM_NBSESSIONFILES (NOTEPADPLUS_USER + 13) +#define WM_GETSESSIONFILES (NOTEPADPLUS_USER + 14) +#define WM_SAVESESSION (NOTEPADPLUS_USER + 15) +#define WM_SAVECURRENTSESSION (NOTEPADPLUS_USER + 16) +#define WM_GETOPENFILENAMES_PRIMARY (NOTEPADPLUS_USER + 17) +#define WM_GETOPENFILENAMES_SECOND (NOTEPADPLUS_USER + 18) + +#define WM_CREATESCINTILLAHANDLE (NOTEPADPLUS_USER + 20) +#define WM_DESTROYSCINTILLAHANDLE (NOTEPADPLUS_USER + 21) +#define WM_GETNBUSERLANG (NOTEPADPLUS_USER + 22) +#define WM_GETCURRENTDOCINDEX (NOTEPADPLUS_USER + 23) +#define WM_SETSTATUSBAR (NOTEPADPLUS_USER + 24) +#define WM_GETMENUHANDLE (NOTEPADPLUS_USER + 25) +#define WM_ENCODE_SCI (NOTEPADPLUS_USER + 26) +#define WM_DECODE_SCI (NOTEPADPLUS_USER + 27) +#define WM_ACTIVATE_DOC (NOTEPADPLUS_USER + 28) +#define WM_LAUNCH_FINDINFILESDLG (NOTEPADPLUS_USER + 29) +#define WM_DMM_SHOW (NOTEPADPLUS_USER + 30) +#define WM_DMM_HIDE (NOTEPADPLUS_USER + 31) +#define WM_DMM_UPDATEDISPINFO (NOTEPADPLUS_USER + 32) +#define WM_DMM_REGASDCKDLG (NOTEPADPLUS_USER + 33) +#define WM_LOADSESSION (NOTEPADPLUS_USER + 34) +#define WM_DMM_VIEWOTHERTAB (NOTEPADPLUS_USER + 35) +#define WM_RELOADFILE (NOTEPADPLUS_USER + 36) +#define WM_SWITCHTOFILE (NOTEPADPLUS_USER + 37) +#define WM_SAVECURRENTFILE (NOTEPADPLUS_USER + 38) +#define WM_SAVEALLFILES (NOTEPADPLUS_USER + 39) +#define WM_PIMENU_CHECK (NOTEPADPLUS_USER + 40) +#define WM_ADDTOOLBARICON (NOTEPADPLUS_USER + 41) +#define WM_GETWINDOWSVERSION (NOTEPADPLUS_USER + 42) +#define WM_DMM_GETPLUGINHWNDBYNAME (NOTEPADPLUS_USER + 43) + + + +#define RUNCOMMAND_USER_ (WM_USER + 3000) + +#define WM_GET_FULLCURRENTPATH (RUNCOMMAND_USER_ + FULL_CURRENT_PATH) +#define WM_GET_CURRENTDIRECTORY (RUNCOMMAND_USER_ + CURRENT_DIRECTORY) +#define WM_GET_FILENAME (RUNCOMMAND_USER_ + FILE_NAME) +#define WM_GET_NAMEPART (RUNCOMMAND_USER_ + NAME_PART) +#define WM_GET_EXTPART (RUNCOMMAND_USER_ + EXT_PART) +#define WM_GET_CURRENTWORD (RUNCOMMAND_USER_ + CURRENT_WORD) +#define WM_GET_NPPDIRECTORY (RUNCOMMAND_USER_ + NPP_DIRECTORY) diff --git a/PowerEditor/src/MISC/Process/Process.cpp b/PowerEditor/src/MISC/Process/Process.cpp new file mode 100644 index 00000000..5b13582f --- /dev/null +++ b/PowerEditor/src/MISC/Process/Process.cpp @@ -0,0 +1,301 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "process.h" + +BOOL Process::run() +{ + BOOL result = TRUE; + + // stdout & stderr pipes for process to write + HANDLE hPipeOutW = NULL; + HANDLE hPipeErrW = NULL; + + HANDLE hListenerStdOutThread = NULL; + HANDLE hListenerStdErrThread = NULL; + + HANDLE hWaitForProcessEndThread = NULL; + + HANDLE hListenerEvent[2]; + hListenerEvent[0] = NULL; + hListenerEvent[1] = NULL; + + SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE }; // inheritable handle + + try { + // Create stdout pipe + if (!::CreatePipe(&_hPipeOutR, &hPipeOutW, &sa, 0)) + error(TEXT("CreatePipe"), result, 1000); + + // Create stderr pipe + if (!::CreatePipe(&_hPipeErrR, &hPipeErrW, &sa, 0)) + error(TEXT("CreatePipe"), result, 1001); + + STARTUPINFO startup; + PROCESS_INFORMATION procinfo; + ::ZeroMemory(&startup, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; + startup.wShowWindow = (_type == WIN32_PROG)?SW_SHOW:SW_HIDE; // hidden console window + startup.hStdInput = NULL; // not used + startup.hStdOutput = hPipeOutW; + startup.hStdError = hPipeErrW; + + generic_string cmd = TEXT("\""); + cmd += _command; + cmd += TEXT("\""); + + if (_args[0]) + { + cmd += TEXT(" "); + cmd += _args; + } + BOOL started = ::CreateProcess(NULL, // command is part of input generic_string + (TCHAR *)cmd.c_str(), // (writeable) command generic_string + NULL, // process security + NULL, // thread security + TRUE, // inherit handles flag + (_type == WIN32_PROG)?NULL:CREATE_SUSPENDED, // flags + NULL, // inherit environment + _curDir, // inherit directory + &startup, // STARTUPINFO + &procinfo); // PROCESS_INFORMATION + + _hProcess = procinfo.hProcess; + _hProcessThread = procinfo.hThread; + + if(!started) + error(TEXT("CreateProcess"), result, 1002); + + if (_type == CONSOLE_PROG) + { + hListenerEvent[0] = ::CreateEvent(NULL, FALSE, FALSE, TEXT("listenerEvent")); + if(!hListenerEvent[0]) + error(TEXT("CreateEvent"), result, 1003); + + hListenerEvent[1] = ::CreateEvent(NULL, FALSE, FALSE, TEXT("listenerStdErrEvent")); + if(!hListenerEvent[1]) + error(TEXT("CreateEvent"), result, 1004); + + + // The process is running so we set this to FALSE + _bProcessEnd = FALSE; + + hWaitForProcessEndThread = ::CreateThread(NULL, 0, staticWaitForProcessEnd, this, 0, NULL); + if (!hWaitForProcessEndThread) + error(TEXT("CreateThread"), result, 1005); + + hListenerStdOutThread = ::CreateThread(NULL, 0, staticListenerStdOut, this, 0, NULL); + if (!hListenerStdOutThread) + error(TEXT("CreateThread"), result, 1006); + + hListenerStdErrThread = ::CreateThread(NULL, 0, staticListenerStdErr, this, 0, NULL); + if (!hListenerStdErrThread) + error(TEXT("CreateThread"), result, 1007); + + // We wait until the process is over + // TO DO: This should be a bit secured in case something happen and the + // _bProcessEnd variable never gets set to TRUE... (by checking process + // state as well for instance to see if it is still running...) + while (!_bProcessEnd) + { + MSG msg; + while( ::PeekMessage( &msg, NULL, 0, 0, PM_REMOVE)) + { + if( msg.message == WM_QUIT) + { + ::PostQuitMessage(0); + // We do not exit but simply break in order to close + // handles properly + _bProcessEnd = TRUE; + break; + } + else + { + ::TranslateMessage( &msg); + ::DispatchMessage( &msg); + } + } + } + } + } catch (int coderr){ + TCHAR str[10]; + wsprintf(str, TEXT("%d"), coderr); + ::MessageBox(NULL, str, TEXT("Exception :"), MB_OK); + } + + // on va fermer toutes les handles + if (hPipeOutW) + ::CloseHandle(hPipeOutW); + if (hPipeErrW) + ::CloseHandle(hPipeErrW); + if (_hPipeOutR) + ::CloseHandle(_hPipeOutR); + if (_hPipeErrR) + ::CloseHandle(_hPipeErrR); + if (hListenerStdOutThread) + ::CloseHandle(hListenerStdOutThread); + if (hListenerStdErrThread) + ::CloseHandle(hListenerStdErrThread); + if (hWaitForProcessEndThread) + ::CloseHandle(hWaitForProcessEndThread); + if (hListenerEvent[0]) + ::CloseHandle(hListenerEvent[0]); + if (hListenerEvent[1]) + ::CloseHandle(hListenerEvent[1]); + + return result; +} + + +#define MAX_LINE_LENGTH 1024 + +void Process::listenerStdOut() +{ + //BOOL Result = 0; + //DWORD size = 0; + DWORD bytesAvail = 0; + BOOL result = 0; + HANDLE hListenerEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("listenerEvent")); + //FILE *fp = NULL; + + int taille = 0; + TCHAR bufferOut[MAX_LINE_LENGTH + 1]; + //TCHAR bufferErr[MAX_LINE_LENGTH + 1]; + + int nExitCode = STILL_ACTIVE; + + DWORD outbytesRead; + + ::ResumeThread(_hProcessThread); + + while (true) + { // got data + memset(bufferOut,0x00,MAX_LINE_LENGTH + 1); + //memset(bufferErr,0x00,MAX_LINE_LENGTH + 1); + taille = sizeof(bufferOut) - sizeof(TCHAR); + + Sleep(50); + + if (!::PeekNamedPipe(_hPipeOutR, bufferOut, taille, &outbytesRead, &bytesAvail, NULL)) + { + bytesAvail = 0; + break; + } + + if(outbytesRead) + { + result = :: ReadFile(_hPipeOutR, bufferOut, taille, &outbytesRead, NULL); + if ((!result) && (outbytesRead == 0)) + break; + } + //outbytesRead = lstrlen(bufferOut); + bufferOut[outbytesRead] = '\0'; + generic_string s; + s.assign(bufferOut); + _stdoutStr += s; + + if (::GetExitCodeProcess(_hProcess, (unsigned long*)&nExitCode)) + { + if (nExitCode != STILL_ACTIVE) + break; // EOF condition + } + //else + //break; + } + _exitCode = nExitCode; + + if(!::SetEvent(hListenerEvent)) + { + systemMessage(TEXT("Thread listenerStdOut")); + } +} + +void Process::listenerStdErr() +{ + //BOOL Result = 0; + //DWORD size = 0; + DWORD bytesAvail = 0; + BOOL result = 0; + HANDLE hListenerEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("listenerStdErrEvent")); + + int taille = 0; + //TCHAR bufferOut[MAX_LINE_LENGTH + 1]; + TCHAR bufferErr[MAX_LINE_LENGTH + 1]; + + int nExitCode = STILL_ACTIVE; + + DWORD errbytesRead; + + ::ResumeThread(_hProcessThread); + + while (true) + { // got data + memset(bufferErr, 0x00, MAX_LINE_LENGTH + 1); + taille = sizeof(bufferErr) - sizeof(TCHAR); + + Sleep(50); + + if (!::PeekNamedPipe(_hPipeErrR, bufferErr, taille, &errbytesRead, &bytesAvail, NULL)) + { + bytesAvail = 0; + break; + } + + if(errbytesRead) + { + result = :: ReadFile(_hPipeErrR, bufferErr, taille, &errbytesRead, NULL); + if ((!result) && (errbytesRead == 0)) + break; + } + //outbytesRead = lstrlen(bufferOut); + bufferErr[errbytesRead] = '\0'; + generic_string s; + s.assign(bufferErr); + _stderrStr += s; + + if (::GetExitCodeProcess(_hProcess, (unsigned long*)&nExitCode)) + { + if (nExitCode != STILL_ACTIVE) + break; // EOF condition + } + } + + if(!::SetEvent(hListenerEvent)) + { + systemMessage(TEXT("Thread stdout listener")); + } +} + +void Process::waitForProcessEnd() +{ + HANDLE hListenerEvent[2]; + hListenerEvent[0] = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("listenerEvent")); + hListenerEvent[1] = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("listenerStdErrEvent")); + + ::WaitForSingleObject(_hProcess, INFINITE); + ::WaitForMultipleObjects(2, hListenerEvent, TRUE, INFINITE); + + _bProcessEnd = TRUE; +} + +void Process::error(const TCHAR *txt2display, BOOL & returnCode, int errCode) +{ + systemMessage(txt2display); + returnCode = FALSE; + throw int(errCode); +} diff --git a/PowerEditor/src/MISC/Process/Process.h b/PowerEditor/src/MISC/Process/Process.h new file mode 100644 index 00000000..c89be3d2 --- /dev/null +++ b/PowerEditor/src/MISC/Process/Process.h @@ -0,0 +1,111 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef PROCESSUS_H +#define PROCESSUS_H + +#include +#include +#include "Common.h" + +using namespace std; + +enum progType {WIN32_PROG, CONSOLE_PROG}; + +class Process +{ +public: + Process(progType pt = WIN32_PROG) : _type(pt) {}; + Process(const TCHAR *cmd, const TCHAR *args, const TCHAR *cDir, progType pt = WIN32_PROG) + : _type(pt), _stdoutStr(TEXT("")), _stderrStr(TEXT("")), _hPipeOutR(NULL), + _hPipeErrR(NULL), _hProcess(NULL), _hProcessThread(NULL) { + + lstrcpy(_command, cmd); + lstrcpy(_args, args); + lstrcpy(_curDir, cDir); + //_pid = id; + + _bProcessEnd = TRUE; + }; + + BOOL run(); + + const TCHAR * getStdout() const { + return _stdoutStr.c_str(); + }; + + const TCHAR * getStderr() const { + return _stderrStr.c_str(); + }; + + int getExitCode() const { + return _exitCode; + }; + + bool hasStdout() { + return (_stdoutStr.compare(TEXT("")) != 0); + }; + + bool hasStderr() { + return (_stderrStr.compare(TEXT("")) != 0); + }; + +protected: + progType _type; + + // LES ENTREES + TCHAR _command[MAX_PATH]; + TCHAR _args[MAX_PATH]; + TCHAR _curDir[MAX_PATH]; + + // LES SORTIES + generic_string _stdoutStr; + generic_string _stderrStr; + int _exitCode; + + // LES HANDLES + HANDLE _hPipeOutR; + HANDLE _hPipeErrR; + HANDLE _hProcess; + HANDLE _hProcessThread; + + BOOL _bProcessEnd; + + //UINT _pid; // process ID assigned by caller + + static DWORD WINAPI staticListenerStdOut(void * myself){ + ((Process *)myself)->listenerStdOut(); + return 0; + }; + static DWORD WINAPI staticListenerStdErr(void * myself) { + ((Process *)myself)->listenerStdErr(); + return 0; + }; + static DWORD WINAPI staticWaitForProcessEnd(void * myself) { + ((Process *)myself)->waitForProcessEnd(); + return 0; + }; + + void listenerStdOut(); + void listenerStdErr(); + void waitForProcessEnd(); + + void error(const TCHAR *txt2display, BOOL & returnCode, int errCode); +}; + +#endif //PROCESSUS_H + diff --git a/PowerEditor/src/MISC/Process/ProcessAvecThread/Process.cpp b/PowerEditor/src/MISC/Process/ProcessAvecThread/Process.cpp new file mode 100644 index 00000000..9141287e --- /dev/null +++ b/PowerEditor/src/MISC/Process/ProcessAvecThread/Process.cpp @@ -0,0 +1,243 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "process.h" +#include "SysMsg.h" + +BOOL Process::run() +{ + BOOL result = TRUE; + + // stdout & stderr pipes for process to write + HANDLE hPipeOutW = NULL; + HANDLE hPipeErrW = NULL; + + HANDLE hListenerStdOutThread = NULL; + HANDLE hListenerStdErrThread = NULL; + + HANDLE hListenerEvent[2]; + hListenerEvent[0] = NULL; + hListenerEvent[1] = NULL; + + SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE }; // inheritable handle + + try { + // Create stdout pipe + if (!::CreatePipe(&_hPipeOutR, &hPipeOutW, &sa, 0)) + error("CreatePipe", result, 1000); + + // Create stderr pipe + if (!::CreatePipe(&_hPipeErrR, &hPipeErrW, &sa, 0)) + error("CreatePipe", result, 1001); + + STARTUPINFO startup; + PROCESS_INFORMATION procinfo; + ::ZeroMemory(&startup, sizeof(startup)); + startup.cb = sizeof(startup); + startup.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; + startup.wShowWindow = SW_HIDE; // hidden console window + startup.hStdInput = NULL; // not used + startup.hStdOutput = hPipeOutW; + startup.hStdError = hPipeErrW; + + BOOL started = ::CreateProcess(NULL, // command is part of input string + _command, // (writeable) command string + NULL, // process security + NULL, // thread security + TRUE, // inherit handles flag + CREATE_SUSPENDED, // flags + NULL, // inherit environment + _curDir, // inherit directory + &startup, // STARTUPINFO + &procinfo); // PROCESS_INFORMATION + + _hProcess = procinfo.hProcess; + _hProcessThread = procinfo.hThread; + + if(!started) + error("CreateProcess", result, 1002); + + hListenerEvent[0] = ::CreateEvent(NULL, FALSE, FALSE, "listenerEvent"); + if(!hListenerEvent[0]) + error("CreateEvent", result, 1003); + + hListenerEvent[1] = ::CreateEvent(NULL, FALSE, FALSE, "listenerStdErrEvent"); + if(!hListenerEvent[1]) + error("CreateEvent", result, 1004); + + hListenerStdOutThread = ::CreateThread(NULL, 0, staticListenerStdOut, this, 0, NULL); + if (!hListenerStdOutThread) + error("CreateThread", result, 1005); + + hListenerStdErrThread = ::CreateThread(NULL, 0, staticListenerStdErr, this, 0, NULL); + if (!hListenerStdErrThread) + error("CreateThread", result, 1006); + + ::WaitForSingleObject(_hProcess, INFINITE); + ::WaitForMultipleObjects(2, hListenerEvent, TRUE, INFINITE); + } catch (int coderr){} + + // on va fermer toutes les handles + if (hPipeOutW) + ::CloseHandle(hPipeOutW); + if (hPipeErrW) + ::CloseHandle(hPipeErrW); + if (_hPipeOutR) + ::CloseHandle(_hPipeOutR); + if (_hPipeErrR) + ::CloseHandle(_hPipeErrR); + if (hListenerStdOutThread) + ::CloseHandle(hListenerStdOutThread); + if (hListenerStdErrThread) + ::CloseHandle(hListenerStdErrThread); + if (hListenerEvent[0]) + ::CloseHandle(hListenerEvent[0]); + if (hListenerEvent[1]) + ::CloseHandle(hListenerEvent[1]); + + return result; +} + + +#define MAX_LINE_LENGTH 1024 + +void Process::listenerStdOut() +{ + BOOL Result = 0; + DWORD size = 0; + DWORD bytesAvail = 0; + BOOL result = 0; + HANDLE hListenerEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, "listenerEvent"); + //FILE *fp = NULL; + + int taille = 0; + TCHAR bufferOut[MAX_LINE_LENGTH + 1]; + //TCHAR bufferErr[MAX_LINE_LENGTH + 1]; + + int nExitCode = STILL_ACTIVE; + + DWORD outbytesRead; + + ::ResumeThread(_hProcessThread); + + while (true) + { // got data + memset(bufferOut,0x00,MAX_LINE_LENGTH + 1); + //memset(bufferErr,0x00,MAX_LINE_LENGTH + 1); + taille = sizeof(bufferOut) - sizeof(TCHAR); + + Sleep(50); + + if (!::PeekNamedPipe(_hPipeOutR, bufferOut, taille, &outbytesRead, &bytesAvail, NULL)) + { + bytesAvail = 0; + break; + } + + if(outbytesRead) + { + result = :: ReadFile(_hPipeOutR, bufferOut, taille, &outbytesRead, NULL); + if ((!result) && (outbytesRead == 0)) + break; + } + //outbytesRead = strlen(bufferOut); + bufferOut[outbytesRead] = '\0'; + string s; + s.assign(bufferOut); + _stdoutStr += s; + + if (::GetExitCodeProcess(_hProcess, (unsigned long*)&nExitCode)) + { + if (nExitCode != STILL_ACTIVE) + break; // EOF condition + } + //else + //break; + } + _exitCode = nExitCode; + + if(!::SetEvent(hListenerEvent)) + { + systemMessage("Thread listenerStdOut"); + } +} + +void Process::listenerStdErr() +{ + BOOL Result = 0; + DWORD size = 0; + DWORD bytesAvail = 0; + BOOL result = 0; + HANDLE hListenerEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, "listenerStdErrEvent"); + + int taille = 0; + //TCHAR bufferOut[MAX_LINE_LENGTH + 1]; + TCHAR bufferErr[MAX_LINE_LENGTH + 1]; + + int nExitCode = STILL_ACTIVE; + + DWORD errbytesRead; + + ::ResumeThread(_hProcessThread); + + while (true) + { // got data + memset(bufferErr, 0x00, MAX_LINE_LENGTH + 1); + taille = sizeof(bufferErr) - sizeof(TCHAR); + + Sleep(50); + + if (!::PeekNamedPipe(_hPipeErrR, bufferErr, taille, &errbytesRead, &bytesAvail, NULL)) + { + bytesAvail = 0; + break; + } + + if(errbytesRead) + { + result = :: ReadFile(_hPipeErrR, bufferErr, taille, &errbytesRead, NULL); + if ((!result) && (errbytesRead == 0)) + break; + } + //outbytesRead = strlen(bufferOut); + bufferErr[errbytesRead] = '\0'; + string s; + s.assign(bufferErr); + _stderrStr += s; + + if (::GetExitCodeProcess(_hProcess, (unsigned long*)&nExitCode)) + { + if (nExitCode != STILL_ACTIVE) + break; // EOF condition + } + //else + //break; + } + //_exitCode = nExitCode; + + if(!::SetEvent(hListenerEvent)) + { + systemMessage("Thread stdout listener"); + } +} + +void Process::error(const char *txt2display, BOOL & returnCode, int errCode) +{ + systemMessage(txt2display); + returnCode = FALSE; + throw int(errCode); +} diff --git a/PowerEditor/src/MISC/Process/ProcessAvecThread/Process.h b/PowerEditor/src/MISC/Process/ProcessAvecThread/Process.h new file mode 100644 index 00000000..3da6e62e --- /dev/null +++ b/PowerEditor/src/MISC/Process/ProcessAvecThread/Process.h @@ -0,0 +1,92 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef PROCESSUS_H +#define PROCESSUS_H + +#include +#include +using namespace std; + +class Process +{ +public: + Process() {}; + Process(const char *cmd, const char *cDir/*, unsigned int id = 0*/) + : _stdoutStr(""), _stderrStr(""), _hPipeOutR(NULL), + _hPipeErrR(NULL), _hProcess(NULL), _hProcessThread(NULL) { + + strcpy(_command, cmd); + strcpy(_curDir, cDir); + //_pid = id; + }; + + BOOL run(); + + const char * getStdout() const { + return _stdoutStr.c_str(); + }; + + const char * getStderr() const { + return _stderrStr.c_str(); + }; + + int getExitCode() const { + return _exitCode; + }; + + bool hasStdout() { + return _stdoutStr.compare(""); + }; + + bool hasStderr() { + return _stderrStr.compare(""); + }; + +protected: + // LES ENTREES + char _command[256]; + char _curDir[256]; + + // LES SORTIES + string _stdoutStr; + string _stderrStr; + int _exitCode; + + // LES HANDLES + HANDLE _hPipeOutR; + HANDLE _hPipeErrR; + HANDLE _hProcess; + HANDLE _hProcessThread; + + //UINT _pid; // process ID assigned by caller + + static DWORD WINAPI staticListenerStdOut(void * myself){ + ((Process *)myself)->listenerStdOut(); + return 0; + }; + static DWORD WINAPI staticListenerStdErr(void * myself) { + ((Process *)myself)->listenerStdErr(); + return 0; + }; + void listenerStdOut(); + void listenerStdErr(); + void error(const char *txt2display, BOOL & returnCode, int errCode); +}; + +#endif //PROCESSUS_H + diff --git a/PowerEditor/src/MISC/Process/ProcessAvecThread/ProcessThread.h b/PowerEditor/src/MISC/Process/ProcessAvecThread/ProcessThread.h new file mode 100644 index 00000000..c2abfc26 --- /dev/null +++ b/PowerEditor/src/MISC/Process/ProcessAvecThread/ProcessThread.h @@ -0,0 +1,85 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef PROCESS_THREAD_H +#define PROCESS_THREAD_H + +#include "process.h" + +class ProcessThread +{ +public : + ProcessThread(const char *appName, const char *cmd, const char *cDir, HWND hwnd) : _hwnd(hwnd) { + strcpy(_appName, appName); + strcpy(_command, cmd); + strcpy(_curDir, cDir); + }; + + BOOL run(){ + HANDLE hEvent = ::CreateEvent(NULL, FALSE, FALSE, "localVarProcessEvent"); + + _hProcessThread = ::CreateThread(NULL, 0, staticLauncher, this, 0, NULL); + + ::WaitForSingleObject(hEvent, INFINITE); + + ::CloseHandle(hEvent); + return TRUE; + }; + +protected : + // ENTREES + char _appName[256]; + char _command[256]; + char _curDir[256]; + HWND _hwnd; + HANDLE _hProcessThread; + + static DWORD WINAPI staticLauncher(void *myself) { + ((ProcessThread *)myself)->launch(); + return TRUE; + }; + + bool launch() { + HANDLE hEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, "localVarProcessEvent"); + HWND hwnd = _hwnd; + char appName[256]; + strcpy(appName, _appName); + HANDLE hMyself = _hProcessThread; + + Process process(_command, _curDir); + + if(!::SetEvent(hEvent)) + { + systemMessage("Thread launcher"); + } + + process.run(); + + int code = process.getExitCode(); + char codeStr[256]; + sprintf(codeStr, "%s : %0.4X", appName, code); + ::MessageBox(hwnd, (char *)process.getStdout(), codeStr, MB_OK); + + if (process.hasStderr()) + ::MessageBox(hwnd, (char *)process.getStderr(), codeStr, MB_OK); + + ::CloseHandle(hMyself); + return true; + }; +}; + +#endif PROCESS_THREAD_H diff --git a/PowerEditor/src/MISC/RegExt/regExtDlg.cpp b/PowerEditor/src/MISC/RegExt/regExtDlg.cpp new file mode 100644 index 00000000..c32a6654 --- /dev/null +++ b/PowerEditor/src/MISC/RegExt/regExtDlg.cpp @@ -0,0 +1,388 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO ( donho@altern.org ) + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ +#include +#include "regExtDlg.h" +#include "resource.h" +#include "Common.h" + +const TCHAR *nppName = TEXT("Notepad++_file"); +const TCHAR *nppBackup = TEXT("Notepad++_backup"); +const TCHAR *nppDoc = TEXT("Notepad++ Document"); + +const int nbSupportedLang = 9; +const int nbExtMax = 10; +const int extNameMax = 18; + +TCHAR defExtArray[nbSupportedLang][nbExtMax][extNameMax] = { + {TEXT("Notepad"), TEXT(".txt"), TEXT(".log"), TEXT(".ini")}, + {TEXT("c, c++, objc"), TEXT(".h"), TEXT(".hpp"), TEXT(".hxx"), TEXT(".c"), TEXT(".cpp"), TEXT(".cxx"), TEXT(".cc"), TEXT(".m")}, + {TEXT("java, c#, pascal"), TEXT(".java"), TEXT(".cs"), TEXT(".pas"), TEXT(".inc")}, + {TEXT("web(html) script"), TEXT(".html"), TEXT(".htm"), TEXT(".php"), TEXT(".phtml"), TEXT(".js"), TEXT(".jsp"), TEXT(".asp"), TEXT(".css"), TEXT(".xml")}, + {TEXT("public script"), TEXT(".sh"), TEXT(".bsh"), TEXT(".nsi"), TEXT(".nsh"), TEXT(".lua"), TEXT(".pl"), TEXT(".pm"), TEXT(".py")}, + {TEXT("property script"), TEXT(".rc"), TEXT(".as"), TEXT(".mx"), TEXT(".vb"), TEXT(".vbs")}, + {TEXT("fortran, TeX, SQL"), TEXT(".f"), TEXT(".for"), TEXT(".f90"), TEXT(".f95"), TEXT(".f2k"), TEXT(".tex"), TEXT(".sql")}, + {TEXT("misc"), TEXT(".nfo"), TEXT(".mak")}, + {TEXT("customize")} +}; + +void RegExtDlg::doDialog(bool isRTL) +{ + if (isRTL) + { + DLGTEMPLATE *pMyDlgTemplate = NULL; + HGLOBAL hMyDlgTemplate = makeRTLResource(IDD_REGEXT_BOX, &pMyDlgTemplate); + ::DialogBoxIndirectParam(_hInst, pMyDlgTemplate, _hParent, (DLGPROC)dlgProc, (LPARAM)this); + ::GlobalFree(hMyDlgTemplate); + } + else + ::DialogBoxParam(_hInst, MAKEINTRESOURCE(IDD_REGEXT_BOX), _hParent, (DLGPROC)dlgProc, (LPARAM)this); +}; + +BOOL CALLBACK RegExtDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_INITDIALOG : + { + getRegisteredExts(); + getDefSupportedExts(); + //goToCenter(); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_ADDFROMLANGEXT_BUTTON), false); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_REMOVEEXT_BUTTON), false); + ::SendDlgItemMessage(_hSelf, IDC_CUSTOMEXT_EDIT, EM_SETLIMITTEXT, extNameMax-1, 0); + + return TRUE; + } + + case WM_DRAWITEM : + { + HICON hIcon = ::LoadIcon(_hInst, MAKEINTRESOURCE(IDI_DELETE_ICON)); + DRAWITEMSTRUCT *pdis = (DRAWITEMSTRUCT *)lParam; + ::DrawIcon(pdis->hDC, 0, 0, hIcon); + return TRUE; + } + + case WM_COMMAND : + { + switch (wParam) + { + case IDC_ADDFROMLANGEXT_BUTTON : + { + writeNppPath(); + + TCHAR ext2Add[extNameMax] = TEXT(""); + if (!_isCustomize) + { + int index2Add = ::SendDlgItemMessage(_hSelf, IDC_REGEXT_LANGEXT_LIST, LB_GETCURSEL, 0, 0); + ::SendDlgItemMessage(_hSelf, IDC_REGEXT_LANGEXT_LIST, LB_GETTEXT, index2Add, (LPARAM)ext2Add); + addExt(ext2Add); + ::SendDlgItemMessage(_hSelf, IDC_REGEXT_LANGEXT_LIST, LB_DELETESTRING, index2Add, 0); + } + else + { + ::SendDlgItemMessage(_hSelf, IDC_CUSTOMEXT_EDIT, WM_GETTEXT, extNameMax, (LPARAM)ext2Add); + int i = ::SendDlgItemMessage(_hSelf, IDC_REGEXT_REGISTEREDEXTS_LIST, LB_FINDSTRINGEXACT, 0, (LPARAM)ext2Add); + if (i != LB_ERR) + return TRUE; + addExt(ext2Add); + ::SendDlgItemMessage(_hSelf, IDC_CUSTOMEXT_EDIT, WM_SETTEXT, 0, (LPARAM)TEXT("")); + } + ::SendDlgItemMessage(_hSelf, IDC_REGEXT_REGISTEREDEXTS_LIST, LB_ADDSTRING, 0, (LPARAM)ext2Add); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_ADDFROMLANGEXT_BUTTON), false); + return TRUE; + } + + case IDC_REMOVEEXT_BUTTON : + { + TCHAR ext2Sup[extNameMax] = TEXT(""); + int index2Sup = ::SendDlgItemMessage(_hSelf, IDC_REGEXT_REGISTEREDEXTS_LIST, LB_GETCURSEL, 0, 0); + ::SendDlgItemMessage(_hSelf, IDC_REGEXT_REGISTEREDEXTS_LIST, LB_GETTEXT, index2Sup, (LPARAM)ext2Sup); + if (deleteExts(ext2Sup)) + ::SendDlgItemMessage(_hSelf, IDC_REGEXT_REGISTEREDEXTS_LIST, LB_DELETESTRING, index2Sup, 0); + int langIndex = ::SendDlgItemMessage(_hSelf, IDC_REGEXT_LANG_LIST, LB_GETCURSEL, 0, 0); + + ::EnableWindow(::GetDlgItem(_hSelf, IDC_REMOVEEXT_BUTTON), false); + + if (langIndex != LB_ERR) + { + for (int i = 1 ; i < nbExtMax ; i++) + { + if (!generic_stricmp(ext2Sup, defExtArray[langIndex][i])) + { + ::SendDlgItemMessage(_hSelf, IDC_REGEXT_LANGEXT_LIST, LB_ADDSTRING, 0, (LPARAM)ext2Sup); + return TRUE; + } + } + } + return TRUE; + } + + case IDCANCEL : + ::EndDialog(_hSelf, 0); + return TRUE; + + } + + if (HIWORD(wParam) == EN_CHANGE) + { + TCHAR text[extNameMax] = TEXT(""); + ::SendDlgItemMessage(_hSelf, IDC_CUSTOMEXT_EDIT, WM_GETTEXT, extNameMax, (LPARAM)text); + if ((lstrlen(text) == 1) && (text[0] != '.')) + { + text[1] = text[0]; + text[0] = '.'; + text[2] = '\0'; + ::SendDlgItemMessage(_hSelf, IDC_CUSTOMEXT_EDIT, WM_SETTEXT, 0, (LPARAM)text); + ::SendDlgItemMessage(_hSelf, IDC_CUSTOMEXT_EDIT, EM_SETSEL, 2, 2); + } + ::EnableWindow(::GetDlgItem(_hSelf, IDC_ADDFROMLANGEXT_BUTTON), (lstrlen(text) > 1)); + return TRUE; + } + + if (HIWORD(wParam) == LBN_SELCHANGE) + { + int i = ::SendDlgItemMessage(_hSelf, LOWORD(wParam), LB_GETCURSEL, 0, 0); + if (LOWORD(wParam) == IDC_REGEXT_LANG_LIST) + { + if (i != LB_ERR) + { + TCHAR itemName[32]; + ::SendDlgItemMessage(_hSelf, LOWORD(wParam), LB_GETTEXT, i, (LPARAM)itemName); + + if (!generic_stricmp(defExtArray[nbSupportedLang-1][0], itemName)) + { + ::ShowWindow(::GetDlgItem(_hSelf, IDC_REGEXT_LANGEXT_LIST), SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_CUSTOMEXT_EDIT), SW_SHOW); + _isCustomize = true; + } + else + { + if (_isCustomize) + { + ::ShowWindow(::GetDlgItem(_hSelf, IDC_REGEXT_LANGEXT_LIST), SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_CUSTOMEXT_EDIT), SW_HIDE); + + _isCustomize = false; + } + int count = ::SendDlgItemMessage(_hSelf, IDC_REGEXT_LANGEXT_LIST, LB_GETCOUNT, 0, 0); + for (count -= 1 ; count >= 0 ; count--) + ::SendDlgItemMessage(_hSelf, IDC_REGEXT_LANGEXT_LIST, LB_DELETESTRING, count, 0); + + for (int j = 1 ; j < nbExtMax ; j++) + if (lstrcmp(TEXT(""), defExtArray[i][j])) + { + int index = ::SendDlgItemMessage(_hSelf, IDC_REGEXT_REGISTEREDEXTS_LIST, LB_FINDSTRINGEXACT, 0, (LPARAM)defExtArray[i][j]); + if (index == -1) + ::SendDlgItemMessage(_hSelf, IDC_REGEXT_LANGEXT_LIST, LB_ADDSTRING, 0, (LPARAM)defExtArray[i][j]); + } + } + + ::EnableWindow(::GetDlgItem(_hSelf, IDC_ADDFROMLANGEXT_BUTTON), false); + } + } + + else if (LOWORD(wParam) == IDC_REGEXT_LANGEXT_LIST) + { + if (i != LB_ERR) + ::EnableWindow(::GetDlgItem(_hSelf, IDC_ADDFROMLANGEXT_BUTTON), true); + + } + + else if (LOWORD(wParam) == IDC_REGEXT_REGISTEREDEXTS_LIST) + { + if (i != LB_ERR) + ::EnableWindow(::GetDlgItem(_hSelf, IDC_REMOVEEXT_BUTTON), true); + } + } + } + default : + return FALSE; + } + //return FALSE; +} + +void RegExtDlg::getRegisteredExts() +{ + int nbRegisteredKey = getNbSubKey(HKEY_CLASSES_ROOT); + for (int i = 0 ; i < nbRegisteredKey ; i++) + { + TCHAR extName[extNameLen]; + //FILETIME fileTime; + int extNameActualLen = extNameLen; + int res = ::RegEnumKeyEx(HKEY_CLASSES_ROOT, i, extName, (LPDWORD)&extNameActualLen, NULL, NULL, NULL, NULL); + if ((res == ERROR_SUCCESS) && (extName[0] == '.')) + { + //TCHAR valName[extNameLen]; + TCHAR valData[extNameLen]; + int valDataLen = extNameLen * sizeof(TCHAR); + int valType; + HKEY hKey2Check; + extNameActualLen = extNameLen; + ::RegOpenKeyEx(HKEY_CLASSES_ROOT, extName, 0, KEY_ALL_ACCESS, &hKey2Check); + ::RegQueryValueEx(hKey2Check, TEXT(""), NULL, (LPDWORD)&valType, (LPBYTE)valData, (LPDWORD)&valDataLen); + //::RegEnumValue(hKey2Check, 0, valName, (LPDWORD)&extNameActualLen, NULL, (LPDWORD)&valType, (LPBYTE)valData, (LPDWORD)&valDataLen); + if ((valType == REG_SZ) && (!lstrcmp(valData, nppName))) + ::SendDlgItemMessage(_hSelf, IDC_REGEXT_REGISTEREDEXTS_LIST, LB_ADDSTRING, 0, (LPARAM)extName); + ::RegCloseKey(hKey2Check); + } + } +} + +void RegExtDlg::getDefSupportedExts() +{ + for (int i = 0 ; i < nbSupportedLang ; i++) + ::SendDlgItemMessage(_hSelf, IDC_REGEXT_LANG_LIST, LB_ADDSTRING, 0, (LPARAM)defExtArray[i][0]); +} + + +void RegExtDlg::addExt(TCHAR *ext) +{ + HKEY hKey; + DWORD dwDisp; + long nRet; + + nRet = ::RegCreateKeyEx(HKEY_CLASSES_ROOT, + ext, + 0, + NULL, + 0, + KEY_ALL_ACCESS, + NULL, + &hKey, + &dwDisp); + + if (nRet == ERROR_SUCCESS) + { + TCHAR valData[MAX_PATH]; + int valDataLen = MAX_PATH * sizeof(TCHAR); + + if (dwDisp == REG_OPENED_EXISTING_KEY) + { + int res = ::RegQueryValueEx(hKey, TEXT(""), NULL, NULL, (LPBYTE)valData, (LPDWORD)&valDataLen); + if (res == ERROR_SUCCESS) + ::RegSetValueEx(hKey, nppBackup, 0, REG_SZ, (LPBYTE)valData, valDataLen); + } + ::RegSetValueEx(hKey, NULL, 0, REG_SZ, (LPBYTE)nppName, (lstrlen(nppName)+1)*sizeof(TCHAR)); + + ::RegCloseKey(hKey); + } +} + +bool RegExtDlg::deleteExts(const TCHAR *ext2Delete) +{ + HKEY hKey; + ::RegOpenKeyEx(HKEY_CLASSES_ROOT, ext2Delete, 0, KEY_ALL_ACCESS, &hKey); + + int nbValue = getNbSubValue(hKey); + int nbSubkey = getNbSubKey(hKey); + + if ((nbValue <= 1) && (!nbSubkey)) + { + TCHAR subKey[32] = TEXT("\\"); + lstrcat(subKey, ext2Delete); + ::RegDeleteKey(HKEY_CLASSES_ROOT, subKey); + } + else + { + TCHAR valData[extNameLen]; + int valDataLen = extNameLen*sizeof(TCHAR); + int valType; + int res = ::RegQueryValueEx(hKey, nppBackup, NULL, (LPDWORD)&valType, (LPBYTE)valData, (LPDWORD)&valDataLen); + + if (res == ERROR_SUCCESS) + { + ::RegSetValueEx(hKey, NULL, 0, valType, (LPBYTE)valData, valDataLen); + ::RegDeleteValue(hKey, nppBackup); + } + else + ::RegDeleteValue(hKey, NULL); + } + + return true; +} + +void RegExtDlg::writeNppPath() +{ + HKEY hKey, hRootKey; + DWORD dwDisp; + long nRet; + TCHAR regStr[MAX_PATH] = TEXT(""); + lstrcat(lstrcat(regStr, nppName), TEXT("\\shell\\open\\command")); + + nRet = ::RegCreateKeyEx( + HKEY_CLASSES_ROOT, + regStr, + 0, + NULL, + 0, + KEY_ALL_ACCESS, + NULL, + &hKey, + &dwDisp); + + + if (nRet == ERROR_SUCCESS) + { + //if (dwDisp == REG_CREATED_NEW_KEY) + { + // Write the value for new document + ::RegOpenKeyEx(HKEY_CLASSES_ROOT, nppName, 0, KEY_ALL_ACCESS, &hRootKey); + ::RegSetValueEx(hRootKey, NULL, 0, REG_SZ, (LPBYTE)nppDoc, (lstrlen(nppDoc)+1)*sizeof(TCHAR)); + RegCloseKey(hRootKey); + + TCHAR nppPath[MAX_PATH]; + ::GetModuleFileName(_hInst, nppPath, MAX_PATH); + + TCHAR nppPathParam[256] = TEXT("\""); + lstrcat(lstrcat(nppPathParam, nppPath), TEXT("\" \"%1\"")); + + ::RegSetValueEx(hKey, NULL, 0, REG_SZ, (LPBYTE)nppPathParam, (lstrlen(nppPathParam)+1)*sizeof(TCHAR)); + } + RegCloseKey(hKey); + } + + //Set default icon value + lstrcpy(regStr, nppName); + lstrcat(regStr, TEXT("\\DefaultIcon")); + nRet = ::RegCreateKeyEx( + HKEY_CLASSES_ROOT, + regStr, + 0, + NULL, + 0, + KEY_ALL_ACCESS, + NULL, + &hKey, + &dwDisp); + + if (nRet == ERROR_SUCCESS) + { + //if (dwDisp == REG_CREATED_NEW_KEY) + { + TCHAR nppPath[MAX_PATH]; + ::GetModuleFileName(_hInst, nppPath, MAX_PATH); + + TCHAR nppPathParam[256] = TEXT("\""); + lstrcat(lstrcat(nppPathParam, nppPath), TEXT("\",0")); + + ::RegSetValueEx(hKey, NULL, 0, REG_SZ, (LPBYTE)nppPathParam, (lstrlen(nppPathParam)+1)*sizeof(TCHAR)); + } + RegCloseKey(hKey); + } +} diff --git a/PowerEditor/src/MISC/RegExt/regExtDlg.h b/PowerEditor/src/MISC/RegExt/regExtDlg.h new file mode 100644 index 00000000..11bc30db --- /dev/null +++ b/PowerEditor/src/MISC/RegExt/regExtDlg.h @@ -0,0 +1,60 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO ( donho@altern.org ) + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#ifndef REG_EXT_DLG_H +#define REG_EXT_DLG_H + +#include "StaticDialog.h" +#include "regExtDlgRc.h" + +const int extNameLen = 32; + +class RegExtDlg : public StaticDialog +{ +public : + RegExtDlg() : _isCustomize(false){}; + ~RegExtDlg(){}; + void doDialog(bool isRTL = false); + + +private : + bool _isCustomize; + + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); + + void getRegisteredExts(); + void getDefSupportedExts(); + void addExt(TCHAR *ext); + bool deleteExts(const TCHAR *ext2Delete); + void writeNppPath(); + + int getNbSubKey(HKEY hKey) const { + int nbSubKey; + long result = ::RegQueryInfoKey(hKey, NULL, NULL, NULL, (LPDWORD)&nbSubKey, NULL, NULL, NULL, NULL, NULL, NULL, NULL); + return (result == ERROR_SUCCESS)?nbSubKey:0; + }; + + int getNbSubValue(HKEY hKey) const { + int nbSubValue; + long result = ::RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, (LPDWORD)&nbSubValue, NULL, NULL, NULL, NULL); + return (result == ERROR_SUCCESS)?nbSubValue:0; + }; +}; + +#endif //REG_EXT_DLG_H diff --git a/PowerEditor/src/MISC/RegExt/regExtDlg.rc b/PowerEditor/src/MISC/RegExt/regExtDlg.rc new file mode 100644 index 00000000..fc3b653e --- /dev/null +++ b/PowerEditor/src/MISC/RegExt/regExtDlg.rc @@ -0,0 +1,39 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO ( donho@altern.org ) + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#include +#include "regExtDlgRc.h" + + +IDD_REGEXT_BOX DIALOGEX 0, 0, 370, 180 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x1 +BEGIN + LISTBOX IDC_REGEXT_LANGEXT_LIST,141,31,29,122,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP + LISTBOX IDC_REGEXT_REGISTEREDEXTS_LIST,211,30,48,123,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "->",IDC_ADDFROMLANGEXT_BUTTON,178,87,26,14 + EDITTEXT IDC_CUSTOMEXT_EDIT,141,87,30,14,ES_AUTOHSCROLL | NOT WS_VISIBLE + PUSHBUTTON "->",IDC_REMOVEEXT_BUTTON,266,86,26,14 + CONTROL "",IDC_POUPELLE_STATIC,"Static",SS_OWNERDRAW,301,82,20,20 + LTEXT "Supported exts :",IDC_SUPPORTEDEXTS_STATIC,73,18,77,8 + LTEXT "Registered exts :",IDC_REGISTEREDEXTS_STATIC,212,18,72,8 + LISTBOX IDC_REGEXT_LANG_LIST,73,31,63,122,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP +END + + diff --git a/PowerEditor/src/MISC/RegExt/regExtDlgRc.h b/PowerEditor/src/MISC/RegExt/regExtDlgRc.h new file mode 100644 index 00000000..acc9189e --- /dev/null +++ b/PowerEditor/src/MISC/RegExt/regExtDlgRc.h @@ -0,0 +1,35 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO ( donho@altern.org ) + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ +#ifndef REGEXTDLGRC_H +#define REGEXTDLGRC_H + +#define IDD_REGEXT_BOX 4000 + + #define IDC_REGEXT_LANG_LIST (IDD_REGEXT_BOX + 1) + #define IDC_REGEXT_LANGEXT_LIST (IDD_REGEXT_BOX + 2) + #define IDC_REGEXT_REGISTEREDEXTS_LIST (IDD_REGEXT_BOX + 3) + #define IDC_ADDFROMLANGEXT_BUTTON (IDD_REGEXT_BOX + 4) + #define IDI_POUPELLE_ICON (IDD_REGEXT_BOX + 5) + #define IDC_CUSTOMEXT_EDIT (IDD_REGEXT_BOX + 6) + #define IDC_REMOVEEXT_BUTTON (IDD_REGEXT_BOX + 7) + #define IDC_POUPELLE_STATIC (IDD_REGEXT_BOX + 8) + #define IDC_SUPPORTEDEXTS_STATIC (IDD_REGEXT_BOX + 9) + #define IDC_REGISTEREDEXTS_STATIC (IDD_REGEXT_BOX + 10) + +#endif //REGEXTDLGRC_H diff --git a/PowerEditor/src/MISC/crc16/Crc16.h b/PowerEditor/src/MISC/crc16/Crc16.h new file mode 100644 index 00000000..be71e239 --- /dev/null +++ b/PowerEditor/src/MISC/crc16/Crc16.h @@ -0,0 +1,112 @@ + +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + + +#ifndef _CRC16_H_ +#define _CRC16_H_ +#include + +class CRC16_ISO_3309 +{ +public : + CRC16_ISO_3309(unsigned short polynom = 0x1021, unsigned short initVal = 0xFFFF) + :_polynom(polynom), _initVal(initVal) {}; + ~CRC16_ISO_3309(){}; + + void set(unsigned short polynom, unsigned short initVal) { + _polynom = polynom; + _initVal = initVal; + }; + + unsigned short calculate(unsigned char *data, unsigned short count) + { + unsigned short fcs = _initVal; + unsigned short d, i, k; + for (i=0; i(data[i]); + + // calculate CRC : by default polynom = 0x1021, init val = 0xFFFF) + unsigned short wordResult = CRC16_ISO_3309::calculate(pBuffer, count); + + // Reverse the WORD bits + wordResult = reverseByte(wordResult); + + // XOR FFFF + wordResult ^= 0xFFFF; + + // Invert MSB/LSB + wordResult = wordResult << 8 | wordResult >> 8 ; + + delete [] pBuffer; + + return wordResult; + }; + +private: + template + IntType reverseByte(IntType val2Reverses) + { + IntType reversedValue = 0; + long mask = 1; + int nBits = sizeof(val2Reverses) * 8; + for (int i = 0 ; i < nBits ; i++) + if ((mask << i) & val2Reverses) + reversedValue += (mask << (nBits - 1 - i)); + + return reversedValue; + }; +}; + +#endif \ No newline at end of file diff --git a/PowerEditor/src/Notepad_plus.cpp b/PowerEditor/src/Notepad_plus.cpp new file mode 100644 index 00000000..85631312 --- /dev/null +++ b/PowerEditor/src/Notepad_plus.cpp @@ -0,0 +1,9885 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. +#ifndef _WIN32_IE +#define _WIN32_IE 0x500 +#endif + +//#define INCLUDE_DEPRECATED_FEATURES 1 + +#include +//#include "dbghelp.h" + +#include "Notepad_plus.h" +#include "FileDialog.h" +#include "resource.h" +#include "printer.h" +#include "FileNameStringSplitter.h" +#include "lesDlgs.h" +#include "Utf8_16.h" +#include "regExtDlg.h" +#include "RunDlg.h" +#include "ShortcutMapper.h" +#include "preferenceDlg.h" +#include "TaskListDlg.h" +#include +#include "xmlMatchedTagsHighlighter.h" + +const TCHAR Notepad_plus::_className[32] = TEXT("Notepad++"); +HWND Notepad_plus::gNppHWND = NULL; +const char *urlHttpRegExpr = "http://[a-z0-9_\\-\\+.:?&@=/%#]*"; + +int docTabIconIDs[] = {IDI_SAVED_ICON, IDI_UNSAVED_ICON, IDI_READONLY_ICON}; +enum tb_stat {tb_saved, tb_unsaved, tb_ro}; + +#define DIR_LEFT true +#define DIR_RIGHT false + +struct SortTaskListPred +{ + DocTabView *_views[2]; + + SortTaskListPred(DocTabView &p, DocTabView &s) + { + _views[MAIN_VIEW] = &p; + _views[SUB_VIEW] = &s; + } + + bool operator()(const TaskLstFnStatus &l, const TaskLstFnStatus &r) const { + BufferID lID = _views[l._iView]->getBufferByIndex(l._docIndex); + BufferID rID = _views[r._iView]->getBufferByIndex(r._docIndex); + Buffer * bufL = MainFileManager->getBufferByID(lID); + Buffer * bufR = MainFileManager->getBufferByID(rID); + return bufL->getRecentTag() > bufR->getRecentTag(); + } +}; + +Notepad_plus::Notepad_plus(): Window(), _mainWindowStatus(0), _pDocTab(NULL), _pEditView(NULL), + _pMainSplitter(NULL), + _recordingMacro(false), _pTrayIco(NULL), _isUDDocked(false), _isRTL(false), + _linkTriggered(true), _isDocModifing(false), _isHotspotDblClicked(false), _sysMenuEntering(false), + _autoCompleteMain(&_mainEditView), _autoCompleteSub(&_subEditView), _smartHighlighter(&_findReplaceDlg), + _nativeLangEncoding(CP_ACP), _isFileOpening(false) +{ + + ZeroMemory(&_prevSelectedRange, sizeof(_prevSelectedRange)); + _winVersion = (NppParameters::getInstance())->getWinVersion(); + + TiXmlDocumentA *nativeLangDocRootA = (NppParameters::getInstance())->getNativeLangA(); + + if (nativeLangDocRootA) + { + + _nativeLangA = nativeLangDocRootA->FirstChild("NotepadPlus"); + if (_nativeLangA) + { + _nativeLangA = _nativeLangA->FirstChild("Native-Langue"); + if (_nativeLangA) + { + TiXmlElementA *element = _nativeLangA->ToElement(); + const char *rtl = element->Attribute("RTL"); + if (rtl) + _isRTL = (strcmp(rtl, "yes") == 0); + + // get encoding + TiXmlDeclarationA *declaration = _nativeLangA->GetDocument()->FirstChild()->ToDeclaration(); + if (declaration) + { + const char * encodingStr = declaration->Encoding(); + _nativeLangEncoding = getCpFromStringValue(encodingStr); + } + } + } + } + else + _nativeLangA = NULL; + + TiXmlDocument *toolIconsDocRoot = (NppParameters::getInstance())->getToolIcons(); + if (toolIconsDocRoot) + { + _toolIcons = toolIconsDocRoot->FirstChild(TEXT("NotepadPlus")); + if (_toolIcons) + { + if ((_toolIcons = _toolIcons->FirstChild(TEXT("ToolBarIcons")))) + { + if ((_toolIcons = _toolIcons->FirstChild(TEXT("Theme")))) + { + const TCHAR *themeDir = (_toolIcons->ToElement())->Attribute(TEXT("pathPrefix")); + + for (TiXmlNode *childNode = _toolIcons->FirstChildElement(TEXT("Icon")); + childNode ; + childNode = childNode->NextSibling(TEXT("Icon"))) + { + int iIcon; + const TCHAR *res = (childNode->ToElement())->Attribute(TEXT("id"), &iIcon); + if (res) + { + TiXmlNode *grandChildNode = childNode->FirstChildElement(TEXT("normal")); + if (grandChildNode) + { + TiXmlNode *valueNode = grandChildNode->FirstChild(); + //putain, enfin!!! + if (valueNode) + { + generic_string locator = themeDir?themeDir:TEXT(""); + + locator += valueNode->Value(); + _customIconVect.push_back(iconLocator(0, iIcon, locator)); + } + } + + grandChildNode = childNode->FirstChildElement(TEXT("hover")); + if (grandChildNode) + { + TiXmlNode *valueNode = grandChildNode->FirstChild(); + //putain, enfin!!! + if (valueNode) + { + generic_string locator = themeDir?themeDir:TEXT(""); + + locator += valueNode->Value(); + _customIconVect.push_back(iconLocator(1, iIcon, locator)); + } + } + + grandChildNode = childNode->FirstChildElement(TEXT("disabled")); + if (grandChildNode) + { + TiXmlNode *valueNode = grandChildNode->FirstChild(); + //putain, enfin!!! + if (valueNode) + { + generic_string locator = themeDir?themeDir:TEXT(""); + + locator += valueNode->Value(); + _customIconVect.push_back(iconLocator(2, iIcon, locator)); + } + } + } + } + } + } + } + } + else + _toolIcons = NULL; +} + +// ATTENTION : the order of the destruction is very important +// because if the parent's window hadle is destroyed before +// the destruction of its childrens' windows handle, +// its childrens' windows handle will be destroyed automatically! +Notepad_plus::~Notepad_plus() +{ + (NppParameters::getInstance())->destroyInstance(); + MainFileManager->destroyInstance(); + (WcharMbcsConvertor::getInstance())->destroyInstance(); + if (_pTrayIco) + delete _pTrayIco; +} + +void Notepad_plus::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLine, CmdLineParams *cmdLineParams) +{ + Window::init(hInst, parent); + WNDCLASS nppClass; + + nppClass.style = CS_BYTEALIGNWINDOW | CS_DBLCLKS; + nppClass.lpfnWndProc = Notepad_plus_Proc; + nppClass.cbClsExtra = 0; + nppClass.cbWndExtra = 0; + nppClass.hInstance = _hInst; + nppClass.hIcon = ::LoadIcon(_hInst, MAKEINTRESOURCE(IDI_M30ICON)); + nppClass.hCursor = ::LoadCursor(NULL, IDC_ARROW); + nppClass.hbrBackground = ::CreateSolidBrush(::GetSysColor(COLOR_MENU)); + nppClass.lpszMenuName = MAKEINTRESOURCE(IDR_M30_MENU); + nppClass.lpszClassName = _className; + + if (!::RegisterClass(&nppClass)) + { + systemMessage(TEXT("System Err")); + throw int(98); + } + + RECT workAreaRect; + ::SystemParametersInfo(SPI_GETWORKAREA, 0, &workAreaRect, 0); + + NppParameters *pNppParams = NppParameters::getInstance(); + const NppGUI & nppGUI = pNppParams->getNppGUI(); + + if (cmdLineParams->_isNoPlugin) + _pluginsManager.disable(); + + _hSelf = ::CreateWindowEx( + WS_EX_ACCEPTFILES | (_isRTL?WS_EX_LAYOUTRTL:0),\ + _className,\ + TEXT("Notepad++"),\ + WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,\ + // CreateWindowEx bug : set all 0 to walk arround the pb + 0, 0, 0, 0,\ + _hParent,\ + NULL,\ + _hInst,\ + (LPVOID)this); // pass the ptr of this instantiated object + // for retrive it in Notepad_plus_Proc from + // the CREATESTRUCT.lpCreateParams afterward. + + if (!_hSelf) + { + systemMessage(TEXT("System Err")); + throw int(777); + } + + gNppHWND = _hSelf; + + // In setting the startup window position, take into account that the last-saved + // position might have assumed a second monitor that's no longer available. + POINT newUpperLeft; + newUpperLeft.x = nppGUI._appPos.left + workAreaRect.left; + newUpperLeft.y = nppGUI._appPos.top + workAreaRect.top; + + // GetSystemMetrics does not support the multi-monitor values on Windows NT and Windows 95. + if ((_winVersion != WV_95) && (_winVersion != WV_NT)) + { + int margin = ::GetSystemMetrics(SM_CYSMCAPTION); + if (newUpperLeft.x > ::GetSystemMetrics(SM_CXVIRTUALSCREEN)-margin) + newUpperLeft.x = workAreaRect.right - nppGUI._appPos.right; + if (newUpperLeft.x + nppGUI._appPos.right < ::GetSystemMetrics(SM_XVIRTUALSCREEN)+margin) + newUpperLeft.x = workAreaRect.left; + if (newUpperLeft.y > ::GetSystemMetrics(SM_CYVIRTUALSCREEN)-margin) + newUpperLeft.y = workAreaRect.bottom - nppGUI._appPos.bottom; + if (newUpperLeft.y + nppGUI._appPos.bottom < ::GetSystemMetrics(SM_YVIRTUALSCREEN)+margin) + newUpperLeft.y = workAreaRect.top; + } + if (cmdLineParams->isPointValid()) + ::MoveWindow(_hSelf, cmdLineParams->_point.x, cmdLineParams->_point.y, nppGUI._appPos.right, nppGUI._appPos.bottom, TRUE); + else + ::MoveWindow(_hSelf, newUpperLeft.x, newUpperLeft.y, nppGUI._appPos.right, nppGUI._appPos.bottom, TRUE); + + ::GetModuleFileName(NULL, _nppPath, MAX_PATH); + + 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)) + { + ::SendMessage(_hSelf, NPPM_HIDETABBAR, 0, TRUE); + } + + if (nppGUI._rememberLastSession && !cmdLineParams->_isNoSession) + { + loadLastSession(); + } + + if (cmdLineParams->isPointValid()) + ::ShowWindow(_hSelf, SW_SHOW); + else + ::ShowWindow(_hSelf, nppGUI._isMaximized?SW_MAXIMIZE:SW_SHOW); + + if (cmdLine) + { + loadCommandlineParams(cmdLine, cmdLineParams); + } + + vector fileNames; + vector patterns; + patterns.push_back(TEXT("*.xml")); + + TCHAR tmp[MAX_PATH]; + lstrcpy(tmp, _nppPath); + ::PathRemoveFileSpec(tmp); + +#ifdef UNICODE + LocalizationSwitcher & localizationSwitcher = pNppParams->getLocalizationSwitcher(); + wstring localizationDir = tmp; + + localizationDir += TEXT("\\localization\\"); + getMatchedFileNames(localizationDir.c_str(), patterns, fileNames, false, false); + for (size_t i = 0 ; i < fileNames.size() ; i++) + { + localizationSwitcher.addLanguageFromXml(fileNames[i].c_str()); + } +#endif + + 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. + generic_string themeDir(pNppParams->getAppDataNppDir()); + themeDir.append(TEXT("\\themes\\")); + + getMatchedFileNames(themeDir.c_str(), patterns, fileNames, false, false); + for (size_t i = 0 ; i < fileNames.size() ; i++) + { + themeSwitcher.addThemeFromXml(fileNames[i].c_str()); + } + + fileNames.clear(); + themeDir.clear(); + themeDir.assign(tmp); + themeDir.append(TEXT("\\themes\\")); + getMatchedFileNames(themeDir.c_str(), patterns, fileNames, false, false); + for (size_t i = 0 ; i < fileNames.size() ; i++) + { + generic_string themeName( themeSwitcher.getThemeFromXmlFileName(fileNames[i].c_str()) ); + if (! themeSwitcher.themeNameExists(themeName.c_str()) ) + { + themeSwitcher.addThemeFromXml(fileNames[i].c_str()); + } + } + + // Notify plugins that Notepad++ is ready + SCNotification scnN; + scnN.nmhdr.code = NPPN_READY; + scnN.nmhdr.hwndFrom = _hSelf; + scnN.nmhdr.idFrom = 0; + _pluginsManager.notify(&scnN); +} + + + +void Notepad_plus::killAllChildren() +{ + _toolBar.destroy(); + _rebarTop.destroy(); + _rebarBottom.destroy(); + + if (_pMainSplitter) + { + _pMainSplitter->destroy(); + delete _pMainSplitter; + } + + _mainDocTab.destroy(); + _subDocTab.destroy(); + + _mainEditView.destroy(); + _subEditView.destroy(); + _invisibleEditView.destroy(); + + _subSplitter.destroy(); + _statusBar.destroy(); + + _scintillaCtrls4Plugins.destroy(); + _dockingManager.destroy(); +} + + +void Notepad_plus::destroy() +{ + ::DestroyWindow(_hSelf); +} + +bool Notepad_plus::saveGUIParams() +{ + NppGUI & nppGUI = (NppGUI &)(NppParameters::getInstance())->getNppGUI(); + nppGUI._statusBarShow = _statusBar.isVisible(); + nppGUI._toolbarShow = _rebarTop.getIDVisible(REBAR_BAR_TOOLBAR); + nppGUI._toolBarStatus = _toolBar.getState(); + + nppGUI._tabStatus = (TabBarPlus::doDragNDropOrNot()?TAB_DRAWTOPBAR:0) | \ + (TabBarPlus::drawTopBar()?TAB_DRAGNDROP:0) | \ + (TabBarPlus::drawInactiveTab()?TAB_DRAWINACTIVETAB:0) | \ + (_toReduceTabBar?TAB_REDUCE:0) | \ + (TabBarPlus::drawTabCloseButton()?TAB_CLOSEBUTTON:0) | \ + (TabBarPlus::isDbClk2Close()?TAB_DBCLK2CLOSE:0) | \ + (TabBarPlus::isVertical() ? TAB_VERTICAL:0) | \ + (TabBarPlus::isMultiLine() ? TAB_MULTILINE:0) |\ + (nppGUI._tabStatus & TAB_HIDE); + nppGUI._splitterPos = _subSplitter.isVertical()?POS_VERTICAL:POS_HORIZOTAL; + UserDefineDialog *udd = _pEditView->getUserDefineDlg(); + bool b = udd->isDocked(); + nppGUI._userDefineDlgStatus = (b?UDD_DOCKED:0) | (udd->isVisible()?UDD_SHOW:0); + + // Save the position + + WINDOWPLACEMENT posInfo; + + posInfo.length = sizeof(WINDOWPLACEMENT); + ::GetWindowPlacement(_hSelf, &posInfo); + + nppGUI._appPos.left = posInfo.rcNormalPosition.left; + nppGUI._appPos.top = posInfo.rcNormalPosition.top; + nppGUI._appPos.right = posInfo.rcNormalPosition.right - posInfo.rcNormalPosition.left; + nppGUI._appPos.bottom = posInfo.rcNormalPosition.bottom - posInfo.rcNormalPosition.top; + nppGUI._isMaximized = (IsZoomed(_hSelf) || (posInfo.flags & WPF_RESTORETOMAXIMIZED)); + + saveDockingParams(); + + return (NppParameters::getInstance())->writeGUIParams(); +} + +void Notepad_plus::saveDockingParams() +{ + NppGUI & nppGUI = (NppGUI &)(NppParameters::getInstance())->getNppGUI(); + + // Save the docking information + nppGUI._dockingData._leftWidth = _dockingManager.getDockedContSize(CONT_LEFT); + nppGUI._dockingData._rightWidth = _dockingManager.getDockedContSize(CONT_RIGHT); + nppGUI._dockingData._topHeight = _dockingManager.getDockedContSize(CONT_TOP); + nppGUI._dockingData._bottomHight = _dockingManager.getDockedContSize(CONT_BOTTOM); + + // clear the conatainer tab information (active tab) + nppGUI._dockingData._containerTabInfo.clear(); + + // create a vector to save the current information + vector vPluginDockInfo; + vector vFloatingWindowInfo; + + // save every container + vector vCont = _dockingManager.getContainerInfo(); + + for (size_t i = 0 ; i < vCont.size() ; i++) + { + // save at first the visible Tb's + vector vDataVis = vCont[i]->getDataOfVisTb(); + + for (size_t j = 0 ; j < vDataVis.size() ; j++) + { + if (vDataVis[j]->pszName && vDataVis[j]->pszName[0]) + { + PlugingDlgDockingInfo pddi(vDataVis[j]->pszModuleName, vDataVis[j]->dlgID, i, vDataVis[j]->iPrevCont, true); + vPluginDockInfo.push_back(pddi); + } + } + + // save the hidden Tb's + vector vDataAll = vCont[i]->getDataOfAllTb(); + + for (size_t j = 0 ; j < vDataAll.size() ; j++) + { + if ((vDataAll[j]->pszName && vDataAll[j]->pszName[0]) && (!vCont[i]->isTbVis(vDataAll[j]))) + { + PlugingDlgDockingInfo pddi(vDataAll[j]->pszModuleName, vDataAll[j]->dlgID, i, vDataAll[j]->iPrevCont, false); + vPluginDockInfo.push_back(pddi); + } + } + + // save the position, when container is a floated one + if (i >= DOCKCONT_MAX) + { + RECT rc; + vCont[i]->getWindowRect(rc); + FloatingWindowInfo fwi(i, rc.left, rc.top, rc.right, rc.bottom); + vFloatingWindowInfo.push_back(fwi); + } + + // save the active tab + ContainerTabInfo act(i, vCont[i]->getActiveTb()); + nppGUI._dockingData._containerTabInfo.push_back(act); + } + + // add the missing information and store it in nppGUI + UCHAR floatContArray[50]; + memset(floatContArray, 0, 50); + + for (size_t i = 0 ; i < nppGUI._dockingData._pluginDockInfo.size() ; i++) + { + BOOL isStored = FALSE; + for (size_t j = 0; j < vPluginDockInfo.size(); j++) + { + if (nppGUI._dockingData._pluginDockInfo[i] == vPluginDockInfo[j]) + { + isStored = TRUE; + break; + } + } + + if (isStored == FALSE) + { + int floatCont = 0; + + if (nppGUI._dockingData._pluginDockInfo[i]._currContainer >= DOCKCONT_MAX) + floatCont = nppGUI._dockingData._pluginDockInfo[i]._currContainer; + else + floatCont = nppGUI._dockingData._pluginDockInfo[i]._prevContainer; + + if (floatContArray[floatCont] == 0) + { + RECT *pRc = nppGUI._dockingData.getFloatingRCFrom(floatCont); + if (pRc) + vFloatingWindowInfo.push_back(FloatingWindowInfo(floatCont, pRc->left, pRc->top, pRc->right, pRc->bottom)); + floatContArray[floatCont] = 1; + } + + vPluginDockInfo.push_back(nppGUI._dockingData._pluginDockInfo[i]); + } + } + + nppGUI._dockingData._pluginDockInfo = vPluginDockInfo; + nppGUI._dockingData._flaotingWindowInfo = vFloatingWindowInfo; +} + +// return true if all the session files are loaded +// return false if one or more sessions files fail to load (and session is modify to remove invalid files) +bool Notepad_plus::loadSession(Session & session) +{ + bool allSessionFilesLoaded = true; + BufferID lastOpened = BUFFER_INVALID; + size_t i = 0; + showView(MAIN_VIEW); + switchEditViewTo(MAIN_VIEW); //open files in main + for ( ; i < session.nbMainFiles() ; ) + { + const TCHAR *pFn = session._mainViewFiles[i]._fileName.c_str(); + if (isFileSession(pFn)) { + vector::iterator posIt = session._mainViewFiles.begin() + i; + session._mainViewFiles.erase(posIt); + continue; //skip session files, not supporting recursive sessions + } + if (PathFileExists(pFn)) { + lastOpened = doOpen(pFn); + } else { + lastOpened = BUFFER_INVALID; + } + if (lastOpened != BUFFER_INVALID) + { + showView(MAIN_VIEW); + const TCHAR *pLn = session._mainViewFiles[i]._langName.c_str(); + int id = getLangFromMenuName(pLn); + LangType typeToSet = L_TXT; + if (id != 0 && lstrcmp(pLn, TEXT("User Defined")) != 0) + typeToSet = menuID2LangType(id); + if (typeToSet == L_EXTERNAL ) + typeToSet = (LangType)(id - IDM_LANG_EXTERNAL + L_EXTERNAL); + + Buffer * buf = MainFileManager->getBufferByID(lastOpened); + buf->setPosition(session._mainViewFiles[i], &_mainEditView); + buf->setLangType(typeToSet, pLn); + + //Force in the document so we can add the markers + //Dont use default methods because of performance + Document prevDoc = _mainEditView.execute(SCI_GETDOCPOINTER); + _mainEditView.execute(SCI_SETDOCPOINTER, 0, buf->getDocument()); + for (size_t j = 0 ; j < session._mainViewFiles[i].marks.size() ; j++) + { + _mainEditView.execute(SCI_MARKERADD, session._mainViewFiles[i].marks[j], MARK_BOOKMARK); + } + _mainEditView.execute(SCI_SETDOCPOINTER, 0, prevDoc); + i++; + } + else + { + vector::iterator posIt = session._mainViewFiles.begin() + i; + session._mainViewFiles.erase(posIt); + allSessionFilesLoaded = false; + } + } + + size_t k = 0; + showView(SUB_VIEW); + switchEditViewTo(SUB_VIEW); //open files in sub + for ( ; k < session.nbSubFiles() ; ) + { + const TCHAR *pFn = session._subViewFiles[k]._fileName.c_str(); + if (isFileSession(pFn)) { + vector::iterator posIt = session._subViewFiles.begin() + k; + session._subViewFiles.erase(posIt); + continue; //skip session files, not supporting recursive sessions + } + if (PathFileExists(pFn)) { + lastOpened = doOpen(pFn); + //check if already open in main. If so, clone + if (_mainDocTab.getIndexByBuffer(lastOpened) != -1) { + loadBufferIntoView(lastOpened, SUB_VIEW); + } + } else { + lastOpened = BUFFER_INVALID; + } + if (lastOpened != BUFFER_INVALID) + { + showView(SUB_VIEW); + if (canHideView(MAIN_VIEW)) + hideView(MAIN_VIEW); + const TCHAR *pLn = session._subViewFiles[k]._langName.c_str(); + int id = getLangFromMenuName(pLn); + LangType typeToSet = L_TXT; + if (id != 0) + typeToSet = menuID2LangType(id); + if (typeToSet == L_EXTERNAL ) + typeToSet = (LangType)(id - IDM_LANG_EXTERNAL + L_EXTERNAL); + + Buffer * buf = MainFileManager->getBufferByID(lastOpened); + buf->setPosition(session._subViewFiles[k], &_subEditView); + if (typeToSet == L_USER) { + if (!lstrcmp(pLn, TEXT("User Defined"))) { + pLn = TEXT(""); //default user defined + } + } + buf->setLangType(typeToSet, pLn); + + //Force in the document so we can add the markers + //Dont use default methods because of performance + Document prevDoc = _subEditView.execute(SCI_GETDOCPOINTER); + _subEditView.execute(SCI_SETDOCPOINTER, 0, buf->getDocument()); + for (size_t j = 0 ; j < session._subViewFiles[k].marks.size() ; j++) + { + _subEditView.execute(SCI_MARKERADD, session._subViewFiles[k].marks[j], MARK_BOOKMARK); + } + _subEditView.execute(SCI_SETDOCPOINTER, 0, prevDoc); + + k++; + } + else + { + vector::iterator posIt = session._subViewFiles.begin() + k; + session._subViewFiles.erase(posIt); + allSessionFilesLoaded = false; + } + } + + _mainEditView.restoreCurrentPos(); + _subEditView.restoreCurrentPos(); + + if (session._activeMainIndex < (size_t)_mainDocTab.nbItem())//session.nbMainFiles()) + activateBuffer(_mainDocTab.getBufferByIndex(session._activeMainIndex), MAIN_VIEW); + + if (session._activeSubIndex < (size_t)_subDocTab.nbItem())//session.nbSubFiles()) + activateBuffer(_subDocTab.getBufferByIndex(session._activeSubIndex), SUB_VIEW); + + if ((session.nbSubFiles() > 0) && (session._activeView == MAIN_VIEW || session._activeView == SUB_VIEW)) + switchEditViewTo(session._activeView); + else + switchEditViewTo(MAIN_VIEW); + + if (canHideView(otherView())) + hideView(otherView()); + else if (canHideView(currentView())) + hideView(currentView()); + return allSessionFilesLoaded; +} + +BufferID Notepad_plus::doOpen(const TCHAR *fileName, bool isReadOnly) +{ + TCHAR longFileName[MAX_PATH]; + + ::GetFullPathName(fileName, MAX_PATH, longFileName, NULL); + ::GetLongPathName(longFileName, longFileName, MAX_PATH); + + _lastRecentFileList.remove(longFileName); + + 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; + } + else + { + fileName2Find = longFileName; + } + + BufferID test = MainFileManager->getBufferFromName(fileName2Find); + if (test != BUFFER_INVALID) + { + //switchToFile(test); + //Dont switch, not responsibility of doOpen, but of caller + if (_pTrayIco) + { + if (_pTrayIco->isInTray()) + { + ::ShowWindow(_hSelf, SW_SHOW); + _pTrayIco->doTrayIcon(REMOVE); + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + } + } + return test; + } + + if (isFileSession(longFileName) && PathFileExists(longFileName)) + { + fileLoadSession(longFileName); + return BUFFER_INVALID; + } + + + + if (!PathFileExists(longFileName)) + { + TCHAR str2display[MAX_PATH*2]; + TCHAR longFileDir[MAX_PATH]; + + lstrcpy(longFileDir, longFileName); + PathRemoveFileSpec(longFileDir); + + if (PathFileExists(longFileDir)) + { + wsprintf(str2display, TEXT("%s doesn't exist. Create it?"), longFileName); + + if (::MessageBox(_hSelf, str2display, TEXT("Create new file"), MB_YESNO) == IDYES) + { + bool res = MainFileManager->createEmptyFile(longFileName); + if (!res) + { + wsprintf(str2display, TEXT("Cannot create the file \"%s\""), longFileName); + ::MessageBox(_hSelf, str2display, TEXT("Create new file"), MB_OK); + return BUFFER_INVALID; + } + } + else + { + return BUFFER_INVALID; + } + } + else + { + return BUFFER_INVALID; + } + } + + // Notify plugins that current file is about to load + // Plugins can should use this notification to filter SCN_MODIFIED + SCNotification scnN; + scnN.nmhdr.code = NPPN_FILEBEFORELOAD; + scnN.nmhdr.hwndFrom = _hSelf; + scnN.nmhdr.idFrom = NULL; + _pluginsManager.notify(&scnN); + + BufferID buffer = MainFileManager->loadFile(longFileName); + if (buffer != BUFFER_INVALID) + { + _isFileOpening = true; + + Buffer * buf = MainFileManager->getBufferByID(buffer); + // if file is read only, we set the view read only + if (isReadOnly) + buf->setUserReadOnly(true); + + // Notify plugins that current file is about to open + scnN.nmhdr.code = NPPN_FILEBEFOREOPEN; + scnN.nmhdr.idFrom = (uptr_t)buffer; + _pluginsManager.notify(&scnN); + + + loadBufferIntoView(buffer, currentView()); + + if (_pTrayIco) + { + if (_pTrayIco->isInTray()) + { + ::ShowWindow(_hSelf, SW_SHOW); + _pTrayIco->doTrayIcon(REMOVE); + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + } + } + PathRemoveFileSpec(longFileName); + _linkTriggered = true; + _isDocModifing = false; + + _isFileOpening = false; + + // Notify plugins that current file is just opened + scnN.nmhdr.code = NPPN_FILEOPENED; + _pluginsManager.notify(&scnN); + + return buffer; + } + else + { + if (::PathIsDirectory(fileName)) + { + //::MessageBox(_hSelf, fileName, TEXT("Dir"), MB_OK); + vector fileNames; + vector patterns; + patterns.push_back(TEXT("*.*")); + + generic_string fileNameStr = fileName; + if (fileName[lstrlen(fileName) - 1] != '\\') + fileNameStr += TEXT("\\"); + + getMatchedFileNames(fileNameStr.c_str(), patterns, fileNames, true, false); + for (size_t i = 0 ; i < fileNames.size() ; i++) + { + //::MessageBox(_hSelf, fileNames[i].c_str(), TEXT("Dir"), MB_OK); + doOpen(fileNames[i].c_str()); + } + } + else + { + TCHAR msg[MAX_PATH + 100]; + lstrcpy(msg, TEXT("Can not open file \"")); + //lstrcat(msg, fullPath); + lstrcat(msg, longFileName); + lstrcat(msg, TEXT("\".")); + ::MessageBox(_hSelf, msg, TEXT("ERR"), MB_OK); + _isFileOpening = false; + + scnN.nmhdr.code = NPPN_FILELOADFAILED; + _pluginsManager.notify(&scnN); + } + return BUFFER_INVALID; + } +} + + +bool Notepad_plus::doReload(BufferID id, bool alert) +{ + + /* + //No activation when reloading, defer untill document is actually visible + if (alert) { + switchToFile(id); + } + */ + if (alert) + { + if (::MessageBox(_hSelf, TEXT("Are you sure you want to reload the current file and lose the changes made in Notepad++?"), TEXT("Reload"), MB_YESNO | MB_ICONEXCLAMATION | MB_APPLMODAL) != IDYES) + return false; + } + + //In order to prevent Scintilla from restyling the entire document, + //an empty Document is inserted during reload if needed. + bool mainVisisble = (_mainEditView.getCurrentBufferID() == id); + bool subVisisble = (_subEditView.getCurrentBufferID() == id); + if (mainVisisble) { + _mainEditView.saveCurrentPos(); + _mainEditView.execute(SCI_SETDOCPOINTER, 0, 0); + } + if (subVisisble) { + _subEditView.saveCurrentPos(); + _subEditView.execute(SCI_SETDOCPOINTER, 0, 0); + } + + if (!mainVisisble && !subVisisble) { + return MainFileManager->reloadBufferDeferred(id); + } + + bool res = MainFileManager->reloadBuffer(id); + Buffer * pBuf = MainFileManager->getBufferByID(id); + if (mainVisisble) { + _mainEditView.execute(SCI_SETDOCPOINTER, 0, pBuf->getDocument()); + _mainEditView.restoreCurrentPos(); + } + if (subVisisble) { + _subEditView.execute(SCI_SETDOCPOINTER, 0, pBuf->getDocument()); + _subEditView.restoreCurrentPos(); + } + return res; +} + +bool Notepad_plus::doSave(BufferID id, const TCHAR * filename, bool isCopy) +{ + SCNotification scnN; + // Notify plugins that current file is about to be saved + if (!isCopy) + { + + scnN.nmhdr.code = NPPN_FILEBEFORESAVE; + scnN.nmhdr.hwndFrom = _hSelf; + scnN.nmhdr.idFrom = (uptr_t)id; + _pluginsManager.notify(&scnN); + } + + bool res = MainFileManager->saveBuffer(id, filename, isCopy); + + if (!isCopy) + { + scnN.nmhdr.code = NPPN_FILESAVED; + _pluginsManager.notify(&scnN); + } + + if (!res) + ::MessageBox(_hSelf, TEXT("Please check whether if this file is opened in another program"), TEXT("Save failed"), MB_OK); + return res; +} + +void Notepad_plus::doClose(BufferID id, int whichOne) { + Buffer * buf = MainFileManager->getBufferByID(id); + + // Notify plugins that current file is about to be closed + SCNotification scnN; + scnN.nmhdr.code = NPPN_FILEBEFORECLOSE; + scnN.nmhdr.hwndFrom = _hSelf; + scnN.nmhdr.idFrom = (uptr_t)id; + _pluginsManager.notify(&scnN); + + //add to recent files if its an existing file + if (!buf->isUntitled() && PathFileExists(buf->getFullPathName())) + { + _lastRecentFileList.add(buf->getFullPathName()); + } + + int nrDocs = whichOne==MAIN_VIEW?(_mainDocTab.nbItem()):(_subDocTab.nbItem()); + + //Do all the works + removeBufferFromView(id, whichOne); + if (nrDocs == 1 && canHideView(whichOne)) + { //close the view if both visible + hideView(whichOne); + } + + // Notify plugins that current file is closed + scnN.nmhdr.code = NPPN_FILECLOSED; + _pluginsManager.notify(&scnN); + + return; +} +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() +{ + BufferID buf = _pEditView->getCurrentBufferID(); + return doReload(buf, buf->isDirty()); +} + +generic_string exts2Filters(generic_string exts) { + const TCHAR *extStr = exts.c_str(); + TCHAR aExt[MAX_PATH]; + generic_string filters(TEXT("")); + + int j = 0; + bool stop = false; + for (size_t i = 0 ; i < exts.length() ; i++) + { + if (extStr[i] == ' ') + { + if (!stop) + { + aExt[j] = '\0'; + stop = true; + + if (aExt[0]) + { + filters += TEXT("*."); + filters += aExt; + filters += TEXT(";"); + } + j = 0; + } + } + else + { + aExt[j] = extStr[i]; + stop = false; + j++; + } + } + + if (j > 0) + { + aExt[j] = '\0'; + if (aExt[0]) + { + filters += TEXT("*."); + filters += aExt; + filters += TEXT(";"); + } + } + + // remove the last ';' + filters = filters.substr(0, filters.length()-1); + return filters; +}; + +void Notepad_plus::setFileOpenSaveDlgFilters(FileDialog & fDlg) +{ + NppParameters *pNppParam = NppParameters::getInstance(); + NppGUI & nppGUI = (NppGUI & )pNppParam->getNppGUI(); + + int i = 0; + Lang *l = NppParameters::getInstance()->getLangFromIndex(i++); + LangType curl = _pEditView->getCurrentBuffer()->getLangType(); + + while (l) + { + LangType lid = l->getLangID(); + + bool inExcludedList = false; + + for (size_t j = 0 ; j < nppGUI._excludedLangList.size() ; j++) + { + if (lid == nppGUI._excludedLangList[j]._langType) + { + inExcludedList = true; + break; + } + } + + if (!inExcludedList) + { + const TCHAR *defList = l->getDefaultExtList(); + const TCHAR *userList = NULL; + + LexerStylerArray &lsa = (NppParameters::getInstance())->getLStylerArray(); + const TCHAR *lName = l->getLangName(); + LexerStyler *pLS = lsa.getLexerStylerByName(lName); + + if (pLS) + userList = pLS->getLexerUserExt(); + + std::generic_string list(TEXT("")); + if (defList) + list += defList; + if (userList) + { + list += TEXT(" "); + list += userList; + } + + generic_string stringFilters = exts2Filters(list); + const TCHAR *filters = stringFilters.c_str(); + if (filters[0]) + { + int nbExt = fDlg.setExtsFilter(getLangDesc(lid, true).c_str(), filters); + } + } + l = (NppParameters::getInstance())->getLangFromIndex(i++); + } +} + +void Notepad_plus::fileOpen() +{ + FileDialog fDlg(_hSelf, _hInst); + fDlg.setExtFilter(TEXT("All types"), TEXT(".*"), NULL); + + setFileOpenSaveDlgFilters(fDlg); + + BufferID lastOpened = BUFFER_INVALID; + if (stringVector *pfns = fDlg.doOpenMultiFilesDlg()) + { + size_t sz = pfns->size(); + for (size_t i = 0 ; i < sz ; i++) { + BufferID test = doOpen(pfns->at(i).c_str(), fDlg.isReadOnly()); + if (test != BUFFER_INVALID) + lastOpened = test; + } + } + if (lastOpened != BUFFER_INVALID) { + switchToFile(lastOpened); + } +} + +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(); + if (*definedSessionExt != '\0') + { + TCHAR fncp[MAX_PATH]; + lstrcpy(fncp, filename); + TCHAR *pExt = PathFindExtension(fncp); + generic_string usrSessionExt = TEXT(""); + if (*definedSessionExt != '.') + { + usrSessionExt += TEXT("."); + } + usrSessionExt += definedSessionExt; + + if (!generic_stricmp(pExt, usrSessionExt.c_str())) + { + return true; + } + } + return false; +} + +bool Notepad_plus::fileSave(BufferID id) +{ + BufferID bufferID = id; + if (id == BUFFER_INVALID) + bufferID = _pEditView->getCurrentBufferID(); + Buffer * buf = MainFileManager->getBufferByID(bufferID); + + if (!buf->getFileReadOnly() && buf->isDirty()) //cannot save if readonly + { + const TCHAR *fn = buf->getFullPathName(); + if (buf->isUntitled()) + { + return fileSaveAs(id); + } + else + { + const NppGUI & nppgui = (NppParameters::getInstance())->getNppGUI(); + BackupFeature backup = nppgui._backup; + if (backup == bak_simple) + { + //copy fn to fn.backup + generic_string fn_bak(fn); + if ((nppgui._useDir) && (nppgui._backupDir[0] != '\0')) + { + TCHAR path[MAX_PATH]; + TCHAR *name; + + lstrcpy(path, fn); + name = ::PathFindFileName(path); + fn_bak = nppgui._backupDir; + fn_bak += TEXT("\\"); + fn_bak += name; + } + else + { + fn_bak = fn; + } + fn_bak += TEXT(".bak"); + ::CopyFile(fn, fn_bak.c_str(), FALSE); + } + else if (backup == bak_verbose) + { + TCHAR path[MAX_PATH]; + TCHAR *name; + generic_string fn_dateTime_bak; + + lstrcpy(path, fn); + + name = ::PathFindFileName(path); + ::PathRemoveFileSpec(path); + + if ((nppgui._useDir) && (nppgui._backupDir[0] != '\0')) + { + fn_dateTime_bak = nppgui._backupDir; + fn_dateTime_bak += TEXT("\\"); + } + else + { + const TCHAR *bakDir = TEXT("nppBackup"); + fn_dateTime_bak = path; + fn_dateTime_bak += TEXT("\\"); + fn_dateTime_bak += bakDir; + fn_dateTime_bak += TEXT("\\"); + + if (!::PathFileExists(fn_dateTime_bak.c_str())) + { + ::CreateDirectory(fn_dateTime_bak.c_str(), NULL); + } + } + + fn_dateTime_bak += name; + + const int temBufLen = 32; + TCHAR tmpbuf[temBufLen]; + time_t ltime = time(0); + struct tm *today; + + today = localtime(<ime); + generic_strftime(tmpbuf, temBufLen, TEXT("%Y-%m-%d_%H%M%S"), today); + + fn_dateTime_bak += TEXT("."); + fn_dateTime_bak += tmpbuf; + fn_dateTime_bak += TEXT(".bak"); + + ::CopyFile(fn, fn_dateTime_bak.c_str(), FALSE); + } + return doSave(bufferID, buf->getFullPathName(), false); + } + } + return false; +} + +bool Notepad_plus::fileSaveAll() { + if (viewVisible(MAIN_VIEW)) { + for(int i = 0; i < _mainDocTab.nbItem(); i++) { + BufferID idToSave = _mainDocTab.getBufferByIndex(i); + fileSave(idToSave); + } + } + + if (viewVisible(SUB_VIEW)) { + for(int i = 0; i < _subDocTab.nbItem(); i++) { + BufferID idToSave = _subDocTab.getBufferByIndex(i); + fileSave(idToSave); + } + } + return true; +} + +bool Notepad_plus::fileSaveAs(BufferID id, bool isSaveCopy) +{ + BufferID bufferID = id; + if (id == BUFFER_INVALID) + bufferID = _pEditView->getCurrentBufferID(); + Buffer * buf = MainFileManager->getBufferByID(bufferID); + + FileDialog fDlg(_hSelf, _hInst); + + fDlg.setExtFilter(TEXT("All types"), TEXT(".*"), NULL); + setFileOpenSaveDlgFilters(fDlg); + + fDlg.setDefFileName(buf->getFileName()); + TCHAR *pfn = fDlg.doSaveDlg(); + + if (pfn) + { + BufferID other = _pNonDocTab->findBufferByName(pfn); + if (other == BUFFER_INVALID) //can save, other view doesnt contain buffer + { + bool res = doSave(bufferID, pfn, isSaveCopy); + //buf->setNeedsLexing(true); //commented to fix wrapping being removed after save as (due to SCI_CLEARSTYLE or something, seems to be Scintilla bug) + //Changing lexer after save seems to work properly + return res; + } + else //cannot save, other view has buffer already open, activate it + { + ::MessageBox(_hSelf, TEXT("The file is already opened in the Notepad++."), TEXT("ERROR"), MB_OK | MB_ICONSTOP); + switchToFile(other); + return false; + } + } + else // cancel button is pressed + { + checkModifiedDocument(); + return false; + } +} + +bool Notepad_plus::fileRename(BufferID id, int curView) +{ + BufferID bufferID = id; + if (id == BUFFER_INVALID) + bufferID = _pEditView->getCurrentBufferID(); + Buffer * buf = MainFileManager->getBufferByID(bufferID); + + FileDialog fDlg(_hSelf, _hInst); + + fDlg.setExtFilter(TEXT("All types"), TEXT(".*"), NULL); + setFileOpenSaveDlgFilters(fDlg); + + fDlg.setDefFileName(buf->getFileName()); + TCHAR *pfn = fDlg.doSaveDlg(); + + if (pfn) + { + MainFileManager->moveFile(bufferID, pfn); + } + return false; +} + + +bool Notepad_plus::fileDelete(BufferID id, int curView) +{ + BufferID bufferID = id; + if (id == BUFFER_INVALID) + bufferID = _pEditView->getCurrentBufferID(); + + Buffer * buf = MainFileManager->getBufferByID(bufferID); + const TCHAR *fileNamePath = buf->getFullPathName(); + + if (doDeleteOrNot(fileNamePath) == IDYES) + { + if (!MainFileManager->deleteFile(bufferID)) + { + ::MessageBox(_hSelf, TEXT("Delete File failed"), TEXT("Delete File"), MB_OK); + return false; + } + doClose(bufferID, MAIN_VIEW); + doClose(bufferID, SUB_VIEW); + return true; + } + return false; +} + +bool Notepad_plus::fileClose(BufferID id, int curView) +{ + BufferID bufferID = id; + if (id == BUFFER_INVALID) + bufferID = _pEditView->getCurrentBufferID(); + Buffer * buf = MainFileManager->getBufferByID(bufferID); + + int res; + + //process the fileNamePath into LRF + const TCHAR *fileNamePath = buf->getFullPathName(); + + if (buf->isUntitled() && buf->docLength() == 0) + { + // Do nothing + } + else if (buf->isDirty()) + { + + res = doSaveOrNot(fileNamePath); + if (res == IDYES) + { + if (!fileSave(id)) // the cancel button of savedialog is pressed, aborts closing + return false; + } + else if (res == IDCANCEL) + { + return false; //cancel aborts closing + } + else + { + // else IDNO we continue + } + } + + int viewToClose = currentView(); + if (curView != -1) + viewToClose = curView; + //first check amount of documents, we dont want the view to hide if we closed a secondary doc with primary being empty + //int nrDocs = _pDocTab->nbItem(); + doClose(bufferID, viewToClose); + return true; +} + +bool Notepad_plus::fileCloseAll() +{ + //closes all documents, makes the current view the only one visible + + //first check if we need to save any file + for(int i = 0; i < _mainDocTab.nbItem(); i++) + { + BufferID id = _mainDocTab.getBufferByIndex(i); + Buffer * buf = MainFileManager->getBufferByID(id); + if (buf->isUntitled() && buf->docLength() == 0) + { + // Do nothing + } + else if (buf->isDirty()) + { + int res = doSaveOrNot(buf->getFullPathName()); + 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++) + { + BufferID id = _subDocTab.getBufferByIndex(i); + Buffer * buf = MainFileManager->getBufferByID(id); + if (buf->isUntitled() && buf->docLength() == 0) + { + // Do nothing + } + else if (buf->isDirty()) + { + int res = doSaveOrNot(buf->getFullPathName()); + if (res == IDYES) + { + if (!fileSave(id)) + return false; //abort entire procedure + } + else if (res == IDCANCEL) + { + return false; + //otherwise continue (IDNO) + } + } + } + + //Then start closing, inactive view first so the active is left open + if (bothActive()) + { //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()); + } + //hideView(otherView()); + } + + activateBuffer(_pDocTab->getBufferByIndex(0), currentView()); + for(int i = _pDocTab->nbItem() - 1; i >= 0; i--) { //close all from right to left + doClose(_pDocTab->getBufferByIndex(i), currentView()); + } + return true; +} + +bool Notepad_plus::fileCloseAllButCurrent() +{ + BufferID current = _pEditView->getCurrentBufferID(); + int active = _pDocTab->getCurrentTabIndex(); + //closes all documents, makes the current view the only one visible + + //first check if we need to save any file + for(int i = 0; i < _mainDocTab.nbItem(); i++) { + BufferID id = _mainDocTab.getBufferByIndex(i); + if (id == current) + continue; + Buffer * buf = MainFileManager->getBufferByID(id); + if (buf->isUntitled() && buf->docLength() == 0) + { + // Do nothing + } + else if (buf->isDirty()) + { + int res = doSaveOrNot(buf->getFullPathName()); + 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++) + { + BufferID id = _subDocTab.getBufferByIndex(i); + Buffer * buf = MainFileManager->getBufferByID(id); + if (id == current) + continue; + if (buf->isUntitled() && buf->docLength() == 0) + { + // Do nothing + } + else if (buf->isDirty()) + { + int res = doSaveOrNot(buf->getFullPathName()); + if (res == IDYES) + { + if (!fileSave(id)) + return false; //abort entire procedure + } + else if (res == IDCANCEL) + { + return false; + } + } + } + + //Then start closing, inactive view first so the active is left open + if (bothActive()) + { //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()); + } + //hideView(otherView()); + } + + activateBuffer(_pDocTab->getBufferByIndex(0), currentView()); + for(int i = _pDocTab->nbItem() - 1; i >= 0; i--) { //close all from right to left + if (i == active) { //dont close active index + continue; + } + doClose(_pDocTab->getBufferByIndex(i), currentView()); + } + return true; +} + +bool Notepad_plus::replaceAllFiles() { + + ScintillaEditView *pOldView = _pEditView; + _pEditView = &_invisibleEditView; + Document oldDoc = _invisibleEditView.execute(SCI_GETDOCPOINTER); + Buffer * oldBuf = _invisibleEditView.getCurrentBuffer(); //for manually setting the buffer, so notifications can be handled properly + + Buffer * pBuf = NULL; + + int nbTotal = 0; + const bool isEntireDoc = true; + + if (_mainWindowStatus & WindowMainActive) + { + for (int i = 0 ; i < _mainDocTab.nbItem() ; i++) + { + pBuf = MainFileManager->getBufferByID(_mainDocTab.getBufferByIndex(i)); + if (pBuf->isReadOnly()) + continue; + _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, pBuf->getDocument()); + _invisibleEditView.execute(SCI_SETCODEPAGE, pBuf->getUnicodeMode() == uni8Bit ? 0 : SC_CP_UTF8); + _invisibleEditView._currentBuffer = pBuf; + _invisibleEditView.execute(SCI_BEGINUNDOACTION); + nbTotal += _findReplaceDlg.processAll(ProcessReplaceAll, NULL, NULL, isEntireDoc, NULL); + _invisibleEditView.execute(SCI_ENDUNDOACTION); + } + } + + if (_mainWindowStatus & WindowSubActive) + { + for (int i = 0 ; i < _subDocTab.nbItem() ; i++) + { + pBuf = MainFileManager->getBufferByID(_subDocTab.getBufferByIndex(i)); + if (pBuf->isReadOnly()) + continue; + _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, pBuf->getDocument()); + _invisibleEditView.execute(SCI_SETCODEPAGE, pBuf->getUnicodeMode() == uni8Bit ? 0 : SC_CP_UTF8); + _invisibleEditView._currentBuffer = pBuf; + _invisibleEditView.execute(SCI_BEGINUNDOACTION); + nbTotal += _findReplaceDlg.processAll(ProcessReplaceAll, NULL, NULL, isEntireDoc, NULL); + _invisibleEditView.execute(SCI_ENDUNDOACTION); + } + } + + _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, oldDoc); + _invisibleEditView._currentBuffer = oldBuf; + _pEditView = pOldView; + + TCHAR result[64]; + if (nbTotal < 0) + lstrcpy(result, TEXT("The regular expression to search is formed badly")); + else + wsprintf(result, TEXT("%d occurrences replaced."), nbTotal); + + ::printStr(result); + + return true; +} + +bool Notepad_plus::matchInList(const TCHAR *fileName, const vector & patterns) +{ + for (size_t i = 0 ; i < patterns.size() ; i++) + { + if (PathMatchSpec(fileName, patterns[i].c_str())) + return true; + } + return false; +} + +void Notepad_plus::saveFindHistory() +{ + _findReplaceDlg.saveFindHistory(); + (NppParameters::getInstance())->writeFindHistory(); +} + +void Notepad_plus::saveUserDefineLangs() +{ + if (ScintillaEditView::getUserDefineDlg()->isDirty()) + (NppParameters::getInstance())->writeUserDefinedLang(); +} + +void Notepad_plus::saveShortcuts() +{ + NppParameters::getInstance()->writeShortcuts(); +} + +void Notepad_plus::saveSession(const Session & session) +{ + (NppParameters::getInstance())->writeSession(session); +} + +void Notepad_plus::doTrimTrailing() +{ + _pEditView->execute(SCI_BEGINUNDOACTION); + int nbLines = _pEditView->execute(SCI_GETLINECOUNT); + for (int line = 0 ; line < nbLines ; line++) + { + int lineStart = _pEditView->execute(SCI_POSITIONFROMLINE,line); + int lineEnd = _pEditView->execute(SCI_GETLINEENDPOSITION,line); + int i = lineEnd - 1; + char c = (char)_pEditView->execute(SCI_GETCHARAT,i); + + for ( ; (i >= lineStart) && (c == ' ') || (c == '\t') ; c = (char)_pEditView->execute(SCI_GETCHARAT,i)) + i--; + + if (i < (lineEnd - 1)) + _pEditView->replaceTarget(TEXT(""), i + 1, lineEnd); + } + _pEditView->execute(SCI_ENDUNDOACTION); +} + +void Notepad_plus::loadLastSession() +{ + Session lastSession = (NppParameters::getInstance())->getSession(); + loadSession(lastSession); +} + +void Notepad_plus::getMatchedFileNames(const TCHAR *dir, const vector & patterns, vector & fileNames, bool isRecursive, bool isInHiddenDir) +{ + generic_string dirFilter(dir); + dirFilter += TEXT("*.*"); + WIN32_FIND_DATA foundData; + + HANDLE hFile = ::FindFirstFile(dirFilter.c_str(), &foundData); + + if (hFile != INVALID_HANDLE_VALUE) + { + + if (foundData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (!isInHiddenDir && (foundData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) + { + // branles rien + } + else if (isRecursive) + { + if ((lstrcmp(foundData.cFileName, TEXT("."))) && (lstrcmp(foundData.cFileName, TEXT("..")))) + { + generic_string pathDir(dir); + pathDir += foundData.cFileName; + pathDir += TEXT("\\"); + getMatchedFileNames(pathDir.c_str(), patterns, fileNames, isRecursive, isInHiddenDir); + } + } + } + else + { + if (matchInList(foundData.cFileName, patterns)) + { + generic_string pathFile(dir); + pathFile += foundData.cFileName; + fileNames.push_back(pathFile.c_str()); + } + } + } + while (::FindNextFile(hFile, &foundData)) + { + if (foundData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + { + if (!isInHiddenDir && (foundData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)) + { + // branles rien + } + else if (isRecursive) + { + if ((lstrcmp(foundData.cFileName, TEXT("."))) && (lstrcmp(foundData.cFileName, TEXT("..")))) + { + generic_string pathDir(dir); + pathDir += foundData.cFileName; + pathDir += TEXT("\\"); + getMatchedFileNames(pathDir.c_str(), patterns, fileNames, isRecursive, isInHiddenDir); + } + } + } + else + { + if (matchInList(foundData.cFileName, patterns)) + { + generic_string pathFile(dir); + pathFile += foundData.cFileName; + fileNames.push_back(pathFile.c_str()); + } + } + } + ::FindClose(hFile); +} + +DWORD WINAPI AsyncCancelFindInFiles(LPVOID NppHWND) +{ + MessageBox((HWND) NULL, TEXT("Searching...\nPress Enter to Cancel"), TEXT("Find In Files"), MB_OK); + PostMessage((HWND) NppHWND, NPPM_INTERNAL_CANCEL_FIND_IN_FILES, 0, 0); + return 0; +} + +bool Notepad_plus::replaceInFiles() +{ + const TCHAR *dir2Search = _findReplaceDlg.getDir2Search(); + if (!dir2Search[0] || !::PathFileExists(dir2Search)) + { + return false; + } + + bool isRecursive = _findReplaceDlg.isRecursive(); + bool isInHiddenDir = _findReplaceDlg.isInHiddenDir(); + int nbTotal = 0; + + ScintillaEditView *pOldView = _pEditView; + _pEditView = &_invisibleEditView; + Document oldDoc = _invisibleEditView.execute(SCI_GETDOCPOINTER); + Buffer * oldBuf = _invisibleEditView.getCurrentBuffer(); //for manually setting the buffer, so notifications can be handled properly + Buffer * pBuf = NULL; + HANDLE CancelThreadHandle = NULL; + + vector patterns2Match; + _findReplaceDlg.getPatterns(patterns2Match); + if (patterns2Match.size() == 0) + { + _findReplaceDlg.setFindInFilesDirFilter(NULL, TEXT("*.*")); + _findReplaceDlg.getPatterns(patterns2Match); + } + vector fileNames; + + getMatchedFileNames(dir2Search, patterns2Match, fileNames, isRecursive, isInHiddenDir); + + if (fileNames.size() > 1) + CancelThreadHandle = ::CreateThread(NULL, 0, AsyncCancelFindInFiles, _hSelf, 0, NULL); + + bool dontClose = false; + for (size_t i = 0 ; i < fileNames.size() ; i++) + { + MSG msg; + if (PeekMessage(&msg, _hSelf, NPPM_INTERNAL_CANCEL_FIND_IN_FILES, NPPM_INTERNAL_CANCEL_FIND_IN_FILES, PM_REMOVE)) break; + + BufferID id = MainFileManager->getBufferFromName(fileNames.at(i).c_str()); + if (id != BUFFER_INVALID) + { + dontClose = true; + } + else + { + id = MainFileManager->loadFile(fileNames.at(i).c_str()); + dontClose = false; + } + + if (id != BUFFER_INVALID) + { + Buffer * pBuf = MainFileManager->getBufferByID(id); + _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, pBuf->getDocument()); + _invisibleEditView.execute(SCI_SETCODEPAGE, pBuf->getUnicodeMode() == uni8Bit ? 0 : SC_CP_UTF8); + _invisibleEditView._currentBuffer = pBuf; + + int nbReplaced = _findReplaceDlg.processAll(ProcessReplaceAll, NULL, NULL, true, fileNames.at(i).c_str()); + nbTotal += nbReplaced; + if (nbReplaced) + { + MainFileManager->saveBuffer(id, pBuf->getFullPathName()); + } + + if (!dontClose) + MainFileManager->closeBuffer(id, _pEditView); + } + } + + if (CancelThreadHandle) + TerminateThread(CancelThreadHandle, 0); + + _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, oldDoc); + _invisibleEditView._currentBuffer = oldBuf; + _pEditView = pOldView; + + TCHAR msg[128]; + wsprintf(msg, TEXT("%d occurences replaced"), nbTotal); + printStr(msg); + + return true; +} + +bool Notepad_plus::findInFiles() +{ + const TCHAR *dir2Search = _findReplaceDlg.getDir2Search(); + + if (!dir2Search[0] || !::PathFileExists(dir2Search)) + { + return false; + } + + bool isRecursive = _findReplaceDlg.isRecursive(); + bool isInHiddenDir = _findReplaceDlg.isInHiddenDir(); + int nbTotal = 0; + ScintillaEditView *pOldView = _pEditView; + _pEditView = &_invisibleEditView; + Document oldDoc = _invisibleEditView.execute(SCI_GETDOCPOINTER); + HANDLE CancelThreadHandle = NULL; + + vector patterns2Match; + _findReplaceDlg.getPatterns(patterns2Match); + if (patterns2Match.size() == 0) + { + _findReplaceDlg.setFindInFilesDirFilter(NULL, TEXT("*.*")); + _findReplaceDlg.getPatterns(patterns2Match); + } + vector fileNames; + getMatchedFileNames(dir2Search, patterns2Match, fileNames, isRecursive, isInHiddenDir); + + if (fileNames.size() > 1) + CancelThreadHandle = ::CreateThread(NULL, 0, AsyncCancelFindInFiles, _hSelf, 0, NULL); + + _findReplaceDlg.beginNewFilesSearch(); + + bool dontClose = false; + for (size_t i = 0 ; i < fileNames.size() ; i++) + { + MSG msg; + if (PeekMessage(&msg, _hSelf, NPPM_INTERNAL_CANCEL_FIND_IN_FILES, NPPM_INTERNAL_CANCEL_FIND_IN_FILES, PM_REMOVE)) break; + + BufferID id = MainFileManager->getBufferFromName(fileNames.at(i).c_str()); + if (id != BUFFER_INVALID) + { + dontClose = true; + } + else + { + id = MainFileManager->loadFile(fileNames.at(i).c_str()); + dontClose = false; + } + + if (id != BUFFER_INVALID) + { + Buffer * pBuf = MainFileManager->getBufferByID(id); + _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, pBuf->getDocument()); + _invisibleEditView.execute(SCI_SETCODEPAGE, pBuf->getUnicodeMode() == uni8Bit ? 0 : SC_CP_UTF8); + + nbTotal += _findReplaceDlg.processAll(ProcessFindAll, NULL, NULL, true, fileNames.at(i).c_str()); + if (!dontClose) + MainFileManager->closeBuffer(id, _pEditView); + } + } + + if (CancelThreadHandle) + TerminateThread(CancelThreadHandle, 0); + + _findReplaceDlg.finishFilesSearch(nbTotal); + + _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, oldDoc); + _pEditView = pOldView; + + _findReplaceDlg.putFindResult(nbTotal); + + FindHistory & findHistory = (NppParameters::getInstance())->getFindHistory(); + if (nbTotal && !findHistory._isDlgAlwaysVisible) + _findReplaceDlg.display(false); + return true; +} + + +bool Notepad_plus::findInOpenedFiles() +{ + int nbTotal = 0; + ScintillaEditView *pOldView = _pEditView; + _pEditView = &_invisibleEditView; + Document oldDoc = _invisibleEditView.execute(SCI_GETDOCPOINTER); + + Buffer * pBuf = NULL; + + const bool isEntireDoc = true; + + _findReplaceDlg.beginNewFilesSearch(); + + if (_mainWindowStatus & WindowMainActive) + { + for (int i = 0 ; i < _mainDocTab.nbItem() ; i++) + { + pBuf = MainFileManager->getBufferByID(_mainDocTab.getBufferByIndex(i)); + _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, pBuf->getDocument()); + _invisibleEditView.execute(SCI_SETCODEPAGE, pBuf->getUnicodeMode() == uni8Bit ? 0 : SC_CP_UTF8); + nbTotal += _findReplaceDlg.processAll(ProcessFindAll, NULL, NULL, isEntireDoc, pBuf->getFullPathName()); + } + } + + if (_mainWindowStatus & WindowSubActive) + { + for (int i = 0 ; i < _subDocTab.nbItem() ; i++) + { + pBuf = MainFileManager->getBufferByID(_subDocTab.getBufferByIndex(i)); + _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, pBuf->getDocument()); + _invisibleEditView.execute(SCI_SETCODEPAGE, pBuf->getUnicodeMode() == uni8Bit ? 0 : SC_CP_UTF8); + nbTotal += _findReplaceDlg.processAll(ProcessFindAll, NULL, NULL, isEntireDoc, pBuf->getFullPathName()); + } + } + + _findReplaceDlg.finishFilesSearch(nbTotal); + + _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, oldDoc); + _pEditView = pOldView; + + _findReplaceDlg.putFindResult(nbTotal); + + FindHistory & findHistory = (NppParameters::getInstance())->getFindHistory(); + if (nbTotal && !findHistory._isDlgAlwaysVisible) + _findReplaceDlg.display(false); + return true; +} + + +bool Notepad_plus::findInCurrentFile() +{ + int nbTotal = 0; + Buffer * pBuf = _pEditView->getCurrentBuffer(); + ScintillaEditView *pOldView = _pEditView; + _pEditView = &_invisibleEditView; + Document oldDoc = _invisibleEditView.execute(SCI_GETDOCPOINTER); + + const bool isEntireDoc = true; + + _findReplaceDlg.beginNewFilesSearch(); + + _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, pBuf->getDocument()); + _invisibleEditView.execute(SCI_SETCODEPAGE, pBuf->getUnicodeMode() == uni8Bit ? 0 : SC_CP_UTF8); + nbTotal += _findReplaceDlg.processAll(ProcessFindAll, NULL, NULL, isEntireDoc, pBuf->getFullPathName()); + + _findReplaceDlg.finishFilesSearch(nbTotal); + + _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, oldDoc); + _pEditView = pOldView; + + _findReplaceDlg.putFindResult(nbTotal); + + FindHistory & findHistory = (NppParameters::getInstance())->getFindHistory(); + if (nbTotal && !findHistory._isDlgAlwaysVisible) + _findReplaceDlg.display(false); + return true; +} + +void Notepad_plus::filePrint(bool showDialog) +{ + Printer printer; + + int startPos = int(_pEditView->execute(SCI_GETSELECTIONSTART)); + int endPos = int(_pEditView->execute(SCI_GETSELECTIONEND)); + + printer.init(_hInst, _hSelf, _pEditView, showDialog, startPos, endPos); + printer.doPrint(); +} + +void Notepad_plus::enableCommand(int cmdID, bool doEnable, int which) const +{ + if (which & MENU) + { + enableMenu(cmdID, doEnable); + } + if (which & TOOLBAR) + { + _toolBar.enable(cmdID, doEnable); + } +} + +void Notepad_plus::checkClipboard() +{ + bool hasSelection = _pEditView->execute(SCI_GETSELECTIONSTART) != _pEditView->execute(SCI_GETSELECTIONEND); + bool canPaste = (_pEditView->execute(SCI_CANPASTE) != 0); + enableCommand(IDM_EDIT_CUT, hasSelection, MENU | TOOLBAR); + enableCommand(IDM_EDIT_COPY, hasSelection, MENU | TOOLBAR); + enableCommand(IDM_EDIT_PASTE, canPaste, MENU | TOOLBAR); + enableCommand(IDM_EDIT_DELETE, hasSelection, MENU | TOOLBAR); + enableCommand(IDM_EDIT_UPPERCASE, hasSelection, MENU); + enableCommand(IDM_EDIT_LOWERCASE, hasSelection, MENU); + enableCommand(IDM_EDIT_BLOCK_COMMENT, hasSelection, MENU); + enableCommand(IDM_EDIT_BLOCK_COMMENT_SET, hasSelection, MENU); + enableCommand(IDM_EDIT_BLOCK_UNCOMMENT, hasSelection, MENU); + enableCommand(IDM_EDIT_STREAM_COMMENT, hasSelection, MENU); +} + +void Notepad_plus::checkDocState() +{ + Buffer * curBuf = _pEditView->getCurrentBuffer(); + + bool isCurrentDirty = curBuf->isDirty(); + bool isSeveralDirty = isCurrentDirty; + bool isFileExisting = PathFileExists(curBuf->getFullPathName()) != FALSE; + if (!isCurrentDirty) + { + for(int i = 0; i < MainFileManager->getNrBuffers(); i++) + { + if (MainFileManager->getBufferByIndex(i)->isDirty()) + { + isSeveralDirty = true; + break; + } + } + } + + bool isCurrentUntitled = curBuf->isUntitled(); + enableCommand(IDM_FILE_SAVE, isCurrentDirty, MENU | TOOLBAR); + enableCommand(IDM_FILE_SAVEALL, isSeveralDirty, MENU | TOOLBAR); + enableCommand(IDM_VIEW_GOTO_NEW_INSTANCE, !(isCurrentDirty || isCurrentUntitled), MENU); + enableCommand(IDM_VIEW_LOAD_IN_NEW_INSTANCE, !(isCurrentDirty || isCurrentUntitled), MENU); + + bool isSysReadOnly = curBuf->getFileReadOnly(); + if (isSysReadOnly) + { + ::CheckMenuItem(_mainMenuHandle, IDM_EDIT_SETREADONLY, MF_BYCOMMAND | MF_UNCHECKED); + enableCommand(IDM_EDIT_SETREADONLY, false, MENU); + enableCommand(IDM_EDIT_CLEARREADONLY, true, MENU); + } + else + { + enableCommand(IDM_EDIT_SETREADONLY, true, MENU); + enableCommand(IDM_EDIT_CLEARREADONLY, false, MENU); + 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); + + enableConvertMenuItems(curBuf->getFormat()); + checkUnicodeMenuItems(curBuf->getUnicodeMode()); + checkLangsMenu(-1); +} + +void Notepad_plus::checkUndoState() +{ + enableCommand(IDM_EDIT_UNDO, _pEditView->execute(SCI_CANUNDO) != 0, MENU | TOOLBAR); + enableCommand(IDM_EDIT_REDO, _pEditView->execute(SCI_CANREDO) != 0, MENU | TOOLBAR); +} + +void Notepad_plus::checkMacroState() +{ + enableCommand(IDM_MACRO_STARTRECORDINGMACRO, !_recordingMacro, MENU | TOOLBAR); + enableCommand(IDM_MACRO_STOPRECORDINGMACRO, _recordingMacro, MENU | TOOLBAR); + enableCommand(IDM_MACRO_PLAYBACKRECORDEDMACRO, !_macro.empty() && !_recordingMacro, MENU | TOOLBAR); + enableCommand(IDM_MACRO_SAVECURRENTMACRO, !_macro.empty() && !_recordingMacro, MENU | TOOLBAR); + + enableCommand(IDM_MACRO_RUNMULTIMACRODLG, (!_macro.empty() && !_recordingMacro) || !((NppParameters::getInstance())->getMacroList()).empty(), MENU | TOOLBAR); +} + +void Notepad_plus::checkSyncState() +{ + bool canDoSync = viewVisible(MAIN_VIEW) && viewVisible(SUB_VIEW); + if (!canDoSync) + { + _syncInfo._isSynScollV = false; + _syncInfo._isSynScollH = false; + checkMenuItem(IDM_VIEW_SYNSCROLLV, false); + checkMenuItem(IDM_VIEW_SYNSCROLLH, false); + _toolBar.setCheck(IDM_VIEW_SYNSCROLLV, false); + _toolBar.setCheck(IDM_VIEW_SYNSCROLLH, false); + } + enableCommand(IDM_VIEW_SYNSCROLLV, canDoSync, MENU | TOOLBAR); + enableCommand(IDM_VIEW_SYNSCROLLH, canDoSync, MENU | TOOLBAR); +} + +void Notepad_plus::checkLangsMenu(int id) const +{ + Buffer * curBuf = _pEditView->getCurrentBuffer(); + if (id == -1) + { + id = (NppParameters::getInstance())->langTypeToCommandID(curBuf->getLangType()); + if (id == IDM_LANG_USER) + { + if (curBuf->isUserDefineLangExt()) + { + const TCHAR *userLangName = curBuf->getUserDefineLangName(); + TCHAR menuLangName[16]; + + for (int i = IDM_LANG_USER + 1 ; i <= IDM_LANG_USER_LIMIT ; i++) + { + if (::GetMenuString(_mainMenuHandle, i, menuLangName, sizeof(menuLangName), MF_BYCOMMAND)) + if (!lstrcmp(userLangName, menuLangName)) + { + ::CheckMenuRadioItem(_mainMenuHandle, IDM_LANG_C, IDM_LANG_USER_LIMIT, i, MF_BYCOMMAND); + return; + } + } + } + } + } + ::CheckMenuRadioItem(_mainMenuHandle, IDM_LANG_C, IDM_LANG_USER_LIMIT, id, MF_BYCOMMAND); +} + +generic_string Notepad_plus::getLangDesc(LangType langType, bool shortDesc) +{ + + if ((langType >= L_EXTERNAL) && (langType < NppParameters::getInstance()->L_END)) + { + ExternalLangContainer & elc = NppParameters::getInstance()->getELCFromIndex(langType - L_EXTERNAL); + if (shortDesc) + return generic_string(elc._name); + else + return generic_string(elc._desc); + } + + generic_string str2Show = ScintillaEditView::langNames[langType].longName; + + if (langType == L_USER) + { + Buffer * currentBuf = _pEditView->getCurrentBuffer(); + if (currentBuf->isUserDefineLangExt()) + { + str2Show += TEXT(" - "); + str2Show += currentBuf->getUserDefineLangName(); + } + } + return str2Show; +} + +BOOL Notepad_plus::notify(SCNotification *notification) +{ + //Important, keep track of which element generated the message + bool isFromPrimary = (_mainEditView.getHSelf() == notification->nmhdr.hwndFrom || _mainDocTab.getHSelf() == notification->nmhdr.hwndFrom); + bool isFromSecondary = !isFromPrimary && (_subEditView.getHSelf() == notification->nmhdr.hwndFrom || _subDocTab.getHSelf() == notification->nmhdr.hwndFrom); + ScintillaEditView * notifyView = isFromPrimary?&_mainEditView:&_subEditView; + DocTabView *notifyDocTab = isFromPrimary?&_mainDocTab:&_subDocTab; + TBHDR * tabNotification = (TBHDR*) notification; + switch (notification->nmhdr.code) + { + case SCN_MODIFIED: + { + static bool prevWasEdit = false; + if (notification->modificationType & (SC_MOD_DELETETEXT | SC_MOD_INSERTTEXT)) + { + prevWasEdit = true; + _linkTriggered = true; + _isDocModifing = true; + ::InvalidateRect(notifyView->getHSelf(), NULL, TRUE); + } + + if (notification->modificationType & SC_MOD_CHANGEFOLD) + { + if (prevWasEdit) { + notifyView->foldChanged(notification->line, + notification->foldLevelNow, notification->foldLevelPrev); + prevWasEdit = false; + } + } + else if (!(notification->modificationType & (SC_MOD_DELETETEXT | SC_MOD_INSERTTEXT))) + { + prevWasEdit = false; + } +/* + if (!_isFileOpening && (isFromPrimary || isFromSecondary) && _pEditView->hasMarginShowed(ScintillaEditView::_SC_MARGE_MODIFMARKER)) + { + bool isProcessed = false; + + int fromLine = _pEditView->execute(SCI_LINEFROMPOSITION, notification->position); + pair undolevel = _pEditView->getLineUndoState(fromLine); + + if ((notification->modificationType & (SC_MOD_DELETETEXT | SC_MOD_INSERTTEXT)) && + (notification->modificationType & SC_PERFORMED_USER)) + { + //printStr(TEXT("user type")); + + _pEditView->setLineUndoState(fromLine, undolevel.first+1); + + _pEditView->execute(SCI_MARKERADD, fromLine, MARK_LINEMODIFIEDUNSAVED); + _pEditView->execute(undolevel.second?SCI_MARKERADD:SCI_MARKERDELETE, fromLine, MARK_LINEMODIFIEDSAVED); + + + if (notification->linesAdded > 0) + { + for (int i = 0 ; i < notification->linesAdded ; i++) + { + ++fromLine; + _pEditView->execute(SCI_MARKERADD, fromLine, MARK_LINEMODIFIEDUNSAVED); + pair modifInfo = _pEditView->getLineUndoState(fromLine); + _pEditView->execute(modifInfo.second?SCI_MARKERADD:SCI_MARKERDELETE, fromLine, MARK_LINEMODIFIEDSAVED); + } + } + } + + if ((notification->modificationType & (SC_MOD_DELETETEXT | SC_MOD_INSERTTEXT)) && + (notification->modificationType & SC_PERFORMED_REDO) && + (notification->modificationType & SC_MULTISTEPUNDOREDO)) + { + //printStr(TEXT("redo multiple")); + isProcessed = true; + + _pEditView->setLineUndoState(fromLine, undolevel.first+1); + + _pEditView->execute(SCI_MARKERADD, fromLine, MARK_LINEMODIFIEDUNSAVED); + if (notification->linesAdded > 0) + { + for (int i = 0 ; i < notification->linesAdded ; i++) + { + ++fromLine; + _pEditView->execute(SCI_MARKERADD, fromLine, MARK_LINEMODIFIEDUNSAVED); + pair modifInfo = _pEditView->getLineUndoState(fromLine); + _pEditView->execute(modifInfo.second?SCI_MARKERADD:SCI_MARKERDELETE, fromLine, MARK_LINEMODIFIEDSAVED); + } + } + } + + if ((notification->modificationType & (SC_MOD_DELETETEXT | SC_MOD_INSERTTEXT)) && + (notification->modificationType & SC_PERFORMED_UNDO) && + (notification->modificationType & SC_MULTISTEPUNDOREDO)) + { + //printStr(TEXT("undo multiple")); + isProcessed = true; + + --undolevel.first; + if (undolevel.first == 0) + { + _pEditView->execute(SCI_MARKERDELETE, fromLine, MARK_LINEMODIFIEDUNSAVED); + } + else + { + _pEditView->execute(SCI_MARKERADD, fromLine, MARK_LINEMODIFIEDUNSAVED); + } + _pEditView->execute(undolevel.second?SCI_MARKERADD:SCI_MARKERDELETE, fromLine, MARK_LINEMODIFIEDSAVED); + _pEditView->setLineUndoState(fromLine, undolevel.first); + + if (notification->linesAdded > 0) + { + for (int i = fromLine + 1 ; i < fromLine + notification->linesAdded ; i++) + { + pair level = _pEditView->getLineUndoState(i); + if (level.first > 0) + _pEditView->execute(SCI_MARKERADD, i, MARK_LINEMODIFIEDUNSAVED); + _pEditView->execute(level.second?SCI_MARKERADD:SCI_MARKERDELETE, fromLine, MARK_LINEMODIFIEDSAVED); + } + } + } + + if ((notification->modificationType & (SC_MOD_DELETETEXT | SC_MOD_INSERTTEXT)) && + (notification->modificationType & SC_PERFORMED_REDO) && + (notification->modificationType & SC_LASTSTEPINUNDOREDO) && !isProcessed) + { + //printStr(TEXT("redo LASTO")); + _pEditView->setLineUndoState(fromLine, undolevel.first+1); + + _pEditView->execute(SCI_MARKERADD, fromLine, MARK_LINEMODIFIEDUNSAVED); + _pEditView->execute(undolevel.second?SCI_MARKERADD:SCI_MARKERDELETE, fromLine, MARK_LINEMODIFIEDSAVED); + + if (notification->linesAdded > 0) + { + for (int i = 0 ; i < notification->linesAdded ; i++) + { + ++fromLine; + _pEditView->execute(SCI_MARKERADD, fromLine, MARK_LINEMODIFIEDUNSAVED); + pair modifInfo = _pEditView->getLineUndoState(fromLine); + _pEditView->execute(modifInfo.second?SCI_MARKERADD:SCI_MARKERDELETE, fromLine, MARK_LINEMODIFIEDSAVED); + } + } + } + + if ((notification->modificationType & (SC_MOD_DELETETEXT | SC_MOD_INSERTTEXT)) && + (notification->modificationType & SC_PERFORMED_UNDO) && + (notification->modificationType & SC_LASTSTEPINUNDOREDO) && !isProcessed) + { + //printStr(TEXT("undo LASTO")); + --undolevel.first; + if (undolevel.first == 0) + { + _pEditView->execute(SCI_MARKERDELETE, fromLine, MARK_LINEMODIFIEDUNSAVED); + } + else + { + _pEditView->execute(SCI_MARKERADD, fromLine, MARK_LINEMODIFIEDUNSAVED); + } + _pEditView->execute(undolevel.second?SCI_MARKERADD:SCI_MARKERDELETE, fromLine, MARK_LINEMODIFIEDSAVED); + _pEditView->setLineUndoState(fromLine, undolevel.first); + + if (notification->linesAdded > 0) + { + for (int i = fromLine + 1 ; i < fromLine + notification->linesAdded ; i++) + { + pair level = _pEditView->getLineUndoState(i); + if (level.first > 0) + _pEditView->execute(SCI_MARKERADD, i, MARK_LINEMODIFIEDUNSAVED); + _pEditView->execute(level.second?SCI_MARKERADD:SCI_MARKERDELETE, fromLine, MARK_LINEMODIFIEDSAVED); + } + } + } + } + */ + } + break; + + case SCN_SAVEPOINTREACHED: + case SCN_SAVEPOINTLEFT: + { + Buffer * buf = 0; + if (isFromPrimary) { + buf = _mainEditView.getCurrentBuffer(); + } else if (isFromSecondary) { + buf = _subEditView.getCurrentBuffer(); + } else { + //Done by invisibleEditView? + BufferID id = BUFFER_INVALID; + if (notification->nmhdr.hwndFrom == _invisibleEditView.getHSelf()) { + id = MainFileManager->getBufferFromDocument(_invisibleEditView.execute(SCI_GETDOCPOINTER)); + } else if (notification->nmhdr.hwndFrom == _fileEditView.getHSelf()) { + id = MainFileManager->getBufferFromDocument(_fileEditView.execute(SCI_GETDOCPOINTER)); + } else { + break; //wrong scintilla + } + if (id != BUFFER_INVALID) { + buf = MainFileManager->getBufferByID(id); + } else { + break; + } + } + buf->setDirty(notification->nmhdr.code == SCN_SAVEPOINTLEFT); + break; } + + case SCN_MODIFYATTEMPTRO : + // on fout rien + 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 + { + 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(_hSelf, itemUnitArray); + changeLangTabDrapContextMenu(); + } + _tabPopupDropMenu.display(p); + } + else if ((hWin == _pNonDocTab->getHSelf()) || + (hWin == _pNonEditView->getHSelf())) // In the another view group + { + docGotoAnotherEditView(isInCtrlStat?TransferClone:TransferMove); + } + + else + { + RECT nppZone; + ::GetWindowRect(_hSelf, &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); + TCHAR className[MAX_PATH]; + ::GetClassName(hWinParent,className, sizeof(className)); + if (lstrcmp(className, _className) == 0 && hWinParent != _hSelf) // 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()) + { + ::MessageBox(_hSelf, 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)_hInst, (LPARAM)&fileNamesData); + if (!isInCtrlStat) + { + fileClose(bufferToClose, iView); + if (noOpenedDoc()) + ::SendMessage(_hSelf, WM_CLOSE, 0, 0); + } + } + } + else // Not Notepad++, we open it here + { + docOpenInNewInstance(isInCtrlStat?TransferClone:TransferMove, p.x, p.y); + } + } + } + //break; + 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()) { //activate and use fileClose() (for save and abort) + activateBuffer(bufferToClose, iView); + fileClose(bufferToClose, iView); + break; + } + int open = 1; + if (isFromPrimary || isFromSecondary) + open = notifyDocTab->nbItem(); + doClose(bufferToClose, iView); + //if (open == 1 && canHideView(iView)) + // hideView(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()) + { + switchEditViewTo(MAIN_VIEW); + } + else if (notification->nmhdr.hwndFrom == _subDocTab.getHSelf()) + { + 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(_isRTL); + if (isFirstTime) + changeDlgLang(_goToLineDlg.getHSelf(), "GoToLine"); + } + } + break; + } + + case NM_RCLICK : + { + if (notification->nmhdr.hwndFrom == _mainDocTab.getHSelf()) + { + switchEditViewTo(MAIN_VIEW); + } + else if (notification->nmhdr.hwndFrom == _subDocTab.getHSelf()) + { + switchEditViewTo(SUB_VIEW); + } + else // From tool bar or Status Bar + return TRUE; + //break; + + POINT p; + ::GetCursorPos(&p); + + if (!_tabPopupMenu.isCreated()) + { + vector itemUnitArray; + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CLOSE, TEXT("Close me"))); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_CLOSEALL_BUT_CURRENT, TEXT("Close all but me"))); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_SAVE, TEXT("Save me"))); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_SAVEAS, TEXT("Save me As..."))); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_RENAME, TEXT("Rename me"))); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_DELETE, TEXT("Delete me"))); + itemUnitArray.push_back(MenuItemUnit(IDM_FILE_PRINT, TEXT("Print me"))); + 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("File name 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(_hSelf, itemUnitArray); + changeLangTabContextMenu(); + } + + 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); + + if (notification->margin == ScintillaEditView::_SC_MARGE_FOLDER) + { + _pEditView->marginClick(notification->position, notification->modifiers); + } + else if ((notification->margin == ScintillaEditView::_SC_MARGE_SYBOLE) && !notification->modifiers) + { + + int lineClick = int(_pEditView->execute(SCI_LINEFROMPOSITION, notification->position)); + if (!_pEditView->markerMarginClick(lineClick)) + bookmarkToggle(lineClick); + + } + break; + } + + case SCN_CHARADDED: + { + charAdded(static_cast(notification->ch)); + + AutoCompletion * autoC = isFromPrimary?&_autoCompleteMain:&_autoCompleteSub; + + autoC->update(notification->ch); + + break; + } + + case SCN_DOUBLECLICK : + { + if (_isHotspotDblClicked) + { + int pos = notifyView->execute(SCI_GETCURRENTPOS); + notifyView->execute(SCI_SETCURRENTPOS, pos); + notifyView->execute(SCI_SETANCHOR, pos); + _isHotspotDblClicked = false; + } + } + break; + + case SCN_UPDATEUI: + { + NppParameters *nppParam = NppParameters::getInstance(); + + // if it's searching/replacing, then do nothing + if (nppParam->_isFindReplacing) + break; + + if (notification->nmhdr.hwndFrom != _pEditView->getHSelf()) + break; + + braceMatch(); + + const NppGUI & nppGui = nppParam->getNppGUI(); + + if (nppGui._enableTagsMatchHilite) + { + XmlMatchedTagsHighlighter xmlTagMatchHiliter(_pEditView); + xmlTagMatchHiliter.tagMatch(nppGui._enableTagAttrsHilite); + } + + if (nppGui._enableSmartHilite) + _smartHighlighter.highlightView(notifyView); + + updateStatusBar(); + AutoCompletion * autoC = isFromPrimary?&_autoCompleteMain:&_autoCompleteSub; + autoC->update(0); + break; + } + + case SCN_SCROLLED: + { + const NppGUI & nppGUI = (NppParameters::getInstance())->getNppGUI(); + if (nppGUI._enableSmartHilite) + _smartHighlighter.highlightView(notifyView); + break; + } + + case TTN_GETDISPINFO: + { + LPTOOLTIPTEXT lpttt; + + lpttt = (LPTOOLTIPTEXT)notification; + lpttt->hinst = _hInst; + + POINT p; + ::GetCursorPos(&p); + ::ScreenToClient(_hSelf, &p); + HWND hWin = ::RealChildWindowFromPoint(_hSelf, p); + + static generic_string tip; + int id = int(lpttt->hdr.idFrom); + + if (hWin == _rebarTop.getHSelf()) + { + getNameStrFromCmd(id, tip); + } + else if (hWin == _mainDocTab.getHSelf()) + { + BufferID idd = _mainDocTab.getBufferByIndex(id); + Buffer * buf = MainFileManager->getBufferByID(idd); + tip = buf->getFullPathName(); + } + else if (hWin == _subDocTab.getHSelf()) + { + BufferID idd = _subDocTab.getBufferByIndex(id); + Buffer * buf = MainFileManager->getBufferByID(idd); + tip = buf->getFullPathName(); + } + else + break; + + lpttt->lpszText = (TCHAR *)tip.c_str(); + } + break; + + case SCN_ZOOM: + break; + + case SCN_MACRORECORD: + _macro.push_back(recordedMacroStep(notification->message, notification->wParam, notification->lParam)); + break; + + case SCN_PAINTED: + { + 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) + { + int urlAction = (NppParameters::getInstance())->getNppGUI()._styleURL; + if ((urlAction == 1) || (urlAction == 2)) + addHotSpot(_isDocModifing); + _linkTriggered = false; + _isDocModifing = false; + } + 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(urlHttpRegExpr), (LPARAM)urlHttpRegExpr); + if (posFound != -1) + { + startPos = int(notifyView->execute(SCI_GETTARGETSTART)); + endPos = int(notifyView->execute(SCI_GETTARGETEND)); + } + + TCHAR currentWord[MAX_PATH*2]; + notifyView->getGenericText(currentWord, startPos, endPos); + + ::ShellExecute(_hSelf, 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(_hSelf, 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 + switch(lpnm->wID) { + case REBAR_BAR_TOOLBAR: { + POINT pt; + pt.x = lpnm->rc.left; + pt.y = lpnm->rc.bottom; + ClientToScreen(notifRebar->getHSelf(), &pt); + _toolBar.doPopop(pt); + return TRUE; + break; } + } + //Else forward notification to window of rebarband + REBARBANDINFO rbBand; + rbBand.cbSize = sizeof(rbBand); + 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; +} + +void Notepad_plus::findMatchingBracePos(int & braceAtCaret, int & braceOpposite) +{ + int caretPos = int(_pEditView->execute(SCI_GETCURRENTPOS)); + braceAtCaret = -1; + braceOpposite = -1; + TCHAR charBefore = '\0'; + //TCHAR styleBefore = '\0'; + int lengthDoc = int(_pEditView->execute(SCI_GETLENGTH)); + + if ((lengthDoc > 0) && (caretPos > 0)) + { + charBefore = TCHAR(_pEditView->execute(SCI_GETCHARAT, caretPos - 1, 0)); + } + // Priority goes to character before caret + if (charBefore && generic_strchr(TEXT("[](){}"), charBefore)) + { + braceAtCaret = caretPos - 1; + } + + if (lengthDoc > 0 && (braceAtCaret < 0)) + { + // No brace found so check other side + TCHAR charAfter = TCHAR(_pEditView->execute(SCI_GETCHARAT, caretPos, 0)); + if (charAfter && generic_strchr(TEXT("[](){}"), charAfter)) + { + braceAtCaret = caretPos; + } + } + if (braceAtCaret >= 0) + braceOpposite = int(_pEditView->execute(SCI_BRACEMATCH, braceAtCaret, 0)); +} + + +void Notepad_plus::braceMatch() +{ + int braceAtCaret = -1; + int braceOpposite = -1; + findMatchingBracePos(braceAtCaret, braceOpposite); + + if ((braceAtCaret != -1) && (braceOpposite == -1)) + { + _pEditView->execute(SCI_BRACEBADLIGHT, braceAtCaret); + _pEditView->execute(SCI_SETHIGHLIGHTGUIDE); + } + else + { + _pEditView->execute(SCI_BRACEHIGHLIGHT, braceAtCaret, braceOpposite); + + if (_pEditView->isShownIndentGuide()) + { + int columnAtCaret = int(_pEditView->execute(SCI_GETCOLUMN, braceAtCaret)); + int columnOpposite = int(_pEditView->execute(SCI_GETCOLUMN, braceOpposite)); + _pEditView->execute(SCI_SETHIGHLIGHTGUIDE, (columnAtCaret < columnOpposite)?columnAtCaret:columnOpposite); + } + } + + enableCommand(IDM_SEARCH_GOTOMATCHINGBRACE, (braceAtCaret != -1) && (braceOpposite != -1), MENU | TOOLBAR); +} + +void Notepad_plus::charAdded(TCHAR chAdded) +{ + bool indentMaintain = NppParameters::getInstance()->getNppGUI()._maitainIndent; + if (indentMaintain) + MaintainIndentation(chAdded); +} + +void Notepad_plus::addHotSpot(bool docIsModifing) +{ + //bool docIsModifing = true; + int posBegin2style = 0; + if (docIsModifing) + posBegin2style = _pEditView->execute(SCI_GETCURRENTPOS); + + int endStyle = _pEditView->execute(SCI_GETENDSTYLED); + if (docIsModifing) + { + + posBegin2style = _pEditView->execute(SCI_GETCURRENTPOS); + if (posBegin2style > 0) posBegin2style--; + UCHAR ch = (UCHAR)_pEditView->execute(SCI_GETCHARAT, posBegin2style); + + // determinating the type of EOF to make sure how many steps should we be back + if ((ch == 0x0A) || (ch == 0x0D)) + { + int eolMode = _pEditView->execute(SCI_GETEOLMODE); + + if ((eolMode == SC_EOL_CRLF) && (posBegin2style > 1)) + posBegin2style -= 2; + else if (posBegin2style > 0) + posBegin2style -= 1; + } + + ch = (UCHAR)_pEditView->execute(SCI_GETCHARAT, posBegin2style); + while ((posBegin2style > 0) && ((ch != 0x0A) && (ch != 0x0D))) + { + ch = (UCHAR)_pEditView->execute(SCI_GETCHARAT, posBegin2style--); + } + } + int style_hotspot = 30; + + int startPos = 0; + int endPos = _pEditView->execute(SCI_GETTEXTLENGTH); + + _pEditView->execute(SCI_SETSEARCHFLAGS, SCFIND_REGEXP|SCFIND_POSIX); + + _pEditView->execute(SCI_SETTARGETSTART, startPos); + _pEditView->execute(SCI_SETTARGETEND, endPos); + + vector > hotspotStylers; + + int posFound = _pEditView->execute(SCI_SEARCHINTARGET, strlen(urlHttpRegExpr), (LPARAM)urlHttpRegExpr); + + while (posFound != -1) + { + int start = int(_pEditView->execute(SCI_GETTARGETSTART)); + int end = int(_pEditView->execute(SCI_GETTARGETEND)); + int foundTextLen = end - start; + int idStyle = _pEditView->execute(SCI_GETSTYLEAT, posFound); + + if (end < posBegin2style - 1) + { + if (style_hotspot > 1) + style_hotspot--; + } + else + { + int fs = -1; + for (size_t i = 0 ; i < hotspotStylers.size() ; i++) + { + if (hotspotStylers[i].second == idStyle) + { + fs = hotspotStylers[i].first; + break; + } + } + + if (fs != -1) + { + _pEditView->execute(SCI_STARTSTYLING, start, 0xFF); + _pEditView->execute(SCI_SETSTYLING, foundTextLen, fs); + + } + else + { + pair p(style_hotspot, idStyle); + hotspotStylers.push_back(p); + int activeFG = 0xFF0000; + + //TCHAR fontName[256]; + Style hotspotStyle; + + hotspotStyle._styleID = style_hotspot; + //_pEditView->execute(SCI_STYLEGETFONT, idStyle, (LPARAM)fontName); + hotspotStyle._fgColor = _pEditView->execute(SCI_STYLEGETFORE, idStyle); + hotspotStyle._bgColor = _pEditView->execute(SCI_STYLEGETBACK, idStyle); + hotspotStyle._fontSize = _pEditView->execute(SCI_STYLEGETSIZE, idStyle); + + int isBold = _pEditView->execute(SCI_STYLEGETBOLD, idStyle); + int isItalic = _pEditView->execute(SCI_STYLEGETITALIC, idStyle); + int isUnderline = _pEditView->execute(SCI_STYLEGETUNDERLINE, idStyle); + hotspotStyle._fontStyle = (isBold?FONTSTYLE_BOLD:0) | (isItalic?FONTSTYLE_ITALIC:0) | (isUnderline?FONTSTYLE_UNDERLINE:0); + + int fontStyle = (isBold?FONTSTYLE_BOLD:0) | (isItalic?FONTSTYLE_ITALIC:0) | (isUnderline?FONTSTYLE_UNDERLINE:0); + int urlAction = (NppParameters::getInstance())->getNppGUI()._styleURL; + if (urlAction == 2) + hotspotStyle._fontStyle |= FONTSTYLE_UNDERLINE; + + _pEditView->setStyle(hotspotStyle); + + _pEditView->execute(SCI_STYLESETHOTSPOT, style_hotspot, TRUE); + _pEditView->execute(SCI_SETHOTSPOTACTIVEFORE, TRUE, activeFG); + _pEditView->execute(SCI_SETHOTSPOTSINGLELINE, style_hotspot, 0); + _pEditView->execute(SCI_STARTSTYLING, start, 0x1F); + _pEditView->execute(SCI_SETSTYLING, foundTextLen, style_hotspot); + if (style_hotspot > 1) + style_hotspot--; + } + } + + _pEditView->execute(SCI_SETTARGETSTART, posFound + foundTextLen); + _pEditView->execute(SCI_SETTARGETEND, endPos); + + + posFound = _pEditView->execute(SCI_SEARCHINTARGET, strlen(urlHttpRegExpr), (LPARAM)urlHttpRegExpr); + } + + + _pEditView->execute(SCI_STARTSTYLING, endStyle, 0xFF); + _pEditView->execute(SCI_SETSTYLING, 0, 0); +} + + + +void Notepad_plus::MaintainIndentation(TCHAR ch) +{ + int eolMode = int(_pEditView->execute(SCI_GETEOLMODE)); + int curLine = int(_pEditView->getCurrentLineNumber()); + int lastLine = curLine - 1; + int indentAmount = 0; + + if (((eolMode == SC_EOL_CRLF || eolMode == SC_EOL_LF) && ch == '\n') || + (eolMode == SC_EOL_CR && ch == '\r')) + { + while (lastLine >= 0 && _pEditView->getLineLength(lastLine) == 0) + lastLine--; + + if (lastLine >= 0) { + indentAmount = _pEditView->getLineIndent(lastLine); + } + if (indentAmount > 0) { + _pEditView->setLineIndent(curLine, indentAmount); + } + } +} +void Notepad_plus::specialCmd(int id, int param) +{ + if ((param != 1) && (param != 2)) return; + + NppParameters *pNppParam = NppParameters::getInstance(); + ScintillaEditView *pEditView = (param == 1)?&_mainEditView:&_subEditView; + + switch (id) + { + case IDM_VIEW_LINENUMBER: + case IDM_VIEW_SYMBOLMARGIN: + //case IDM_VIEW_DOCCHANGEMARGIN: + case IDM_VIEW_FOLDERMAGIN: + { + int margin; + if (id == IDM_VIEW_LINENUMBER) + margin = ScintillaEditView::_SC_MARGE_LINENUMBER; + else if (id == IDM_VIEW_SYMBOLMARGIN) + margin = ScintillaEditView::_SC_MARGE_SYBOLE; + /* + else if (id == IDM_VIEW_DOCCHANGEMARGIN) + { + margin = ScintillaEditView::_SC_MARGE_MODIFMARKER; + } + */ + else + margin = ScintillaEditView::_SC_MARGE_FOLDER; + + if (pEditView->hasMarginShowed(margin)) + pEditView->showMargin(margin, false); + else + pEditView->showMargin(margin); + + break; + } + + case IDM_VIEW_FOLDERMAGIN_SIMPLE: + case IDM_VIEW_FOLDERMAGIN_ARROW: + case IDM_VIEW_FOLDERMAGIN_CIRCLE: + case IDM_VIEW_FOLDERMAGIN_BOX: + { + int checkedID = getFolderMarginStyle(); + if (checkedID == id) return; + folderStyle fStyle = (id == IDM_VIEW_FOLDERMAGIN_SIMPLE)?FOLDER_STYLE_SIMPLE:\ + ((id == IDM_VIEW_FOLDERMAGIN_ARROW)?FOLDER_STYLE_ARROW:\ + ((id == IDM_VIEW_FOLDERMAGIN_CIRCLE)?FOLDER_STYLE_CIRCLE:FOLDER_STYLE_BOX)); + pEditView->setMakerStyle(fStyle); + break; + } + + case IDM_VIEW_CURLINE_HILITING: + { + COLORREF colour = pNppParam->getCurLineHilitingColour(); + pEditView->setCurrentLineHiLiting(!_pEditView->isCurrentLineHiLiting(), colour); + break; + } + + case IDM_VIEW_EDGEBACKGROUND: + case IDM_VIEW_EDGELINE: + case IDM_VIEW_EDGENONE: + { + int mode; + switch (id) + { + case IDM_VIEW_EDGELINE: + { + mode = EDGE_LINE; + break; + } + case IDM_VIEW_EDGEBACKGROUND: + { + mode = EDGE_BACKGROUND; + break; + } + default : + mode = EDGE_NONE; + } + pEditView->execute(SCI_SETEDGEMODE, mode); + break; + } + + case IDM_SETTING_EDGE_SIZE : + { + ValueDlg nbColumnEdgeDlg; + ScintillaViewParams & svp = (ScintillaViewParams &)pNppParam->getSVP(param == 1?SCIV_PRIMARY:SCIV_SECOND); + nbColumnEdgeDlg.init(_hInst, _preference.getHSelf(), svp._edgeNbColumn, TEXT("Nb of column:")); + nbColumnEdgeDlg.setNBNumber(3); + + POINT p; + ::GetCursorPos(&p); + ::ScreenToClient(_hParent, &p); + int size = nbColumnEdgeDlg.doDialog(p, _isRTL); + + if (size != -1) + { + svp._edgeNbColumn = size; + pEditView->execute(SCI_SETEDGECOLUMN, size); + } + break; + } + } +} + +void Notepad_plus::command(int id) +{ + NppParameters *pNppParam = NppParameters::getInstance(); + switch (id) + { + case IDM_FILE_NEW: + { + fileNew(); + } + break; + + case IDM_FILE_OPEN: + fileOpen(); + break; + + case IDM_FILE_RELOAD: + fileReload(); + break; + + case IDM_FILE_CLOSE: + fileClose(); + break; + + case IDM_FILE_DELETE: + fileDelete(); + break; + + case IDM_FILE_RENAME: + fileRename(); + break; + + case IDM_FILE_CLOSEALL: + fileCloseAll(); + break; + + case IDM_FILE_CLOSEALL_BUT_CURRENT : + fileCloseAllButCurrent(); + break; + + case IDM_FILE_SAVE : + fileSave(); + break; + + case IDM_FILE_SAVEALL : + fileSaveAll(); + break; + + case IDM_FILE_SAVEAS : + fileSaveAs(); + break; + + case IDM_FILE_SAVECOPYAS : + fileSaveAs(BUFFER_INVALID, true); + break; + + case IDM_FILE_LOADSESSION: + fileLoadSession(); + break; + + case IDM_FILE_SAVESESSION: + fileSaveSession(); + break; + + case IDM_FILE_PRINTNOW : + filePrint(false); + break; + + case IDM_FILE_PRINT : + filePrint(true); + break; + + case IDM_FILE_EXIT: + ::SendMessage(_hSelf, WM_CLOSE, 0, 0); + break; + + case IDM_EDIT_UNDO: + _pEditView->execute(WM_UNDO); + checkClipboard(); + checkUndoState(); + break; + + case IDM_EDIT_REDO: + _pEditView->execute(SCI_REDO); + checkClipboard(); + checkUndoState(); + break; + + case IDM_EDIT_CUT: + _pEditView->execute(WM_CUT); + checkClipboard(); + break; + + case IDM_EDIT_COPY: + _pEditView->execute(WM_COPY); + checkClipboard(); + break; + + case IDM_EDIT_PASTE: + { + int eolMode = int(_pEditView->execute(SCI_GETEOLMODE)); + _pEditView->execute(SCI_PASTE); + _pEditView->execute(SCI_CONVERTEOLS, eolMode); + } + break; + + case IDM_EDIT_DELETE: + _pEditView->execute(WM_CLEAR); + break; + + case IDM_MACRO_STARTRECORDINGMACRO: + case IDM_MACRO_STOPRECORDINGMACRO: + case IDC_EDIT_TOGGLEMACRORECORDING: + { + //static HCURSOR originalCur; + + if (_recordingMacro) + { + // STOP !!! + _mainEditView.execute(SCI_STOPRECORD); + //_mainEditView.execute(SCI_ENDUNDOACTION); + _subEditView.execute(SCI_STOPRECORD); + //_subEditView.execute(SCI_ENDUNDOACTION); + + //::SetCursor(originalCur); + _mainEditView.execute(SCI_SETCURSOR, (LPARAM)SC_CURSORNORMAL); + _subEditView.execute(SCI_SETCURSOR, (LPARAM)SC_CURSORNORMAL); + + _recordingMacro = false; + _runMacroDlg.initMacroList(); + } + else + { + //originalCur = ::LoadCursor(_hInst, MAKEINTRESOURCE(IDC_MACRO_RECORDING)); + //::SetCursor(originalCur); + _mainEditView.execute(SCI_SETCURSOR, 9); + _subEditView.execute(SCI_SETCURSOR, 9); + _macro.clear(); + + // START !!! + _mainEditView.execute(SCI_STARTRECORD); + //_mainEditView.execute(SCI_BEGINUNDOACTION); + + _subEditView.execute(SCI_STARTRECORD); + //_subEditView.execute(SCI_BEGINUNDOACTION); + _recordingMacro = true; + } + checkMacroState(); + break; + } + + case IDM_MACRO_PLAYBACKRECORDEDMACRO: + if (!_recordingMacro) // if we're not currently recording, then playback the recorded keystrokes + { + _pEditView->execute(SCI_BEGINUNDOACTION); + + for (Macro::iterator step = _macro.begin(); step != _macro.end(); step++) + step->PlayBack(this, _pEditView); + + _pEditView->execute(SCI_ENDUNDOACTION); + } + break; + + case IDM_MACRO_RUNMULTIMACRODLG : + { + if (!_recordingMacro) // if we're not currently recording, then playback the recorded keystrokes + { + bool isFirstTime = !_runMacroDlg.isCreated(); + _runMacroDlg.doDialog(_isRTL); + + if (isFirstTime) + { + changeDlgLang(_runMacroDlg.getHSelf(), "MultiMacro"); + } + break; + + } + } + break; + + case IDM_MACRO_SAVECURRENTMACRO : + { + if (addCurrentMacro()) + _runMacroDlg.initMacroList(); + break; + } + case IDM_EDIT_FULLPATHTOCLIP : + case IDM_EDIT_CURRENTDIRTOCLIP : + case IDM_EDIT_FILENAMETOCLIP : + { + Buffer * buf = _pEditView->getCurrentBuffer(); + if (id == IDM_EDIT_FULLPATHTOCLIP) { + str2Cliboard(buf->getFullPathName()); + } else if (id == IDM_EDIT_CURRENTDIRTOCLIP) { + TCHAR dir[MAX_PATH]; + lstrcpy(dir, buf->getFullPathName()); + PathRemoveFileSpec((TCHAR *)dir); + str2Cliboard(dir); + } else if (id == IDM_EDIT_FILENAMETOCLIP) { + str2Cliboard(buf->getFileName()); + } + } + break; + + case IDM_SEARCH_FIND : + case IDM_SEARCH_REPLACE : + { + const int strSize = FINDREPLACE_MAXLENGTH; + TCHAR str[strSize]; + + bool isFirstTime = !_findReplaceDlg.isCreated(); + + _findReplaceDlg.doDialog((id == IDM_SEARCH_FIND)?FIND_DLG:REPLACE_DLG, _isRTL); + + _pEditView->getGenericSelectedText(str, strSize); + _findReplaceDlg.setSearchText(str); + setFindReplaceFolderFilter(NULL, NULL); + + if (isFirstTime) + changeFindReplaceDlgLang(); + break; + } + + case IDM_SEARCH_FINDINFILES : + { + ::SendMessage(_hSelf, NPPM_LAUNCHFINDINFILESDLG, 0, 0); + break; + } + case IDM_SEARCH_FINDINCREMENT : + { + const int strSize = FINDREPLACE_MAXLENGTH; + TCHAR str[strSize]; + + _pEditView->getGenericSelectedText(str, strSize); + _incrementFindDlg.setSearchText(str, _pEditView->getCurrentBuffer()->getUnicodeMode() != uni8Bit); + + _incrementFindDlg.display(); + } + break; + + case IDM_SEARCH_FINDNEXT : + case IDM_SEARCH_FINDPREV : + { + if (!_findReplaceDlg.isCreated()) + return; + + FindOption op = _findReplaceDlg.getCurrentOptions(); + op._whichDirection = (id == IDM_SEARCH_FINDNEXT?DIR_DOWN:DIR_UP); + generic_string s = _findReplaceDlg.getText2search(); + + _findReplaceDlg.processFindNext(s.c_str(), &op); + break; + } + break; + + case NPPM_INTERNAL_SEARCH_GOTONEXTFOUND: + { + _findReplaceDlg.gotoNextFoundResult(); + break; + } + case NPPM_INTERNAL_SEARCH_GOTOPREVFOUND: + { + _findReplaceDlg.gotoNextFoundResult(-1); + break; + } + case NPPM_INTERNAL_FOCUS_ON_FOUND_RESULTS: + { + if (GetFocus() == _findReplaceDlg.getHFindResults()) + // focus already on found results, switch to current edit view + switchEditViewTo(currentView()); + else + _findReplaceDlg.focusOnFinder(); + break; + } + case IDM_SEARCH_VOLATILE_FINDNEXT : + case IDM_SEARCH_VOLATILE_FINDPREV : + { + TCHAR text2Find[MAX_PATH]; + _pEditView->getGenericSelectedText(text2Find, MAX_PATH); + + FindOption op; + op._isWholeWord = false; + op._whichDirection = (id == IDM_SEARCH_VOLATILE_FINDNEXT?DIR_DOWN:DIR_UP); + _findReplaceDlg.processFindNext(text2Find, &op); + break; + } + + case IDM_SEARCH_MARKALLEXT1 : + case IDM_SEARCH_MARKALLEXT2 : + case IDM_SEARCH_MARKALLEXT3 : + case IDM_SEARCH_MARKALLEXT4 : + case IDM_SEARCH_MARKALLEXT5 : + { + int styleID; + if (id == IDM_SEARCH_MARKALLEXT1) + styleID = SCE_UNIVERSAL_FOUND_STYLE_EXT1; + else if (id == IDM_SEARCH_MARKALLEXT2) + styleID = SCE_UNIVERSAL_FOUND_STYLE_EXT2; + else if (id == IDM_SEARCH_MARKALLEXT3) + styleID = SCE_UNIVERSAL_FOUND_STYLE_EXT3; + else if (id == IDM_SEARCH_MARKALLEXT4) + styleID = SCE_UNIVERSAL_FOUND_STYLE_EXT4; + else // (id == IDM_SEARCH_MARKALLEXT5) + styleID = SCE_UNIVERSAL_FOUND_STYLE_EXT5; + + const int strSize = FINDREPLACE_MAXLENGTH; + TCHAR text2Find[strSize]; + _pEditView->getGenericSelectedText(text2Find, strSize); + + _findReplaceDlg.markAll(text2Find, styleID); + + break; + } + case IDM_SEARCH_UNMARKALLEXT1 : + case IDM_SEARCH_UNMARKALLEXT2 : + case IDM_SEARCH_UNMARKALLEXT3 : + case IDM_SEARCH_UNMARKALLEXT4 : + case IDM_SEARCH_UNMARKALLEXT5 : + { + int styleID; + if (id == IDM_SEARCH_UNMARKALLEXT1) + styleID = SCE_UNIVERSAL_FOUND_STYLE_EXT1; + else if (id == IDM_SEARCH_UNMARKALLEXT2) + styleID = SCE_UNIVERSAL_FOUND_STYLE_EXT2; + else if (id == IDM_SEARCH_UNMARKALLEXT3) + styleID = SCE_UNIVERSAL_FOUND_STYLE_EXT3; + else if (id == IDM_SEARCH_UNMARKALLEXT4) + styleID = SCE_UNIVERSAL_FOUND_STYLE_EXT4; + else // (id == IDM_SEARCH_UNMARKALLEXT5) + styleID = SCE_UNIVERSAL_FOUND_STYLE_EXT5; + + _pEditView->clearIndicator(styleID); + break; + } + + case IDM_SEARCH_CLEARALLMARKS : + { + _pEditView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_EXT1); + _pEditView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_EXT2); + _pEditView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_EXT3); + _pEditView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_EXT4); + _pEditView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_EXT5); + break; + } + + case IDM_SEARCH_GOTOLINE : + { + bool isFirstTime = !_goToLineDlg.isCreated(); + _goToLineDlg.doDialog(_isRTL); + if (isFirstTime) + changeDlgLang(_goToLineDlg.getHSelf(), "GoToLine"); + break; + } + + case IDM_EDIT_COLUMNMODE : + { + bool isFirstTime = !_colEditorDlg.isCreated(); + _colEditorDlg.doDialog(_isRTL); + if (isFirstTime) + changeDlgLang(_colEditorDlg.getHSelf(), "ColumnEditor"); + break; + } + + case IDM_SEARCH_GOTOMATCHINGBRACE : + { + int braceAtCaret = -1; + int braceOpposite = -1; + findMatchingBracePos(braceAtCaret, braceOpposite); + + if (braceOpposite != -1) + _pEditView->execute(SCI_GOTOPOS, braceOpposite); + break; + } + + case IDM_SEARCH_TOGGLE_BOOKMARK : + bookmarkToggle(-1); + break; + + case IDM_SEARCH_NEXT_BOOKMARK: + bookmarkNext(true); + break; + + case IDM_SEARCH_PREV_BOOKMARK: + bookmarkNext(false); + break; + + case IDM_SEARCH_CLEAR_BOOKMARKS: + bookmarkClearAll(); + break; + + case IDM_VIEW_USER_DLG : + { + bool isUDDlgVisible = false; + + UserDefineDialog *udd = _pEditView->getUserDefineDlg(); + + if (!udd->isCreated()) + { + _pEditView->doUserDefineDlg(true, _isRTL); + changeUserDefineLang(); + if (_isUDDocked) + ::SendMessage(udd->getHSelf(), WM_COMMAND, IDC_DOCK_BUTTON, 0); + + } + else + { + isUDDlgVisible = udd->isVisible(); + bool isUDDlgDocked = udd->isDocked(); + + if ((isUDDlgDocked)&&(isUDDlgVisible)) + { + ::ShowWindow(_pMainSplitter->getHSelf(), SW_HIDE); + + if (bothActive()) + _pMainWindow = &_subSplitter; + else + _pMainWindow = _pDocTab; + + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + + udd->display(false); + _mainWindowStatus &= ~WindowUserActive; + } + else if ((isUDDlgDocked)&&(!isUDDlgVisible)) + { + if (!_pMainSplitter) + { + _pMainSplitter = new SplitterContainer; + _pMainSplitter->init(_hInst, _hSelf); + + Window *pWindow; + if (bothActive()) + pWindow = &_subSplitter; + else + pWindow = _pDocTab; + + _pMainSplitter->create(pWindow, ScintillaEditView::getUserDefineDlg(), 8, RIGHT_FIX, 45); + } + + _pMainWindow = _pMainSplitter; + + _pMainSplitter->setWin0((bothActive())?(Window *)&_subSplitter:(Window *)_pDocTab); + + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + _pMainWindow->display(); + + _mainWindowStatus |= WindowUserActive; + } + else if ((!isUDDlgDocked)&&(isUDDlgVisible)) + { + udd->display(false); + } + else //((!isUDDlgDocked)&&(!isUDDlgVisible)) + udd->display(); + } + checkMenuItem(IDM_VIEW_USER_DLG, !isUDDlgVisible); + _toolBar.setCheck(IDM_VIEW_USER_DLG, !isUDDlgVisible); + + break; + } + + case IDM_EDIT_SELECTALL: + _pEditView->execute(SCI_SELECTALL); + checkClipboard(); + break; + + case IDM_EDIT_INS_TAB: + _pEditView->execute(SCI_TAB); + break; + + case IDM_EDIT_RMV_TAB: + _pEditView->execute(SCI_BACKTAB); + break; + + case IDM_EDIT_DUP_LINE: + _pEditView->execute(SCI_LINEDUPLICATE); + break; + + case IDM_EDIT_SPLIT_LINES: + _pEditView->execute(SCI_TARGETFROMSELECTION); + _pEditView->execute(SCI_LINESSPLIT); + break; + + case IDM_EDIT_JOIN_LINES: + _pEditView->execute(SCI_TARGETFROMSELECTION); + _pEditView->execute(SCI_LINESJOIN); + break; + + case IDM_EDIT_LINE_UP: + _pEditView->currentLineUp(); + break; + + case IDM_EDIT_LINE_DOWN: + _pEditView->currentLineDown(); + break; + + case IDM_EDIT_UPPERCASE: + _pEditView->convertSelectedTextToUpperCase(); + break; + + case IDM_EDIT_LOWERCASE: + _pEditView->convertSelectedTextToLowerCase(); + break; + + case IDM_EDIT_BLOCK_COMMENT: + doBlockComment(cm_toggle); + break; + + case IDM_EDIT_BLOCK_COMMENT_SET: + doBlockComment(cm_comment); + break; + + case IDM_EDIT_BLOCK_UNCOMMENT: + doBlockComment(cm_uncomment); + break; + + case IDM_EDIT_STREAM_COMMENT: + doStreamComment(); + break; + + case IDM_EDIT_TRIMTRAILING: + doTrimTrailing(); + break; + + case IDM_EDIT_SETREADONLY: + { + Buffer * buf = _pEditView->getCurrentBuffer(); + buf->setUserReadOnly(!buf->getUserReadOnly()); + } + break; + + case IDM_EDIT_CLEARREADONLY: + { + Buffer * buf = _pEditView->getCurrentBuffer(); + + DWORD dwFileAttribs = ::GetFileAttributes(buf->getFullPathName()); + dwFileAttribs ^= FILE_ATTRIBUTE_READONLY; + + ::SetFileAttributes(buf->getFullPathName(), dwFileAttribs); + + buf->setFileReadOnly(false); + } + break; + + case IDM_SEARCH_CUTMARKEDLINES : + cutMarkedLines(); + break; + + case IDM_SEARCH_COPYMARKEDLINES : + copyMarkedLines(); + break; + + case IDM_SEARCH_PASTEMARKEDLINES : + pasteToMarkedLines(); + break; + + case IDM_SEARCH_DELETEMARKEDLINES : + deleteMarkedLines(); + break; + + case IDM_VIEW_FULLSCREENTOGGLE : + fullScreenToggle(); + break; + + case IDM_VIEW_ALWAYSONTOP: + { + int check = (::GetMenuState(_mainMenuHandle, id, MF_BYCOMMAND) == MF_CHECKED)?MF_UNCHECKED:MF_CHECKED; + ::CheckMenuItem(_mainMenuHandle, id, MF_BYCOMMAND | check); + SetWindowPos(_hSelf, check == MF_CHECKED?HWND_TOPMOST:HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE); + } + break; + + + case IDM_VIEW_FOLD_CURRENT : + case IDM_VIEW_UNFOLD_CURRENT : + _pEditView->foldCurrentPos((id==IDM_VIEW_FOLD_CURRENT)?fold_collapse:fold_uncollapse); + break; + + case IDM_VIEW_TOGGLE_FOLDALL: + case IDM_VIEW_TOGGLE_UNFOLDALL: + { + _pEditView->foldAll((id==IDM_VIEW_TOGGLE_FOLDALL)?fold_collapse:fold_uncollapse); + } + break; + + case IDM_VIEW_FOLD_1: + case IDM_VIEW_FOLD_2: + case IDM_VIEW_FOLD_3: + case IDM_VIEW_FOLD_4: + case IDM_VIEW_FOLD_5: + case IDM_VIEW_FOLD_6: + case IDM_VIEW_FOLD_7: + case IDM_VIEW_FOLD_8: + _pEditView->collapse(id - IDM_VIEW_FOLD - 1, fold_collapse); + break; + + case IDM_VIEW_UNFOLD_1: + case IDM_VIEW_UNFOLD_2: + case IDM_VIEW_UNFOLD_3: + case IDM_VIEW_UNFOLD_4: + case IDM_VIEW_UNFOLD_5: + case IDM_VIEW_UNFOLD_6: + case IDM_VIEW_UNFOLD_7: + case IDM_VIEW_UNFOLD_8: + _pEditView->collapse(id - IDM_VIEW_UNFOLD - 1, fold_uncollapse); + break; + + + case IDM_VIEW_TOOLBAR_REDUCE: + { + toolBarStatusType state = _toolBar.getState(); + + if (state != TB_SMALL) + { + _toolBar.reduce(); + changeToolBarIcons(); + } + } + break; + + case IDM_VIEW_TOOLBAR_ENLARGE: + { + toolBarStatusType state = _toolBar.getState(); + + if (state != TB_LARGE) + { + _toolBar.enlarge(); + changeToolBarIcons(); + } + } + break; + + case IDM_VIEW_TOOLBAR_STANDARD: + { + toolBarStatusType state = _toolBar.getState(); + + if (state != TB_STANDARD) + { + _toolBar.setToUglyIcons(); + } + } + break; + + case IDM_VIEW_REDUCETABBAR : + { + _toReduceTabBar = !_toReduceTabBar; + + //Resize the icon + int iconSize = _toReduceTabBar?12:18; + + //Resize the tab height + int tabHeight = _toReduceTabBar?20:25; + TabCtrl_SetItemSize(_mainDocTab.getHSelf(), 45, tabHeight); + TabCtrl_SetItemSize(_subDocTab.getHSelf(), 45, tabHeight); + _docTabIconList.setIconSize(iconSize); + + //change the font + int stockedFont = _toReduceTabBar?DEFAULT_GUI_FONT:SYSTEM_FONT; + HFONT hf = (HFONT)::GetStockObject(stockedFont); + + if (hf) + { + ::SendMessage(_mainDocTab.getHSelf(), WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE, 0)); + ::SendMessage(_subDocTab.getHSelf(), WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE, 0)); + } + + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + break; + } + + case IDM_VIEW_REFRESHTABAR : + { + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + break; + } + case IDM_VIEW_LOCKTABBAR: + { + bool isDrag = TabBarPlus::doDragNDropOrNot(); + TabBarPlus::doDragNDrop(!isDrag); + //checkMenuItem(IDM_VIEW_LOCKTABBAR, isDrag); + break; + } + + + case IDM_VIEW_DRAWTABBAR_INACIVETAB: + { + TabBarPlus::setDrawInactiveTab(!TabBarPlus::drawInactiveTab()); + //TabBarPlus::setDrawInactiveTab(!TabBarPlus::drawInactiveTab(), _subDocTab.getHSelf()); + break; + } + case IDM_VIEW_DRAWTABBAR_TOPBAR: + { + TabBarPlus::setDrawTopBar(!TabBarPlus::drawTopBar()); + break; + } + + case IDM_VIEW_DRAWTABBAR_CLOSEBOTTUN : + { + TabBarPlus::setDrawTabCloseButton(!TabBarPlus::drawTabCloseButton()); + + // This part is just for updating (redraw) the tabs + { + int tabHeight = TabBarPlus::drawTabCloseButton()?21:20; + TabCtrl_SetItemSize(_mainDocTab.getHSelf(), 45, tabHeight); + TabCtrl_SetItemSize(_subDocTab.getHSelf(), 45, tabHeight); + } + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + break; + } + + case IDM_VIEW_DRAWTABBAR_DBCLK2CLOSE : + { + TabBarPlus::setDbClk2Close(!TabBarPlus::isDbClk2Close()); + break; + } + + case IDM_VIEW_DRAWTABBAR_VERTICAL : + { + TabBarPlus::setVertical(!TabBarPlus::isVertical()); + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + break; + } + + case IDM_VIEW_DRAWTABBAR_MULTILINE : + { + TabBarPlus::setMultiLine(!TabBarPlus::isMultiLine()); + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + break; + } + + case IDM_VIEW_POSTIT : + { + postItToggle(); + } + break; + + case IDM_VIEW_TAB_SPACE: + { + bool isChecked = !(::GetMenuState(_mainMenuHandle, IDM_VIEW_TAB_SPACE, MF_BYCOMMAND) == MF_CHECKED); + ::CheckMenuItem(_mainMenuHandle, IDM_VIEW_EOL, MF_BYCOMMAND | MF_UNCHECKED); + ::CheckMenuItem(_mainMenuHandle, IDM_VIEW_ALL_CHARACTERS, MF_BYCOMMAND | MF_UNCHECKED); + ::CheckMenuItem(_mainMenuHandle, IDM_VIEW_TAB_SPACE, MF_BYCOMMAND | (isChecked?MF_CHECKED:MF_UNCHECKED)); + _toolBar.setCheck(IDM_VIEW_ALL_CHARACTERS, false); + _pEditView->showEOL(false); + _pEditView->showWSAndTab(isChecked); + break; + } + case IDM_VIEW_EOL: + { + bool isChecked = !(::GetMenuState(_mainMenuHandle, IDM_VIEW_EOL, MF_BYCOMMAND) == MF_CHECKED); + ::CheckMenuItem(_mainMenuHandle, IDM_VIEW_TAB_SPACE, MF_BYCOMMAND | MF_UNCHECKED); + ::CheckMenuItem(_mainMenuHandle, IDM_VIEW_EOL, MF_BYCOMMAND | (isChecked?MF_CHECKED:MF_UNCHECKED)); + ::CheckMenuItem(_mainMenuHandle, IDM_VIEW_ALL_CHARACTERS, MF_BYCOMMAND | MF_UNCHECKED); + _toolBar.setCheck(IDM_VIEW_ALL_CHARACTERS, false); + _pEditView->showEOL(isChecked); + _pEditView->showWSAndTab(false); + break; + } + case IDM_VIEW_ALL_CHARACTERS: + { + bool isChecked = !(::GetMenuState(_mainMenuHandle, id, MF_BYCOMMAND) == MF_CHECKED); + ::CheckMenuItem(_mainMenuHandle, IDM_VIEW_EOL, MF_BYCOMMAND | MF_UNCHECKED); + ::CheckMenuItem(_mainMenuHandle, IDM_VIEW_TAB_SPACE, MF_BYCOMMAND | MF_UNCHECKED); + ::CheckMenuItem(_mainMenuHandle, IDM_VIEW_ALL_CHARACTERS, MF_BYCOMMAND | (isChecked?MF_CHECKED:MF_UNCHECKED)); + _pEditView->showInvisibleChars(isChecked); + _toolBar.setCheck(IDM_VIEW_ALL_CHARACTERS, isChecked); + break; + } + + case IDM_VIEW_INDENT_GUIDE: + { + _pEditView->showIndentGuideLine(!_pEditView->isShownIndentGuide()); + _toolBar.setCheck(IDM_VIEW_INDENT_GUIDE, _pEditView->isShownIndentGuide()); + checkMenuItem(IDM_VIEW_INDENT_GUIDE, _pEditView->isShownIndentGuide()); + break; + } + + case IDM_VIEW_WRAP: + { + bool isWraped = !_pEditView->isWrap(); + _pEditView->wrap(isWraped); + _toolBar.setCheck(IDM_VIEW_WRAP, isWraped); + checkMenuItem(IDM_VIEW_WRAP, isWraped); + break; + } + case IDM_VIEW_WRAP_SYMBOL: + { + _pEditView->showWrapSymbol(!_pEditView->isWrapSymbolVisible()); + checkMenuItem(IDM_VIEW_WRAP_SYMBOL, _pEditView->isWrapSymbolVisible()); + break; + } + + case IDM_VIEW_HIDELINES: + { + _pEditView->hideLines(); + break; + } + + case IDM_VIEW_ZOOMIN: + { + _pEditView->execute(SCI_ZOOMIN); + break; + } + case IDM_VIEW_ZOOMOUT: + _pEditView->execute(SCI_ZOOMOUT); + break; + + case IDM_VIEW_ZOOMRESTORE: + //Zoom factor of 0 points means default view + _pEditView->execute(SCI_SETZOOM, 0);//_zoomOriginalValue); + break; + + case IDM_VIEW_SYNSCROLLV: + { + _syncInfo._isSynScollV = !_syncInfo._isSynScollV; + checkMenuItem(IDM_VIEW_SYNSCROLLV, _syncInfo._isSynScollV); + _toolBar.setCheck(IDM_VIEW_SYNSCROLLV, _syncInfo._isSynScollV); + + if (_syncInfo._isSynScollV) + { + int mainCurrentLine = _mainEditView.execute(SCI_GETFIRSTVISIBLELINE); + int subCurrentLine = _subEditView.execute(SCI_GETFIRSTVISIBLELINE); + _syncInfo._line = mainCurrentLine - subCurrentLine; + } + + } + break; + + case IDM_VIEW_SYNSCROLLH: + { + _syncInfo._isSynScollH = !_syncInfo._isSynScollH; + checkMenuItem(IDM_VIEW_SYNSCROLLH, _syncInfo._isSynScollH); + _toolBar.setCheck(IDM_VIEW_SYNSCROLLH, _syncInfo._isSynScollH); + + if (_syncInfo._isSynScollH) + { + int mxoffset = _mainEditView.execute(SCI_GETXOFFSET); + int pixel = int(_mainEditView.execute(SCI_TEXTWIDTH, STYLE_DEFAULT, (LPARAM)"P")); + int mainColumn = mxoffset/pixel; + + int sxoffset = _subEditView.execute(SCI_GETXOFFSET); + pixel = int(_subEditView.execute(SCI_TEXTWIDTH, STYLE_DEFAULT, (LPARAM)"P")); + int subColumn = sxoffset/pixel; + _syncInfo._column = mainColumn - subColumn; + } + } + break; + + case IDM_EXECUTE: + { + bool isFirstTime = !_runDlg.isCreated(); + _runDlg.doDialog(_isRTL); + if (isFirstTime) + changeDlgLang(_runDlg.getHSelf(), "Run"); + + break; + } + + case IDM_FORMAT_TODOS : + case IDM_FORMAT_TOUNIX : + 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); + _pEditView->execute(SCI_CONVERTEOLS, buf->getFormat()); + break; + } + + case IDM_FORMAT_ANSI : + case IDM_FORMAT_UTF_8 : + case IDM_FORMAT_UCS_2BE : + case IDM_FORMAT_UCS_2LE : + case IDM_FORMAT_AS_UTF_8 : + { + Buffer * buf = _pEditView->getCurrentBuffer(); + + UniMode um; + bool shoulBeDirty = true; + switch (id) + { + case IDM_FORMAT_AS_UTF_8: + shoulBeDirty = buf->getUnicodeMode() != uni8Bit; + um = uniCookie; + break; + + case IDM_FORMAT_UTF_8: + um = uniUTF8; + break; + + case IDM_FORMAT_UCS_2BE: + um = uni16BE; + break; + + case IDM_FORMAT_UCS_2LE: + um = uni16LE; + break; + + default : // IDM_FORMAT_ANSI + shoulBeDirty = buf->getUnicodeMode() != uniCookie; + um = uni8Bit; + } + + if (buf->getUnicodeMode() != um) + { + buf->setUnicodeMode(um); + if (shoulBeDirty) + buf->setDirty(true); + } + break; + } + + 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_2LE: + { + int idEncoding = -1; + UniMode um = _pEditView->getCurrentBuffer()->getUnicodeMode(); + + switch(id) + { + case IDM_FORMAT_CONV2_ANSI: + { + if (um == uni8Bit) + return; + + idEncoding = IDM_FORMAT_ANSI; + break; + } + case IDM_FORMAT_CONV2_AS_UTF_8: + { + idEncoding = IDM_FORMAT_AS_UTF_8; + if (um == uniCookie) + return; + + if (um != uni8Bit) + { + ::SendMessage(_hSelf, WM_COMMAND, idEncoding, 0); + _pEditView->execute(SCI_EMPTYUNDOBUFFER); + return; + } + + break; + } + case IDM_FORMAT_CONV2_UTF_8: + { + idEncoding = IDM_FORMAT_UTF_8; + if (um == uniUTF8) + return; + + if (um != uni8Bit) + { + ::SendMessage(_hSelf, WM_COMMAND, idEncoding, 0); + _pEditView->execute(SCI_EMPTYUNDOBUFFER); + return; + } + break; + } + + case IDM_FORMAT_CONV2_UCS_2BE: + { + idEncoding = IDM_FORMAT_UCS_2BE; + if (um == uni16BE) + return; + + if (um != uni8Bit) + { + ::SendMessage(_hSelf, WM_COMMAND, idEncoding, 0); + _pEditView->execute(SCI_EMPTYUNDOBUFFER); + return; + } + break; + } + + case IDM_FORMAT_CONV2_UCS_2LE: + { + idEncoding = IDM_FORMAT_UCS_2LE; + if (um == uni16LE) + return; + if (um != uni8Bit) + { + ::SendMessage(_hSelf, WM_COMMAND, idEncoding, 0); + _pEditView->execute(SCI_EMPTYUNDOBUFFER); + return; + } + break; + } + } + + if (idEncoding != -1) + { + // Save the current clipboard content + ::OpenClipboard(_hSelf); + HANDLE clipboardData = ::GetClipboardData(CF_TEXT); + int len = ::GlobalSize(clipboardData); + LPVOID clipboardDataPtr = ::GlobalLock(clipboardData); + + HANDLE allocClipboardData = ::GlobalAlloc(GMEM_MOVEABLE, len); + LPVOID clipboardData2 = ::GlobalLock(allocClipboardData); + + ::memcpy(clipboardData2, clipboardDataPtr, len); + ::GlobalUnlock(clipboardData); + ::GlobalUnlock(allocClipboardData); + ::CloseClipboard(); + + _pEditView->saveCurrentPos(); + + // Cut all text + int docLen = _pEditView->getCurrentDocLen(); + _pEditView->execute(SCI_COPYRANGE, 0, docLen); + _pEditView->execute(SCI_CLEARALL); + + // Change to the proper buffer, save buffer status + + ::SendMessage(_hSelf, WM_COMMAND, idEncoding, 0); + + // Paste the texte, restore buffer status + _pEditView->execute(SCI_PASTE); + _pEditView->restoreCurrentPos(); + + // Restore the previous clipboard data + ::OpenClipboard(_hSelf); + ::EmptyClipboard(); + ::SetClipboardData(CF_TEXT, clipboardData2); + ::CloseClipboard(); + + //Do not free anything, EmptyClipboard does that + _pEditView->execute(SCI_EMPTYUNDOBUFFER); + } + break; + } + + case IDM_SETTING_TAB_REPLCESPACE: + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + nppgui._tabReplacedBySpace = !nppgui._tabReplacedBySpace; + _pEditView->execute(SCI_SETUSETABS, !nppgui._tabReplacedBySpace); + //checkMenuItem(IDM_SETTING_TAB_REPLCESPACE, nppgui._tabReplacedBySpace); + break; + } + + case IDM_SETTING_TAB_SIZE: + { + ValueDlg tabSizeDlg; + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + tabSizeDlg.init(_hInst, _preference.getHSelf(), nppgui._tabSize, TEXT("Tab Size : ")); + POINT p; + ::GetCursorPos(&p); + ::ScreenToClient(_hParent, &p); + int size = tabSizeDlg.doDialog(p, _isRTL); + if (size != -1) + { + nppgui._tabSize = size; + _pEditView->execute(SCI_SETTABWIDTH, nppgui._tabSize); + } + + break; + } + + case IDM_SETTING_AUTOCNBCHAR: + { + const int NB_MIN_CHAR = 1; + const int NB_MAX_CHAR = 9; + + ValueDlg valDlg; + NppGUI & nppGUI = (NppGUI &)((NppParameters::getInstance())->getNppGUI()); + valDlg.init(_hInst, _preference.getHSelf(), nppGUI._autocFromLen, TEXT("Nb char : ")); + POINT p; + ::GetCursorPos(&p); + ::ScreenToClient(_hParent, &p); + int size = valDlg.doDialog(p, _isRTL); + + if (size != -1) + { + if (size > NB_MAX_CHAR) + size = NB_MAX_CHAR; + else if (size < NB_MIN_CHAR) + size = NB_MIN_CHAR; + + nppGUI._autocFromLen = size; + } + break; + } + + case IDM_SETTING_HISTORY_SIZE : + { + ValueDlg nbHistoryDlg; + NppParameters *pNppParam = NppParameters::getInstance(); + nbHistoryDlg.init(_hInst, _preference.getHSelf(), pNppParam->getNbMaxFile(), TEXT("Max File : ")); + POINT p; + ::GetCursorPos(&p); + ::ScreenToClient(_hParent, &p); + int size = nbHistoryDlg.doDialog(p, _isRTL); + + if (size != -1) + { + if (size > NB_MAX_LRF_FILE) + size = NB_MAX_LRF_FILE; + pNppParam->setNbMaxFile(size); + _lastRecentFileList.setUserMaxNbLRF(size); + } + break; + } + + case IDM_SETTING_FILEASSOCIATION_DLG : + { + RegExtDlg regExtDlg; + regExtDlg.init(_hInst, _hSelf); + regExtDlg.doDialog(_isRTL); + break; + } + + case IDM_SETTING_SHORTCUT_MAPPER : + { + ShortcutMapper shortcutMapper; + shortcutMapper.init(_hInst, _hSelf); + changeShortcutmapperLang(&shortcutMapper); + shortcutMapper.doDialog(_isRTL); + shortcutMapper.destroy(); + break; + } + + case IDM_SETTING_PREFERECE : + { + bool isFirstTime = !_preference.isCreated(); + _preference.doDialog(_isRTL); + + if (isFirstTime) + { + changePrefereceDlgLang(); + } + break; + } + + case IDM_VIEW_GOTO_ANOTHER_VIEW: + docGotoAnotherEditView(TransferMove); + checkSyncState(); + break; + + case IDM_VIEW_CLONE_TO_ANOTHER_VIEW: + docGotoAnotherEditView(TransferClone); + checkSyncState(); + break; + + case IDM_VIEW_GOTO_NEW_INSTANCE : + docOpenInNewInstance(TransferMove); + break; + + case IDM_VIEW_LOAD_IN_NEW_INSTANCE: + docOpenInNewInstance(TransferClone); + break; + + case IDM_VIEW_SWITCHTO_OTHER_VIEW: + { + int view_to_focus; + HWND wnd = GetFocus(); + if (_pEditView->getHSelf() == wnd) + { + view_to_focus = otherView(); + if (!viewVisible(view_to_focus)) view_to_focus = _activeView; + } + else + { + view_to_focus = currentView(); + } + switchEditViewTo(view_to_focus); + break; + } + + case IDM_ABOUT: + { + bool isFirstTime = !_aboutDlg.isCreated(); + _aboutDlg.doDialog(); + if (isFirstTime && _nativeLangA) + { + const char *lang = (_nativeLangA->ToElement())->Attribute("name"); + + if (_nativeLangEncoding == CP_BIG5) + { + char *authorName = "«J¤µ§^"; + HWND hItem = ::GetDlgItem(_aboutDlg.getHSelf(), IDC_AUTHOR_NAME); +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + const wchar_t *authorNameW = wmc->char2wchar(authorName, CP_BIG5); + ::SetWindowText(hItem, authorNameW); +#else + ::SetWindowText(hItem, authorName); +#endif + } + } + break; + } + + case IDM_HELP : + { + TCHAR tmp[MAX_PATH]; + lstrcpy(tmp, _nppPath); + ::PathRemoveFileSpec(tmp); + + generic_string nppHelpPath = tmp; + nppHelpPath += TEXT("\\NppHelp.chm"); + if (::PathFileExists(nppHelpPath.c_str())) + ::ShellExecute(NULL, TEXT("open"), nppHelpPath.c_str(), NULL, NULL, SW_SHOWNORMAL); + else + { + generic_string msg = nppHelpPath; + msg += TEXT("\rdoesn't exist. Please download it on Notepad++ site."); + ::MessageBox(_hSelf, msg.c_str(), TEXT("File does not exist"), MB_OK); + } + } + break; + + case IDM_HOMESWEETHOME : + { + ::ShellExecute(NULL, TEXT("open"), TEXT("http://notepad-plus.sourceforge.net/"), NULL, NULL, SW_SHOWNORMAL); + break; + } + case IDM_PROJECTPAGE : + { + ::ShellExecute(NULL, TEXT("open"), TEXT("http://sourceforge.net/projects/notepad-plus/"), NULL, NULL, SW_SHOWNORMAL); + break; + } + + case IDM_ONLINEHELP: + { + ::ShellExecute(NULL, TEXT("open"), TEXT("http://notepad-plus.sourceforge.net/uk/generalFAQ.php"), NULL, NULL, SW_SHOWNORMAL); + break; + } + + case IDM_WIKIFAQ: + { + ::ShellExecute(NULL, TEXT("open"), TEXT("http://notepad-plus.wiki.sourceforge.net/FAQ"), NULL, NULL, SW_SHOWNORMAL); + break; + } + + case IDM_FORUM: + { + ::ShellExecute(NULL, TEXT("open"), TEXT("http://sourceforge.net/forum/?group_id=95717"), NULL, NULL, SW_SHOWNORMAL); + break; + } + + case IDM_PLUGINSHOME: + { + ::ShellExecute(NULL, TEXT("open"), TEXT("https://sourceforge.net/projects/npp-plugins/"), NULL, NULL, SW_SHOWNORMAL); + break; + } + + case IDM_UPDATE_NPP : + { + generic_string updaterDir = pNppParam->getNppPath(); + updaterDir += TEXT("\\updater\\"); + generic_string updaterFullPath = updaterDir + TEXT("gup.exe"); + generic_string param = TEXT("-verbose -v"); + param += VERSION_VALUE; + Process updater(updaterFullPath.c_str(), param.c_str(), updaterDir.c_str()); + updater.run(); + break; + } + + case IDM_EDIT_AUTOCOMPLETE : + showAutoComp(); + break; + + case IDM_EDIT_AUTOCOMPLETE_CURRENTFILE : + autoCompFromCurrentFile(); + break; + + case IDM_EDIT_FUNCCALLTIP : + showFunctionComp(); + break; + + case IDM_LANGSTYLE_CONFIG_DLG : + { + bool isFirstTime = !_configStyleDlg.isCreated(); + _configStyleDlg.doDialog(_isRTL); + if (isFirstTime) + changeConfigLang(); + break; + } + + case IDM_LANG_C : + case IDM_LANG_CPP : + case IDM_LANG_JAVA : + case IDM_LANG_CS : + case IDM_LANG_HTML : + case IDM_LANG_XML : + case IDM_LANG_JS : + case IDM_LANG_PHP : + case IDM_LANG_ASP : + case IDM_LANG_CSS : + case IDM_LANG_LUA : + case IDM_LANG_PERL : + case IDM_LANG_PYTHON : + case IDM_LANG_PASCAL : + case IDM_LANG_BATCH : + case IDM_LANG_OBJC : + case IDM_LANG_VB : + case IDM_LANG_SQL : + case IDM_LANG_ASCII : + case IDM_LANG_TEXT : + case IDM_LANG_RC : + case IDM_LANG_MAKEFILE : + case IDM_LANG_INI : + case IDM_LANG_TEX : + case IDM_LANG_FORTRAN : + case IDM_LANG_SH : + case IDM_LANG_FLASH : + case IDM_LANG_NSIS : + case IDM_LANG_TCL : + case IDM_LANG_LISP : + case IDM_LANG_SCHEME : + case IDM_LANG_ASM : + case IDM_LANG_DIFF : + case IDM_LANG_PROPS : + case IDM_LANG_PS: + case IDM_LANG_RUBY: + case IDM_LANG_SMALLTALK: + case IDM_LANG_VHDL : + case IDM_LANG_KIX : + case IDM_LANG_CAML : + case IDM_LANG_ADA : + case IDM_LANG_VERILOG : + case IDM_LANG_MATLAB : + case IDM_LANG_HASKELL : + case IDM_LANG_AU3 : + case IDM_LANG_INNO : + case IDM_LANG_CMAKE : + case IDM_LANG_YAML : + case IDM_LANG_USER : + { + setLanguage(id, menuID2LangType(id)); + } + break; + + case IDC_PREV_DOC : + case IDC_NEXT_DOC : + { + int nbDoc = viewVisible(MAIN_VIEW)?_mainDocTab.nbItem():0; + nbDoc += viewVisible(SUB_VIEW)?_subDocTab.nbItem():0; + + bool doTaskList = ((NppParameters::getInstance())->getNppGUI())._doTaskList; + if (nbDoc > 1) + { + bool direction = (id == IDC_NEXT_DOC)?dirDown:dirUp; + + if (!doTaskList) + { + activateNextDoc(direction); + } + else + { + TaskListDlg tld; + HIMAGELIST hImgLst = _docTabIconList.getHandle(); + tld.init(_hInst, _hSelf, hImgLst, direction); + tld.doDialog(); + } + } + _linkTriggered = true; + } + break; + + case IDM_OPEN_ALL_RECENT_FILE : { + BufferID lastOne = BUFFER_INVALID; + int size = _lastRecentFileList.getSize(); + for (int i = size - 1; i >= 0; i--) + { + BufferID test = doOpen(_lastRecentFileList.getIndex(i).c_str()); + if (test != BUFFER_INVALID) + lastOne = test; + } + if (lastOne != BUFFER_INVALID) { + switchToFile(lastOne); + } + break; } + + case IDM_CLEAN_RECENT_FILE_LIST : + _lastRecentFileList.clear(); + break; + + case IDM_EDIT_RTL : + case IDM_EDIT_LTR : + { + long exStyle = ::GetWindowLongPtr(_pEditView->getHSelf(), GWL_EXSTYLE); + exStyle = (id == IDM_EDIT_RTL)?exStyle|WS_EX_LAYOUTRTL:exStyle&(~WS_EX_LAYOUTRTL); + ::SetWindowLongPtr(_pEditView->getHSelf(), GWL_EXSTYLE, exStyle); + _pEditView->redraw(); + } + break; + + case IDM_WINDOW_WINDOWS : + { + WindowsDlg _windowsDlg; + _windowsDlg.init(_hInst, _hSelf, _pDocTab); + + TiXmlNodeA *dlgNode = NULL; + if (_nativeLangA) + { + dlgNode = _nativeLangA->FirstChild("Dialog"); + if (dlgNode) + dlgNode = searchDlgNode(dlgNode, "Window"); + } + _windowsDlg.doDialog(dlgNode); + } + break; + + default : + if (id > IDM_FILEMENU_LASTONE && id < (IDM_FILEMENU_LASTONE + _lastRecentFileList.getMaxNbLRF() + 1)) + { + BufferID lastOpened = doOpen(_lastRecentFileList.getItem(id).c_str()); + if (lastOpened != BUFFER_INVALID) { + switchToFile(lastOpened); + } + } + else if ((id > IDM_LANG_USER) && (id < IDM_LANG_USER_LIMIT)) + { + TCHAR langName[langNameLenMax]; + ::GetMenuString(_mainMenuHandle, id, langName, langNameLenMax, MF_BYCOMMAND); + _pEditView->getCurrentBuffer()->setLangType(L_USER, langName); + } + else if ((id >= IDM_LANG_EXTERNAL) && (id <= IDM_LANG_EXTERNAL_LIMIT)) + { + setLanguage(id, (LangType)(id - IDM_LANG_EXTERNAL + L_EXTERNAL)); + } + else if ((id >= ID_MACRO) && (id < ID_MACRO_LIMIT)) + { + int i = id - ID_MACRO; + vector & theMacros = pNppParam->getMacroList(); + Macro macro = theMacros[i].getMacro(); + _pEditView->execute(SCI_BEGINUNDOACTION); + + for (Macro::iterator step = macro.begin(); step != macro.end(); step++) + step->PlayBack(this, _pEditView); + + _pEditView->execute(SCI_ENDUNDOACTION); + + } + else if ((id >= ID_USER_CMD) && (id < ID_USER_CMD_LIMIT)) + { + int i = id - ID_USER_CMD; + vector & theUserCommands = pNppParam->getUserCommandList(); + UserCommand ucmd = theUserCommands[i]; + + Command cmd(ucmd.getCmd()); + cmd.run(_hSelf); + } + else if ((id >= ID_PLUGINS_CMD) && (id < ID_PLUGINS_CMD_LIMIT)) + { + int i = id - ID_PLUGINS_CMD; + _pluginsManager.runPluginCommand(i); + } + else if ((id >= IDM_WINDOW_MRU_FIRST) && (id <= IDM_WINDOW_MRU_LIMIT)) + { + activateDoc(id-IDM_WINDOW_MRU_FIRST); + } + } + + if (_recordingMacro) + switch (id) + { + case IDM_FILE_NEW : + case IDM_FILE_CLOSE : + case IDM_FILE_CLOSEALL : + case IDM_FILE_CLOSEALL_BUT_CURRENT : + case IDM_FILE_SAVE : + case IDM_FILE_SAVEALL : + case IDM_EDIT_UNDO: + case IDM_EDIT_REDO: + case IDM_EDIT_CUT: + case IDM_EDIT_COPY: + //case IDM_EDIT_PASTE: + case IDM_EDIT_DELETE: + case IDM_SEARCH_FINDNEXT : + case IDM_SEARCH_FINDPREV : + case IDM_SEARCH_GOTOMATCHINGBRACE : + case IDM_SEARCH_TOGGLE_BOOKMARK : + case IDM_SEARCH_NEXT_BOOKMARK: + case IDM_SEARCH_PREV_BOOKMARK: + case IDM_SEARCH_CLEAR_BOOKMARKS: + case IDM_EDIT_SELECTALL: + case IDM_EDIT_INS_TAB: + case IDM_EDIT_RMV_TAB: + case IDM_EDIT_DUP_LINE: + case IDM_EDIT_TRANSPOSE_LINE: + case IDM_EDIT_SPLIT_LINES: + case IDM_EDIT_JOIN_LINES: + case IDM_EDIT_LINE_UP: + case IDM_EDIT_LINE_DOWN: + case IDM_EDIT_UPPERCASE: + case IDM_EDIT_LOWERCASE: + case IDM_EDIT_BLOCK_COMMENT: + case IDM_EDIT_BLOCK_COMMENT_SET: + case IDM_EDIT_BLOCK_UNCOMMENT: + case IDM_EDIT_STREAM_COMMENT: + case IDM_EDIT_TRIMTRAILING: + case IDM_EDIT_SETREADONLY : + case IDM_EDIT_FULLPATHTOCLIP : + case IDM_EDIT_FILENAMETOCLIP : + case IDM_EDIT_CURRENTDIRTOCLIP : + case IDM_EDIT_CLEARREADONLY : + case IDM_EDIT_RTL : + case IDM_EDIT_LTR : + case IDM_VIEW_FULLSCREENTOGGLE : + case IDM_VIEW_ALWAYSONTOP : + case IDM_VIEW_WRAP : + case IDM_VIEW_FOLD_CURRENT : + case IDM_VIEW_UNFOLD_CURRENT : + case IDM_VIEW_TOGGLE_FOLDALL: + case IDM_VIEW_TOGGLE_UNFOLDALL: + case IDM_VIEW_FOLD_1: + case IDM_VIEW_FOLD_2: + case IDM_VIEW_FOLD_3: + case IDM_VIEW_FOLD_4: + case IDM_VIEW_FOLD_5: + case IDM_VIEW_FOLD_6: + case IDM_VIEW_FOLD_7: + case IDM_VIEW_FOLD_8: + case IDM_VIEW_UNFOLD_1: + case IDM_VIEW_UNFOLD_2: + case IDM_VIEW_UNFOLD_3: + case IDM_VIEW_UNFOLD_4: + case IDM_VIEW_UNFOLD_5: + case IDM_VIEW_UNFOLD_6: + case IDM_VIEW_UNFOLD_7: + case IDM_VIEW_UNFOLD_8: + case IDM_VIEW_GOTO_ANOTHER_VIEW: + case IDM_VIEW_SYNSCROLLV: + case IDM_VIEW_SYNSCROLLH: + case IDC_PREV_DOC : + case IDC_NEXT_DOC : + _macro.push_back(recordedMacroStep(id)); + break; + } + +} + +void Notepad_plus::setLanguage(int id, LangType langType) { + //Add logic to prevent changing a language when a document is shared between two views + //If so, release one document + bool reset = false; + Document prev = 0; + if (bothActive()) { + if (_mainEditView.getCurrentBufferID() == _subEditView.getCurrentBufferID()) { + reset = true; + _subEditView.saveCurrentPos(); + prev = _subEditView.execute(SCI_GETDOCPOINTER); + _subEditView.execute(SCI_SETDOCPOINTER, 0, 0); + } + } + if (reset) { + _mainEditView.getCurrentBuffer()->setLangType(langType); + } else { + _pEditView->getCurrentBuffer()->setLangType(langType); + } + + if (reset) { + _subEditView.execute(SCI_SETDOCPOINTER, 0, prev); + _subEditView.restoreCurrentPos(); + } +}; + +enum LangType Notepad_plus::menuID2LangType(int cmdID) +{ + switch (cmdID) + { + case IDM_LANG_C : + return L_C; + case IDM_LANG_CPP : + return L_CPP; + case IDM_LANG_JAVA : + return L_JAVA; + case IDM_LANG_CS : + return L_CS; + case IDM_LANG_HTML : + return L_HTML; + case IDM_LANG_XML : + return L_XML; + case IDM_LANG_JS : + return L_JS; + case IDM_LANG_PHP : + return L_PHP; + case IDM_LANG_ASP : + return L_ASP; + case IDM_LANG_CSS : + return L_CSS; + case IDM_LANG_LUA : + return L_LUA; + case IDM_LANG_PERL : + return L_PERL; + case IDM_LANG_PYTHON : + return L_PYTHON; + case IDM_LANG_PASCAL : + return L_PASCAL; + case IDM_LANG_BATCH : + return L_BATCH; + case IDM_LANG_OBJC : + return L_OBJC; + case IDM_LANG_VB : + return L_VB; + case IDM_LANG_SQL : + return L_SQL; + case IDM_LANG_ASCII : + return L_NFO; + case IDM_LANG_TEXT : + return L_TXT; + case IDM_LANG_RC : + return L_RC; + case IDM_LANG_MAKEFILE : + return L_MAKEFILE; + case IDM_LANG_INI : + return L_INI; + case IDM_LANG_TEX : + return L_TEX; + case IDM_LANG_FORTRAN : + return L_FORTRAN; + case IDM_LANG_SH : + return L_BASH; + case IDM_LANG_FLASH : + return L_FLASH; + case IDM_LANG_NSIS : + return L_NSIS; + case IDM_LANG_TCL : + return L_TCL; + case IDM_LANG_LISP : + return L_LISP; + case IDM_LANG_SCHEME : + return L_SCHEME; + case IDM_LANG_ASM : + return L_ASM; + case IDM_LANG_DIFF : + return L_DIFF; + case IDM_LANG_PROPS : + return L_PROPS; + case IDM_LANG_PS: + return L_PS; + case IDM_LANG_RUBY: + return L_RUBY; + case IDM_LANG_SMALLTALK: + return L_SMALLTALK; + case IDM_LANG_VHDL : + return L_VHDL; + case IDM_LANG_KIX : + return L_KIX; + case IDM_LANG_CAML : + return L_CAML; + case IDM_LANG_ADA : + return L_ADA; + case IDM_LANG_VERILOG : + return L_VERILOG; + case IDM_LANG_MATLAB : + return L_MATLAB; + case IDM_LANG_HASKELL : + return L_HASKELL; + case IDM_LANG_AU3 : + return L_AU3; + case IDM_LANG_INNO : + return L_INNO; + case IDM_LANG_CMAKE : + return L_CMAKE; + case IDM_LANG_YAML : + return L_YAML; + case IDM_LANG_USER : + return L_USER; + default: { + if (cmdID >= IDM_LANG_USER && cmdID <= IDM_LANG_USER_LIMIT) { + return L_USER; + } + break; } + } + return L_EXTERNAL; +} + +void Notepad_plus::setTitle() +{ + const NppGUI & nppGUI = NppParameters::getInstance()->getNppGUI(); + //Get the buffer + Buffer * buf = _pEditView->getCurrentBuffer(); + + generic_string result = TEXT(""); + if (buf->isDirty()) + { + result += TEXT("*"); + } + + if (nppGUI._shortTitlebar) + { + result += buf->getFileName(); + } + else + { + result += buf->getFullPathName(); + } + result += TEXT(" - "); + result += _className; + //::SetWindowText(_hSelf, title); + ::SendMessage(_hSelf, WM_SETTEXT, 0, (LPARAM)result.c_str()); + +} + +void Notepad_plus::activateNextDoc(bool direction) +{ + int nbDoc = _pDocTab->nbItem(); + + int curIndex = _pDocTab->getCurrentTabIndex(); + curIndex += (direction == dirUp)?-1:1; + + if (curIndex >= nbDoc) + { + if (viewVisible(otherView())) + switchEditViewTo(otherView()); + curIndex = 0; + } + else if (curIndex < 0) + { + if (viewVisible(otherView())) + { + switchEditViewTo(otherView()); + nbDoc = _pDocTab->nbItem(); + } + curIndex = nbDoc - 1; + } + + BufferID id = _pDocTab->getBufferByIndex(curIndex); + activateBuffer(id, currentView()); +} + +void Notepad_plus::activateDoc(int pos) +{ + int nbDoc = _pDocTab->nbItem(); + if (pos == _pDocTab->getCurrentTabIndex()) + { + Buffer * buf = _pEditView->getCurrentBuffer(); + buf->increaseRecentTag(); + return; + } + + if (pos >= 0 && pos < nbDoc) + { + BufferID id = _pDocTab->getBufferByIndex(pos); + activateBuffer(id, currentView()); + } +} + +void Notepad_plus::updateStatusBar() +{ + Buffer * buf = _pEditView->getCurrentBuffer(); + TCHAR strLnCol[64]; + wsprintf(strLnCol, TEXT("Ln : %d Col : %d Sel : %d"),\ + (_pEditView->getCurrentLineNumber() + 1), \ + (_pEditView->getCurrentColumnNumber() + 1),\ + (_pEditView->getSelectedByteNumber())); + + _statusBar.setText(strLnCol, STATUSBAR_CUR_POS); + + TCHAR strDonLen[64]; + wsprintf(strDonLen, TEXT("nb char : %d"), _pEditView->getCurrentDocLen()); + _statusBar.setText(strDonLen, STATUSBAR_DOC_SIZE); + _statusBar.setText(_pEditView->execute(SCI_GETOVERTYPE) ? TEXT("OVR") : TEXT("INS"), STATUSBAR_TYPING_MODE); +} + + +void Notepad_plus::dropFiles(HDROP hdrop) +{ + if (hdrop) + { + // Determinate in which view the file(s) is (are) dropped + POINT p; + ::DragQueryPoint(hdrop, &p); + HWND hWin = ::RealChildWindowFromPoint(_hSelf, p); + if (!hWin) return; + + if ((_mainEditView.getHSelf() == hWin) || (_mainDocTab.getHSelf() == hWin)) + switchEditViewTo(MAIN_VIEW); + else if ((_subEditView.getHSelf() == hWin) || (_subDocTab.getHSelf() == hWin)) + switchEditViewTo(SUB_VIEW); + else + { + ::SendMessage(hWin, WM_DROPFILES, (WPARAM)hdrop, 0); + return; + } + + int filesDropped = ::DragQueryFile(hdrop, 0xffffffff, NULL, 0); + BufferID lastOpened = BUFFER_INVALID; + for (int i = 0 ; i < filesDropped ; ++i) + { + TCHAR pathDropped[MAX_PATH]; + ::DragQueryFile(hdrop, i, pathDropped, MAX_PATH); + BufferID test = doOpen(pathDropped); + if (test != BUFFER_INVALID) + lastOpened = test; + //setLangStatus(_pEditView->getCurrentDocType()); + } + if (lastOpened != BUFFER_INVALID) { + switchToFile(lastOpened); + } + ::DragFinish(hdrop); + // Put Notepad_plus to forefront + // May not work for Win2k, but OK for lower versions + // Note: how to drop a file to an iconic window? + // Actually, it is the Send To command that generates a drop. + if (::IsIconic(_hSelf)) + { + ::ShowWindow(_hSelf, SW_RESTORE); + } + ::SetForegroundWindow(_hSelf); + } +} + +void Notepad_plus::checkModifiedDocument() +{ + //this will trigger buffer updates. If the status changes, Notepad++ will be informed and can do its magic + MainFileManager->checkFilesystemChanges(); +} + +void Notepad_plus::getMainClientRect(RECT &rc) const +{ + getClientRect(rc); + rc.top += _rebarTop.getHeight(); + rc.bottom -= rc.top + _rebarBottom.getHeight() + _statusBar.getHeight(); +} + +void Notepad_plus::showView(int whichOne) { + if (viewVisible(whichOne)) //no use making visible view visible + return; + + if (_mainWindowStatus & WindowUserActive) { + _pMainSplitter->setWin0(&_subSplitter); + _pMainWindow = _pMainSplitter; + } else { + _pMainWindow = &_subSplitter; + } + + if (whichOne == MAIN_VIEW) { + _mainEditView.display(true); + _mainDocTab.display(true); + } else if (whichOne == SUB_VIEW) { + _subEditView.display(true); + _subDocTab.display(true); + } + _pMainWindow->display(true); + + _mainWindowStatus |= (whichOne==MAIN_VIEW)?WindowMainActive:WindowSubActive; + + //Send sizing info to make windows fit + ::SendMessage(_hSelf, WM_SIZE, 0, 0); +} + +bool Notepad_plus::viewVisible(int whichOne) { + int viewToCheck = (whichOne == SUB_VIEW?WindowSubActive:WindowMainActive); + return (_mainWindowStatus & viewToCheck) != 0; +} + +void Notepad_plus::hideCurrentView() +{ + hideView(currentView()); +} + +void Notepad_plus::hideView(int whichOne) +{ + if (!(bothActive())) //cannot close if not both views visible + return; + + Window * windowToSet = (whichOne == MAIN_VIEW)?&_subDocTab:&_mainDocTab; + if (_mainWindowStatus & WindowUserActive) + { + _pMainSplitter->setWin0(windowToSet); + } + else // otherwise the main window is the spltter container that we just created + _pMainWindow = windowToSet; + + _subSplitter.display(false); //hide splitter + //hide scintilla and doctab + if (whichOne == MAIN_VIEW) { + _mainEditView.display(false); + _mainDocTab.display(false); + } else if (whichOne == SUB_VIEW) { + _subEditView.display(false); + _subDocTab.display(false); + } + + // resize the main window + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + + switchEditViewTo(otherFromView(whichOne)); + int viewToDisable = (whichOne == SUB_VIEW?WindowSubActive:WindowMainActive); + _mainWindowStatus &= ~viewToDisable; +} + +bool Notepad_plus::loadStyles() +{ + NppParameters *pNppParam = NppParameters::getInstance(); + return pNppParam->reloadStylers(); +} + +bool Notepad_plus::reloadLang() +{ + NppParameters *pNppParam = NppParameters::getInstance(); + + if (!pNppParam->reloadLang()) + { + return false; + } + + TiXmlDocumentA *nativeLangDocRootA = pNppParam->getNativeLangA(); + if (!nativeLangDocRootA) + { + return false; + } + _nativeLangA = nativeLangDocRootA->FirstChild("NotepadPlus"); + if (!_nativeLangA) + { + return false; + } + _nativeLangA = _nativeLangA->FirstChild("Native-Langue"); + if (!_nativeLangA) + { + return false; + } + TiXmlElementA *element = _nativeLangA->ToElement(); + const char *rtl = element->Attribute("RTL"); + if (rtl) + _isRTL = (strcmp(rtl, "yes") == 0); + + // get encoding + TiXmlDeclarationA *declaration = _nativeLangA->GetDocument()->FirstChild()->ToDeclaration(); + if (declaration) + { + const char * encodingStr = declaration->Encoding(); + _nativeLangEncoding = getCpFromStringValue(encodingStr); + } + + pNppParam->reloadContextMenuFromXmlTree(_mainMenuHandle); + + generic_string pluginsTrans, windowTrans; + changeMenuLang(pluginsTrans, windowTrans); + + int indexWindow = ::GetMenuItemCount(_mainMenuHandle) - 3; + + if (_pluginsManager.hasPlugins() && pluginsTrans != TEXT("")) + { + ::ModifyMenu(_mainMenuHandle, indexWindow - 1, MF_BYPOSITION, 0, pluginsTrans.c_str()); + } + + if (windowTrans != TEXT("")) + { + ::ModifyMenu(_mainMenuHandle, indexWindow, MF_BYPOSITION, 0, windowTrans.c_str()); + windowTrans += TEXT("..."); + ::ModifyMenu(_mainMenuHandle, IDM_WINDOW_WINDOWS, MF_BYCOMMAND, IDM_WINDOW_WINDOWS, windowTrans.c_str()); + } + // Update scintilla context menu strings + vector & tmp = pNppParam->getContextMenuItems(); + size_t len = tmp.size(); + TCHAR menuName[64]; + for (size_t i = 0 ; i < len ; i++) + { + if (tmp[i]._itemName == TEXT("")) + { + ::GetMenuString(_mainMenuHandle, tmp[i]._cmdID, menuName, 64, MF_BYCOMMAND); + tmp[i]._itemName = purgeMenuItemString(menuName); + } + } + + vector & shortcuts = pNppParam->getUserShortcuts(); + len = shortcuts.size(); + + for(size_t i = 0; i < len; i++) + { + CommandShortcut & csc = shortcuts[i]; + ::GetMenuString(_mainMenuHandle, csc.getID(), menuName, 64, MF_BYCOMMAND); + csc.setName(purgeMenuItemString(menuName, true).c_str()); + } + _accelerator.updateFullMenu(); + + _scintaccelerator.updateKeys(); + + + if (_tabPopupMenu.isCreated()) + { + changeLangTabContextMenu(); + } + if (_tabPopupDropMenu.isCreated()) + { + changeLangTabDrapContextMenu(); + } + + if (_preference.isCreated()) + { + changePrefereceDlgLang(); + } + + if (_configStyleDlg.isCreated()) + { + changeConfigLang(); + } + + if (_findReplaceDlg.isCreated()) + { + changeFindReplaceDlgLang(); + } + + if (_goToLineDlg.isCreated()) + { + changeDlgLang(_goToLineDlg.getHSelf(), "GoToLine"); + } + + if (_runDlg.isCreated()) + { + changeDlgLang(_runDlg.getHSelf(), "Run"); + } + + if (_runMacroDlg.isCreated()) + { + changeDlgLang(_runMacroDlg.getHSelf(), "MultiMacro"); + } + + if (_goToLineDlg.isCreated()) + { + changeDlgLang(_goToLineDlg.getHSelf(), "GoToLine"); + } + + if (_colEditorDlg.isCreated()) + { + changeDlgLang(_colEditorDlg.getHSelf(), "ColumnEditor"); + } + + UserDefineDialog *udd = _pEditView->getUserDefineDlg(); + if (udd->isCreated()) + { + changeUserDefineLang(); + } + + return true; +} + +bool Notepad_plus::canHideView(int whichOne) +{ + if (!viewVisible(whichOne)) + return false; //cannot hide hidden view + if (!bothActive()) + return false; //cannot hide only window + DocTabView * tabToCheck = (whichOne == MAIN_VIEW)?&_mainDocTab:&_subDocTab; + Buffer * buf = MainFileManager->getBufferByID(tabToCheck->getBufferByIndex(0)); + bool canHide = ((tabToCheck->nbItem() == 1) && !buf->isDirty() && buf->isUntitled()); + return canHide; +} + +void Notepad_plus::loadBufferIntoView(BufferID id, int whichOne, bool dontClose) { + DocTabView * tabToOpen = (whichOne == MAIN_VIEW)?&_mainDocTab:&_subDocTab; + ScintillaEditView * viewToOpen = (whichOne == MAIN_VIEW)?&_mainEditView:&_subEditView; + + //check if buffer exists + int index = tabToOpen->getIndexByBuffer(id); + if (index != -1) //already open, done + return; + + BufferID idToClose = BUFFER_INVALID; + //Check if the tab has a single clean buffer. Close it if so + if (!dontClose && tabToOpen->nbItem() == 1) { + idToClose = tabToOpen->getBufferByIndex(0); + Buffer * buf = MainFileManager->getBufferByID(idToClose); + if (buf->isDirty() || !buf->isUntitled()) { + idToClose = BUFFER_INVALID; + } + } + + MainFileManager->addBufferReference(id, viewToOpen); + + if (idToClose != BUFFER_INVALID) { //close clean doc. Use special logic to prevent flicker of tab showing then hiding + tabToOpen->setBuffer(0, id); //index 0 since only one open + activateBuffer(id, whichOne); //activate. DocTab already activated but not a problem + MainFileManager->closeBuffer(idToClose, viewToOpen); //delete the buffer + } else { + tabToOpen->addBuffer(id); + } +} + +void Notepad_plus::removeBufferFromView(BufferID id, int whichOne) { + DocTabView * tabToClose = (whichOne == MAIN_VIEW)?&_mainDocTab:&_subDocTab; + ScintillaEditView * viewToClose = (whichOne == MAIN_VIEW)?&_mainEditView:&_subEditView; + + //check if buffer exists + int index = tabToClose->getIndexByBuffer(id); + if (index == -1) //doesnt exist, done + return; + + Buffer * buf = MainFileManager->getBufferByID(id); + + //Cannot close doc if last and clean + if (tabToClose->nbItem() == 1) { + if (!buf->isDirty() && buf->isUntitled()) { + return; //done + } + } + + int active = tabToClose->getCurrentTabIndex(); + if (active == index) { //need an alternative (close real doc, put empty one back + if (tabToClose->nbItem() == 1) { //need alternative doc, add new one. Use special logic to prevent flicker of adding new tab then closing other + BufferID newID = MainFileManager->newEmptyDocument(); + MainFileManager->addBufferReference(newID, viewToClose); + tabToClose->setBuffer(0, newID); //can safely use id 0, last (only) tab open + activateBuffer(newID, whichOne); //activate. DocTab already activated but not a problem + } else { + int toActivate = 0; + //activate next doc, otherwise prev if not possible + if (active == tabToClose->nbItem() - 1) { //prev + toActivate = active - 1; + } else { + toActivate = active; //activate the 'active' index. Since we remove the tab first, the indices shift (on the right side) + } + tabToClose->deletItemAt(index); //delete first + activateBuffer(tabToClose->getBufferByIndex(toActivate), whichOne); //then activate. The prevent jumpy tab behaviour + } + } else { + tabToClose->deletItemAt(index); + } + + MainFileManager->closeBuffer(id, viewToClose); +} + +int Notepad_plus::switchEditViewTo(int gid) +{ + if (currentView() == gid) { //make sure focus is ok, then leave + _pEditView->getFocus(); //set the focus + return gid; + } + if (!viewVisible(gid)) + return currentView(); //cannot activate invisible view + int oldView = currentView(); + int newView = otherView(); + + _activeView = newView; + //Good old switcheroo + DocTabView * tempTab = _pDocTab; + _pDocTab = _pNonDocTab; + _pNonDocTab = tempTab; + ScintillaEditView * tempView = _pEditView; + _pEditView = _pNonEditView; + _pNonEditView = tempView; + + _pEditView->beSwitched(); + _pEditView->getFocus(); //set the focus + + notifyBufferActivated(_pEditView->getCurrentBufferID(), currentView()); + return oldView; +} + +void Notepad_plus::dockUserDlg() +{ + if (!_pMainSplitter) + { + _pMainSplitter = new SplitterContainer; + _pMainSplitter->init(_hInst, _hSelf); + + Window *pWindow; + if (_mainWindowStatus & (WindowMainActive | WindowSubActive)) + pWindow = &_subSplitter; + else + pWindow = _pDocTab; + + _pMainSplitter->create(pWindow, ScintillaEditView::getUserDefineDlg(), 8, RIGHT_FIX, 45); + } + + if (bothActive()) + _pMainSplitter->setWin0(&_subSplitter); + else + _pMainSplitter->setWin0(_pDocTab); + + _pMainSplitter->display(); + + _mainWindowStatus |= WindowUserActive; + _pMainWindow = _pMainSplitter; + + ::SendMessage(_hSelf, WM_SIZE, 0, 0); +} + +void Notepad_plus::undockUserDlg() +{ + // a cause de surchargement de "display" + ::ShowWindow(_pMainSplitter->getHSelf(), SW_HIDE); + + if (bothActive()) + _pMainWindow = &_subSplitter; + else + _pMainWindow = _pDocTab; + + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + + _mainWindowStatus &= ~WindowUserActive; + (ScintillaEditView::getUserDefineDlg())->display(); +} + +void Notepad_plus::docOpenInNewInstance(FileTransferMode mode, int x, int y) +{ + BufferID bufferID = _pEditView->getCurrentBufferID(); + Buffer * buf = MainFileManager->getBufferByID(bufferID); + if (buf->isUntitled() || buf->isDirty()) + return; + + TCHAR nppName[MAX_PATH]; + ::GetModuleFileName(NULL, nppName, MAX_PATH); + std::generic_string command = TEXT("\""); + command += nppName; + command += TEXT("\""); + + command += TEXT(" \"$(FULL_CURRENT_PATH)\" -multiInst -nosession -x"); + TCHAR pX[10], pY[10]; + generic_itoa(x, pX, 10); + generic_itoa(y, pY, 10); + + command += pX; + command += TEXT(" -y"); + command += pY; + + Command cmd(command); + cmd.run(_hSelf); + if (mode == TransferMove) + { + doClose(bufferID, currentView()); + if (noOpenedDoc()) + ::SendMessage(_hSelf, WM_CLOSE, 0, 0); + } +} + +void Notepad_plus::docGotoAnotherEditView(FileTransferMode mode) +{ + //First put the doc in the other view if not present (if it is, activate it). + //Then if needed close in the original tab + BufferID current = _pEditView->getCurrentBufferID(); + int viewToGo = otherView(); + int indexFound = _pNonDocTab->getIndexByBuffer(current); + if (indexFound != -1) //activate it + { + activateBuffer(current, otherView()); + } + else //open the document, also copying the position + { + loadBufferIntoView(current, viewToGo); + Buffer * buf = MainFileManager->getBufferByID(current); + _pEditView->saveCurrentPos(); //allow copying of position + buf->setPosition(buf->getPosition(_pEditView), _pNonEditView); + _pNonEditView->restoreCurrentPos(); //set position + activateBuffer(current, otherView()); + } + + //Open the view if it was hidden + int viewToOpen = (viewToGo == SUB_VIEW?WindowSubActive:WindowMainActive); + if (!(_mainWindowStatus & viewToOpen)) { + showView(viewToGo); + } + + //Close the document if we transfered the document instead of cloning it + if (mode == TransferMove) + { + //just close the activate document, since thats the one we moved (no search) + doClose(_pEditView->getCurrentBufferID(), currentView()); + if (noOpenedDoc()) + ::SendMessage(_hSelf, WM_CLOSE, 0, 0); + } // else it was cone, so leave it + + //Activate the other view since thats where the document went + switchEditViewTo(viewToGo); + + //_linkTriggered = true; +} + +bool Notepad_plus::activateBuffer(BufferID id, int whichOne) +{ + //scnN.nmhdr.code = NPPN_DOCSWITCHINGOFF; //superseeded by NPPN_BUFFERACTIVATED + + Buffer * pBuf = MainFileManager->getBufferByID(id); + bool reload = pBuf->getNeedReload(); + if (reload) + { + MainFileManager->reloadBuffer(id); + pBuf->setNeedReload(false); + } + if (whichOne == MAIN_VIEW) + { + if (_mainDocTab.activateBuffer(id)) //only activate if possible + _mainEditView.activateBuffer(id); + else + return false; + } + else + { + if (_subDocTab.activateBuffer(id)) + _subEditView.activateBuffer(id); + else + return false; + } + + if (reload) + { + performPostReload(whichOne); + } + notifyBufferActivated(id, whichOne); + + //scnN.nmhdr.code = NPPN_DOCSWITCHINGIN; //superseeded by NPPN_BUFFERACTIVATED + return true; +} + +void Notepad_plus::performPostReload(int whichOne) { + NppParameters *pNppParam = NppParameters::getInstance(); + const NppGUI & nppGUI = pNppParam->getNppGUI(); + bool toEnd = (nppGUI._fileAutoDetection == cdAutoUpdateGo2end) || (nppGUI._fileAutoDetection == cdGo2end); + if (!toEnd) + return; + if (whichOne == MAIN_VIEW) { + _mainEditView.execute(SCI_GOTOLINE, _mainEditView.execute(SCI_GETLINECOUNT) -1); + } else { + _subEditView.execute(SCI_GOTOLINE, _subEditView.execute(SCI_GETLINECOUNT) -1); + } +} + +void Notepad_plus::bookmarkNext(bool forwardScan) +{ + int lineno = _pEditView->getCurrentLineNumber(); + int sci_marker = SCI_MARKERNEXT; + int lineStart = lineno + 1; //Scan starting from next line + int lineRetry = 0; //If not found, try from the beginning + if (!forwardScan) + { + lineStart = lineno - 1; //Scan starting from previous line + lineRetry = int(_pEditView->execute(SCI_GETLINECOUNT)); //If not found, try from the end + sci_marker = SCI_MARKERPREVIOUS; + } + int nextLine = int(_pEditView->execute(sci_marker, lineStart, 1 << MARK_BOOKMARK)); + if (nextLine < 0) + nextLine = int(_pEditView->execute(sci_marker, lineRetry, 1 << MARK_BOOKMARK)); + + if (nextLine < 0) + return; + + _pEditView->execute(SCI_ENSUREVISIBLEENFORCEPOLICY, nextLine); + _pEditView->execute(SCI_GOTOLINE, nextLine); +} + +void Notepad_plus::dynamicCheckMenuAndTB() const +{ + // Visibility of 3 margins + checkMenuItem(IDM_VIEW_LINENUMBER, _pEditView->hasMarginShowed(ScintillaEditView::_SC_MARGE_LINENUMBER)); + checkMenuItem(IDM_VIEW_SYMBOLMARGIN, _pEditView->hasMarginShowed(ScintillaEditView::_SC_MARGE_SYBOLE)); + checkMenuItem(IDM_VIEW_FOLDERMAGIN, _pEditView->hasMarginShowed(ScintillaEditView::_SC_MARGE_FOLDER)); + + // Folder margin style + checkFolderMarginStyleMenu(getFolderMaginStyleIDFrom(_pEditView->getFolderStyle())); + + // Visibility of invisible characters + bool wsTabShow = _pEditView->isInvisibleCharsShown(); + bool eolShow = _pEditView->isEolVisible(); + + bool onlyWS = false; + bool onlyEOL = false; + bool bothWSEOL = false; + if (wsTabShow) + { + if (eolShow) + { + bothWSEOL = true; + } + else + { + onlyWS = true; + } + } + else if (eolShow) + { + onlyEOL = true; + } + + checkMenuItem(IDM_VIEW_TAB_SPACE, onlyWS); + checkMenuItem(IDM_VIEW_EOL, onlyEOL); + checkMenuItem(IDM_VIEW_ALL_CHARACTERS, bothWSEOL); + _toolBar.setCheck(IDM_VIEW_ALL_CHARACTERS, bothWSEOL); + + // Visibility of the indentation guide line + bool b = _pEditView->isShownIndentGuide(); + checkMenuItem(IDM_VIEW_INDENT_GUIDE, b); + _toolBar.setCheck(IDM_VIEW_INDENT_GUIDE, b); + + // Edge Line + int mode = int(_pEditView->execute(SCI_GETEDGEMODE)); + checkMenuItem(IDM_VIEW_EDGEBACKGROUND, (MF_BYCOMMAND | ((mode == EDGE_NONE)||(mode == EDGE_LINE))?MF_UNCHECKED:MF_CHECKED) != 0); + checkMenuItem(IDM_VIEW_EDGELINE, (MF_BYCOMMAND | ((mode == EDGE_NONE)||(mode == EDGE_BACKGROUND))?MF_UNCHECKED:MF_CHECKED) != 0); + + // Current Line Highlighting + checkMenuItem(IDM_VIEW_CURLINE_HILITING, _pEditView->isCurrentLineHiLiting()); + + // Wrap + b = _pEditView->isWrap(); + checkMenuItem(IDM_VIEW_WRAP, b); + _toolBar.setCheck(IDM_VIEW_WRAP, b); + checkMenuItem(IDM_VIEW_WRAP_SYMBOL, _pEditView->isWrapSymbolVisible()); + + //Format conversion + enableConvertMenuItems(_pEditView->getCurrentBuffer()->getFormat()); + checkUnicodeMenuItems(_pEditView->getCurrentBuffer()->getUnicodeMode()); + + //Syncronized scrolling +} + +void Notepad_plus::checkUnicodeMenuItems(UniMode um) const +{ + int id = -1; + switch (um) + { + case uniUTF8 : id = IDM_FORMAT_UTF_8; break; + case uni16BE : id = IDM_FORMAT_UCS_2BE; break; + case uni16LE : id = IDM_FORMAT_UCS_2LE; break; + case uniCookie : id = IDM_FORMAT_AS_UTF_8; break; + default : + id = IDM_FORMAT_ANSI; + } + ::CheckMenuRadioItem(_mainMenuHandle, IDM_FORMAT_ANSI, IDM_FORMAT_AS_UTF_8, id, MF_BYCOMMAND); +} + +void Notepad_plus::showAutoComp() { + bool isFromPrimary = _pEditView == &_mainEditView; + AutoCompletion * autoC = isFromPrimary?&_autoCompleteMain:&_autoCompleteSub; + autoC->showAutoComplete(); +} + +void Notepad_plus::autoCompFromCurrentFile(bool autoInsert) { + bool isFromPrimary = _pEditView == &_mainEditView; + AutoCompletion * autoC = isFromPrimary?&_autoCompleteMain:&_autoCompleteSub; + autoC->showWordComplete(autoInsert); +} + +void Notepad_plus::showFunctionComp() { + bool isFromPrimary = _pEditView == &_mainEditView; + AutoCompletion * autoC = isFromPrimary?&_autoCompleteMain:&_autoCompleteSub; + autoC->showFunctionComplete(); +} + +void Notepad_plus::changeMenuLang(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; + +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); +#endif + + for (TiXmlNodeA *childNode = entriesRoot->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElementA *element = childNode->ToElement(); + int id; + if (element->Attribute("id", &id)) + { + const char *name = element->Attribute("name"); + +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(name, _nativeLangEncoding); + ::ModifyMenu(_mainMenuHandle, id, MF_BYPOSITION, 0, nameW); +#else + ::ModifyMenu(_mainMenuHandle, id, MF_BYPOSITION, 0, name); +#endif + } + else if (idName = element->Attribute("idName")) + { + const char *name = element->Attribute("name"); + if (!strcmp(idName, "Plugins")) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(name, _nativeLangEncoding); + pluginsTrans = nameW; +#else + pluginsTrans = name; +#endif + } + else if (!strcmp(idName, "Window")) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(name, _nativeLangEncoding); + windowTrans = nameW; +#else + windowTrans = name; +#endif + } + } + } + + TiXmlNodeA *menuCommandsRoot = mainMenu->FirstChild("Commands"); + for (TiXmlNodeA *childNode = menuCommandsRoot->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElementA *element = childNode->ToElement(); + int id; + element->Attribute("id", &id); + const char *name = element->Attribute("name"); + +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(name, _nativeLangEncoding); + ::ModifyMenu(_mainMenuHandle, id, MF_BYCOMMAND, id, nameW); +#else + ::ModifyMenu(_mainMenuHandle, id, MF_BYCOMMAND, id, name); +#endif + } + + TiXmlNodeA *subEntriesRoot = mainMenu->FirstChild("SubEntries"); + + for (TiXmlNodeA *childNode = subEntriesRoot->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElementA *element = childNode->ToElement(); + int x, y; + element->Attribute("posX", &x); + element->Attribute("posY", &y); + const char *name = element->Attribute("name"); +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(name, _nativeLangEncoding); + ::ModifyMenu(::GetSubMenu(_mainMenuHandle, x), y, MF_BYPOSITION, 0, nameW); +#else + ::ModifyMenu(::GetSubMenu(_mainMenuHandle, x), y, MF_BYPOSITION, 0, name); +#endif + } + ::DrawMenuBar(_hSelf); +} + +void Notepad_plus::changeLangTabContextMenu() +{ + const int POS_CLOSE = 0; + const int POS_CLOSEBUT = 1; + const int POS_SAVE = 2; + const int POS_SAVEAS = 3; + const int POS_RENAME = 4; + const int POS_REMOVE = 5; + const int POS_PRINT = 6; + //------7 + const int POS_READONLY = 8; + const int POS_CLEARREADONLY = 9; + //------10 + const int POS_CLIPFULLPATH = 11; + const int POS_CLIPFILENAME = 12; + const int POS_CLIPCURRENTDIR = 13; + //------14 + const int POS_GO2VIEW = 15; + const int POS_CLONE2VIEW = 16; + const int POS_GO2NEWINST = 17; + const int POS_OPENINNEWINST = 18; + + const char *pClose = NULL; + const char *pCloseBut = NULL; + const char *pSave = NULL; + const char *pSaveAs = NULL; + const char *pPrint = NULL; + const char *pReadOnly = NULL; + const char *pClearReadOnly = NULL; + const char *pGoToView = NULL; + const char *pCloneToView = NULL; + const char *pGoToNewInst = NULL; + const char *pOpenInNewInst = NULL; + const char *pCilpFullPath = NULL; + const char *pCilpFileName = NULL; + const char *pCilpCurrentDir = NULL; + const char *pRename = NULL; + const char *pRemove = NULL; + if (_nativeLangA) + { + TiXmlNodeA *tabBarMenu = _nativeLangA->FirstChild("Menu"); + if (tabBarMenu) + { + tabBarMenu = tabBarMenu->FirstChild("TabBar"); + if (tabBarMenu) + { + for (TiXmlNodeA *childNode = tabBarMenu->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElementA *element = childNode->ToElement(); + int ordre; + element->Attribute("order", &ordre); + switch (ordre) + { + case 0 : + pClose = element->Attribute("name"); break; + case 1 : + pCloseBut = element->Attribute("name"); break; + case 2 : + pSave = element->Attribute("name"); break; + case 3 : + pSaveAs = element->Attribute("name"); break; + case 4 : + pPrint = element->Attribute("name"); break; + case 5 : + pGoToView = element->Attribute("name"); break; + case 6 : + pCloneToView = element->Attribute("name"); break; + case 7 : + pCilpFullPath = element->Attribute("name"); break; + case 8 : + pCilpFileName = element->Attribute("name"); break; + case 9 : + pCilpCurrentDir = element->Attribute("name"); break; + case 10 : + pRename = element->Attribute("name"); break; + case 11 : + pRemove = element->Attribute("name"); break; + case 12 : + pReadOnly = element->Attribute("name"); break; + case 13 : + pClearReadOnly = element->Attribute("name"); break; + case 14 : + pGoToNewInst = element->Attribute("name"); break; + case 15 : + pOpenInNewInst = element->Attribute("name"); break; + } + } + } + } + } + HMENU hCM = _tabPopupMenu.getMenuHandle(); + +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + if (pGoToView && pGoToView[0]) + { + const wchar_t *goToViewG = wmc->char2wchar(pGoToView, _nativeLangEncoding); + int cmdID = ::GetMenuItemID(hCM, POS_GO2VIEW); + ::ModifyMenu(hCM, POS_GO2VIEW, MF_BYPOSITION, cmdID, goToViewG); + } + if (pCloneToView && pCloneToView[0]) + { + const wchar_t *cloneToViewG = wmc->char2wchar(pCloneToView, _nativeLangEncoding); + int cmdID = ::GetMenuItemID(hCM, POS_CLONE2VIEW); + ::ModifyMenu(hCM, POS_CLONE2VIEW, MF_BYPOSITION, cmdID, cloneToViewG); + } + if (pGoToNewInst && pGoToNewInst[0]) + { + const wchar_t *goToNewInstG = wmc->char2wchar(pGoToNewInst, _nativeLangEncoding); + int cmdID = ::GetMenuItemID(hCM, POS_GO2NEWINST); + ::ModifyMenu(hCM, POS_GO2NEWINST, MF_BYPOSITION, cmdID, goToNewInstG); + } + if (pOpenInNewInst && pOpenInNewInst[0]) + { + const wchar_t *openInNewInstG = wmc->char2wchar(pOpenInNewInst, _nativeLangEncoding); + int cmdID = ::GetMenuItemID(hCM, POS_OPENINNEWINST); + ::ModifyMenu(hCM, POS_OPENINNEWINST, MF_BYPOSITION, cmdID, openInNewInstG); + } + if (pClose && pClose[0]) + { + const wchar_t *closeG = wmc->char2wchar(pClose, _nativeLangEncoding); + int cmdID = ::GetMenuItemID(hCM, POS_CLOSE); + ::ModifyMenu(hCM, POS_CLOSE, MF_BYPOSITION, cmdID, closeG); + } + if (pCloseBut && pCloseBut[0]) + { + const wchar_t *closeButG = wmc->char2wchar(pCloseBut, _nativeLangEncoding); + int cmdID = ::GetMenuItemID(hCM, POS_CLOSEBUT); + ::ModifyMenu(hCM, POS_CLOSEBUT, MF_BYPOSITION, cmdID, closeButG); + } + if (pSave && pSave[0]) + { + const wchar_t *saveG = wmc->char2wchar(pSave, _nativeLangEncoding); + int cmdID = ::GetMenuItemID(hCM, POS_SAVE); + ::ModifyMenu(hCM, POS_SAVE, MF_BYPOSITION, cmdID, saveG); + } + if (pSaveAs && pSaveAs[0]) + { + const wchar_t *saveAsG = wmc->char2wchar(pSaveAs, _nativeLangEncoding); + int cmdID = ::GetMenuItemID(hCM, POS_SAVEAS); + ::ModifyMenu(hCM, POS_SAVEAS, MF_BYPOSITION, cmdID, saveAsG); + } + if (pPrint && pPrint[0]) + { + const wchar_t *printG = wmc->char2wchar(pPrint, _nativeLangEncoding); + int cmdID = ::GetMenuItemID(hCM, POS_PRINT); + ::ModifyMenu(hCM, POS_PRINT, MF_BYPOSITION, cmdID, printG); + } + if (pReadOnly && pReadOnly[0]) + { + const wchar_t *readOnlyG = wmc->char2wchar(pReadOnly, _nativeLangEncoding); + int cmdID = ::GetMenuItemID(hCM, POS_READONLY); + ::ModifyMenu(hCM, POS_READONLY, MF_BYPOSITION, cmdID, readOnlyG); + } + if (pClearReadOnly && pClearReadOnly[0]) + { + const wchar_t *clearReadOnlyG = wmc->char2wchar(pClearReadOnly, _nativeLangEncoding); + int cmdID = ::GetMenuItemID(hCM, POS_CLEARREADONLY); + ::ModifyMenu(hCM, POS_CLEARREADONLY, MF_BYPOSITION, cmdID, clearReadOnlyG); + } + if (pCilpFullPath && pCilpFullPath[0]) + { + const wchar_t *cilpFullPathG = wmc->char2wchar(pCilpFullPath, _nativeLangEncoding); + int cmdID = ::GetMenuItemID(hCM, POS_CLIPFULLPATH); + ::ModifyMenu(hCM, POS_CLIPFULLPATH, MF_BYPOSITION, cmdID, cilpFullPathG); + } + if (pCilpFileName && pCilpFileName[0]) + { + const wchar_t *cilpFileNameG = wmc->char2wchar(pCilpFileName, _nativeLangEncoding); + int cmdID = ::GetMenuItemID(hCM, POS_CLIPFILENAME); + ::ModifyMenu(hCM, POS_CLIPFILENAME, MF_BYPOSITION, cmdID, cilpFileNameG); + } + if (pCilpCurrentDir && pCilpCurrentDir[0]) + { + const wchar_t * cilpCurrentDirG= wmc->char2wchar(pCilpCurrentDir, _nativeLangEncoding); + int cmdID = ::GetMenuItemID(hCM, POS_CLIPCURRENTDIR); + ::ModifyMenu(hCM, POS_CLIPCURRENTDIR, MF_BYPOSITION, cmdID, cilpCurrentDirG); + } + if (pRename && pRename[0]) + { + const wchar_t *renameG = wmc->char2wchar(pRename, _nativeLangEncoding); + int cmdID = ::GetMenuItemID(hCM, POS_RENAME); + ::ModifyMenu(hCM, POS_RENAME, MF_BYPOSITION, cmdID, renameG); + } + if (pRemove && pRemove[0]) + { + const wchar_t *removeG = wmc->char2wchar(pRemove, _nativeLangEncoding); + int cmdID = ::GetMenuItemID(hCM, POS_REMOVE); + ::ModifyMenu(hCM, POS_REMOVE, MF_BYPOSITION, cmdID, removeG); + } +#else + if (pGoToView && pGoToView[0]) + { + int cmdID = ::GetMenuItemID(hCM, POS_GO2VIEW); + ::ModifyMenu(hCM, POS_GO2VIEW, MF_BYPOSITION, cmdID, pGoToView); + } + if (pCloneToView && pCloneToView[0]) + { + int cmdID = ::GetMenuItemID(hCM, POS_CLONE2VIEW); + ::ModifyMenu(hCM, POS_CLONE2VIEW, MF_BYPOSITION, cmdID, pCloneToView); + } + if (pGoToNewInst && pGoToNewInst[0]) + { + int cmdID = ::GetMenuItemID(hCM, POS_GO2NEWINST); + ::ModifyMenu(hCM, POS_GO2NEWINST, MF_BYPOSITION, cmdID, pGoToNewInst); + } + if (pOpenInNewInst && pOpenInNewInst[0]) + { + int cmdID = ::GetMenuItemID(hCM, POS_OPENINNEWINST); + ::ModifyMenu(hCM, POS_OPENINNEWINST, MF_BYPOSITION, cmdID, pOpenInNewInst); + } + if (pClose && pClose[0]) + { + int cmdID = ::GetMenuItemID(hCM, POS_CLOSE); + ::ModifyMenu(hCM, POS_CLOSE, MF_BYPOSITION, cmdID, pClose); + } + if (pCloseBut && pCloseBut[0]) + { + int cmdID = ::GetMenuItemID(hCM, POS_CLOSEBUT); + ::ModifyMenu(hCM, POS_CLOSEBUT, MF_BYPOSITION, cmdID, pCloseBut); + } + if (pSave && pSave[0]) + { + int cmdID = ::GetMenuItemID(hCM, POS_SAVE); + ::ModifyMenu(hCM, POS_SAVE, MF_BYPOSITION, cmdID, pSave); + } + if (pSaveAs && pSaveAs[0]) + { + int cmdID = ::GetMenuItemID(hCM, POS_SAVEAS); + ::ModifyMenu(hCM, POS_SAVEAS, MF_BYPOSITION, cmdID, pSaveAs); + } + if (pPrint && pPrint[0]) + { + int cmdID = ::GetMenuItemID(hCM, POS_PRINT); + ::ModifyMenu(hCM, POS_PRINT, MF_BYPOSITION, cmdID, pPrint); + } + if (pClearReadOnly && pClearReadOnly[0]) + { + int cmdID = ::GetMenuItemID(hCM, POS_CLEARREADONLY); + ::ModifyMenu(hCM, POS_CLEARREADONLY, MF_BYPOSITION, cmdID, pClearReadOnly); + } + if (pReadOnly && pReadOnly[0]) + { + int cmdID = ::GetMenuItemID(hCM, POS_READONLY); + ::ModifyMenu(hCM, POS_READONLY, MF_BYPOSITION, cmdID, pReadOnly); + } + if (pCilpFullPath && pCilpFullPath[0]) + { + int cmdID = ::GetMenuItemID(hCM, POS_CLIPFULLPATH); + ::ModifyMenu(hCM, POS_CLIPFULLPATH, MF_BYPOSITION, cmdID, pCilpFullPath); + } + if (pCilpFileName && pCilpFileName[0]) + { + int cmdID = ::GetMenuItemID(hCM, POS_CLIPFILENAME); + ::ModifyMenu(hCM, POS_CLIPFILENAME, MF_BYPOSITION, cmdID, pCilpFileName); + } + if (pCilpCurrentDir && pCilpCurrentDir[0]) + { + int cmdID = ::GetMenuItemID(hCM, POS_CLIPCURRENTDIR); + ::ModifyMenu(hCM, POS_CLIPCURRENTDIR, MF_BYPOSITION, cmdID, pCilpCurrentDir); + } + if (pRename && pRename[0]) + { + int cmdID = ::GetMenuItemID(hCM, POS_RENAME); + ::ModifyMenu(hCM, POS_RENAME, MF_BYPOSITION, cmdID, pRename); + } + if (pRemove && pRemove[0]) + { + int cmdID = ::GetMenuItemID(hCM, POS_REMOVE); + ::ModifyMenu(hCM, POS_REMOVE, MF_BYPOSITION, cmdID, pRemove); + } +#endif +} + +void Notepad_plus::changeLangTabDrapContextMenu() +{ + const int POS_GO2VIEW = 0; + const int POS_CLONE2VIEW = 1; + const char *goToViewA = NULL; + const char *cloneToViewA = NULL; + + if (_nativeLangA) + { + TiXmlNodeA *tabBarMenu = _nativeLangA->FirstChild("Menu"); + if (tabBarMenu) + tabBarMenu = tabBarMenu->FirstChild("TabBar"); + if (tabBarMenu) + { + for (TiXmlNodeA *childNode = tabBarMenu->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElementA *element = childNode->ToElement(); + int ordre; + element->Attribute("order", &ordre); + if (ordre == 5) + goToViewA = element->Attribute("name"); + else if (ordre == 6) + cloneToViewA = element->Attribute("name"); + } + } + HMENU hCM = _tabPopupDropMenu.getMenuHandle(); +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + if (goToViewA && goToViewA[0]) + { + const wchar_t *goToViewG = wmc->char2wchar(goToViewA, _nativeLangEncoding); + int cmdID = ::GetMenuItemID(hCM, POS_GO2VIEW); + ::ModifyMenu(hCM, POS_GO2VIEW, MF_BYPOSITION|MF_STRING, cmdID, goToViewG); + } + if (cloneToViewA && cloneToViewA[0]) + { + const wchar_t *cloneToViewG = wmc->char2wchar(cloneToViewA, _nativeLangEncoding); + int cmdID = ::GetMenuItemID(hCM, POS_CLONE2VIEW); + ::ModifyMenu(hCM, POS_CLONE2VIEW, MF_BYPOSITION|MF_STRING, cmdID, cloneToViewG); + } +#else + if (goToViewA && goToViewA[0]) + { + int cmdID = ::GetMenuItemID(hCM, POS_GO2VIEW); + ::ModifyMenu(hCM, POS_GO2VIEW, MF_BYPOSITION, cmdID, goToViewA); + } + if (cloneToViewA && cloneToViewA[0]) + { + int cmdID = ::GetMenuItemID(hCM, POS_CLONE2VIEW); + ::ModifyMenu(hCM, POS_CLONE2VIEW, MF_BYPOSITION, cmdID, cloneToViewA); + } +#endif + } +} + +void Notepad_plus::changeConfigLang() +{ + if (!_nativeLangA) return; + + TiXmlNodeA *styleConfDlgNode = _nativeLangA->FirstChild("Dialog"); + if (!styleConfDlgNode) return; + + styleConfDlgNode = styleConfDlgNode->FirstChild("StyleConfig"); + if (!styleConfDlgNode) return; + + HWND hDlg = _configStyleDlg.getHSelf(); + +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); +#endif + + // Set Title + const char *titre = (styleConfDlgNode->ToElement())->Attribute("title"); + + if ((titre && titre[0]) && hDlg) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(titre, _nativeLangEncoding); + ::SetWindowText(hDlg, nameW); +#else + ::SetWindowText(hDlg, titre); +#endif + } + for (TiXmlNodeA *childNode = styleConfDlgNode->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElementA *element = childNode->ToElement(); + int id; + const char *sentinel = element->Attribute("id", &id); + const char *name = element->Attribute("name"); + if (sentinel && (name && name[0])) + { + HWND hItem = ::GetDlgItem(hDlg, id); + if (hItem) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(name, _nativeLangEncoding); + ::SetWindowText(hItem, nameW); +#else + ::SetWindowText(hItem, name); +#endif + } + } + } + hDlg = _configStyleDlg.getHSelf(); + styleConfDlgNode = styleConfDlgNode->FirstChild("SubDialog"); + + for (TiXmlNodeA *childNode = styleConfDlgNode->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElementA *element = childNode->ToElement(); + int id; + const char *sentinel = element->Attribute("id", &id); + const char *name = element->Attribute("name"); + if (sentinel && (name && name[0])) + { + HWND hItem = ::GetDlgItem(hDlg, id); + if (hItem) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(name, _nativeLangEncoding); + ::SetWindowText(hItem, nameW); +#else + ::SetWindowText(hItem, name); +#endif + } + } + } +} + + +void Notepad_plus::changeStyleCtrlsLang(HWND hDlg, int *idArray, const char **translatedText) +{ + const int iColorStyle = 0; + const int iUnderline = 8; + + HWND hItem; + for (int i = iColorStyle ; i < (iUnderline + 1) ; i++) + { + if (translatedText[i] && translatedText[i][0]) + { + hItem = ::GetDlgItem(hDlg, idArray[i]); + if (hItem) + { +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + const wchar_t *nameW = wmc->char2wchar(translatedText[i], _nativeLangEncoding); + ::SetWindowText(hItem, nameW); +#else + ::SetWindowText(hItem, translatedText[i]); +#endif + + } + } + } +} + +void Notepad_plus::changeUserDefineLang() +{ + if (!_nativeLangA) return; + + TiXmlNodeA *userDefineDlgNode = _nativeLangA->FirstChild("Dialog"); + if (!userDefineDlgNode) return; + + userDefineDlgNode = userDefineDlgNode->FirstChild("UserDefine"); + if (!userDefineDlgNode) return; + + UserDefineDialog *userDefineDlg = _pEditView->getUserDefineDlg(); + + HWND hDlg = userDefineDlg->getHSelf(); +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); +#endif + + // Set Title + const char *titre = (userDefineDlgNode->ToElement())->Attribute("title"); + if (titre && titre[0]) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(titre, _nativeLangEncoding); + ::SetWindowText(hDlg, nameW); +#else + ::SetWindowText(hDlg, titre); +#endif + } + // pour ses propres controls + const int nbControl = 9; + const char *translatedText[nbControl]; + for (int i = 0 ; i < nbControl ; i++) + translatedText[i] = NULL; + + for (TiXmlNodeA *childNode = userDefineDlgNode->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElementA *element = childNode->ToElement(); + int id; + const char *sentinel = element->Attribute("id", &id); + const char *name = element->Attribute("name"); + + if (sentinel && (name && name[0])) + { + if (id > 30) + { + HWND hItem = ::GetDlgItem(hDlg, id); + if (hItem) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(name, _nativeLangEncoding); + ::SetWindowText(hItem, nameW); +#else + ::SetWindowText(hItem, name); +#endif + } + } + else + { + switch(id) + { + case 0: case 1: case 2: case 3: case 4: + case 5: case 6: case 7: case 8: + translatedText[id] = name; break; + } + } + } + } + + const int nbDlg = 4; + HWND hDlgArrary[nbDlg]; + hDlgArrary[0] = userDefineDlg->getFolderHandle(); + hDlgArrary[1] = userDefineDlg->getKeywordsHandle(); + hDlgArrary[2] = userDefineDlg->getCommentHandle(); + hDlgArrary[3] = userDefineDlg->getSymbolHandle(); + + const int nbGrpFolder = 3; + int folderID[nbGrpFolder][nbControl] = {\ + {IDC_DEFAULT_COLORSTYLEGROUP_STATIC, IDC_DEFAULT_FG_STATIC, IDC_DEFAULT_BG_STATIC, IDC_DEFAULT_FONTSTYLEGROUP_STATIC, IDC_DEFAULT_FONTNAME_STATIC, IDC_DEFAULT_FONTSIZE_STATIC, IDC_DEFAULT_BOLD_CHECK, IDC_DEFAULT_ITALIC_CHECK, IDC_DEFAULT_UNDERLINE_CHECK},\ + {IDC_FOLDEROPEN_COLORSTYLEGROUP_STATIC, IDC_FOLDEROPEN_FG_STATIC, IDC_FOLDEROPEN_BG_STATIC, IDC_FOLDEROPEN_FONTSTYLEGROUP_STATIC, IDC_FOLDEROPEN_FONTNAME_STATIC, IDC_FOLDEROPEN_FONTSIZE_STATIC, IDC_FOLDEROPEN_BOLD_CHECK, IDC_FOLDEROPEN_ITALIC_CHECK, IDC_FOLDEROPEN_UNDERLINE_CHECK},\ + {IDC_FOLDERCLOSE_COLORSTYLEGROUP_STATIC, IDC_FOLDERCLOSE_FG_STATIC, IDC_FOLDERCLOSE_BG_STATIC, IDC_FOLDERCLOSE_FONTSTYLEGROUP_STATIC, IDC_FOLDERCLOSE_FONTNAME_STATIC, IDC_FOLDERCLOSE_FONTSIZE_STATIC, IDC_FOLDERCLOSE_BOLD_CHECK, IDC_FOLDERCLOSE_ITALIC_CHECK, IDC_FOLDERCLOSE_UNDERLINE_CHECK}\ + }; + + const int nbGrpKeywords = 4; + int keywordsID[nbGrpKeywords][nbControl] = {\ + {IDC_KEYWORD1_COLORSTYLEGROUP_STATIC, IDC_KEYWORD1_FG_STATIC, IDC_KEYWORD1_BG_STATIC, IDC_KEYWORD1_FONTSTYLEGROUP_STATIC, IDC_KEYWORD1_FONTNAME_STATIC, IDC_KEYWORD1_FONTSIZE_STATIC, IDC_KEYWORD1_BOLD_CHECK, IDC_KEYWORD1_ITALIC_CHECK, IDC_KEYWORD1_UNDERLINE_CHECK},\ + {IDC_KEYWORD2_COLORSTYLEGROUP_STATIC, IDC_KEYWORD2_FG_STATIC, IDC_KEYWORD2_BG_STATIC, IDC_KEYWORD2_FONTSTYLEGROUP_STATIC, IDC_KEYWORD2_FONTNAME_STATIC, IDC_KEYWORD2_FONTSIZE_STATIC, IDC_KEYWORD2_BOLD_CHECK, IDC_KEYWORD2_ITALIC_CHECK, IDC_KEYWORD2_UNDERLINE_CHECK},\ + {IDC_KEYWORD3_COLORSTYLEGROUP_STATIC, IDC_KEYWORD3_FG_STATIC, IDC_KEYWORD3_BG_STATIC, IDC_KEYWORD3_FONTSTYLEGROUP_STATIC, IDC_KEYWORD3_FONTNAME_STATIC, IDC_KEYWORD3_FONTSIZE_STATIC, IDC_KEYWORD3_BOLD_CHECK, IDC_KEYWORD3_ITALIC_CHECK, IDC_KEYWORD3_UNDERLINE_CHECK},\ + {IDC_KEYWORD4_COLORSTYLEGROUP_STATIC, IDC_KEYWORD4_FG_STATIC, IDC_KEYWORD4_BG_STATIC, IDC_KEYWORD4_FONTSTYLEGROUP_STATIC, IDC_KEYWORD4_FONTNAME_STATIC, IDC_KEYWORD4_FONTSIZE_STATIC, IDC_KEYWORD4_BOLD_CHECK, IDC_KEYWORD4_ITALIC_CHECK, IDC_KEYWORD4_UNDERLINE_CHECK}\ + }; + + const int nbGrpComment = 3; + int commentID[nbGrpComment][nbControl] = {\ + {IDC_COMMENT_COLORSTYLEGROUP_STATIC, IDC_COMMENT_FG_STATIC, IDC_COMMENT_BG_STATIC, IDC_COMMENT_FONTSTYLEGROUP_STATIC, IDC_COMMENT_FONTNAME_STATIC, IDC_COMMENT_FONTSIZE_STATIC, IDC_COMMENT_BOLD_CHECK, IDC_COMMENT_ITALIC_CHECK, IDC_COMMENT_UNDERLINE_CHECK},\ + {IDC_NUMBER_COLORSTYLEGROUP_STATIC, IDC_NUMBER_FG_STATIC, IDC_NUMBER_BG_STATIC, IDC_NUMBER_FONTSTYLEGROUP_STATIC, IDC_NUMBER_FONTNAME_STATIC, IDC_NUMBER_FONTSIZE_STATIC, IDC_NUMBER_BOLD_CHECK, IDC_NUMBER_ITALIC_CHECK, IDC_NUMBER_UNDERLINE_CHECK},\ + {IDC_COMMENTLINE_COLORSTYLEGROUP_STATIC, IDC_COMMENTLINE_FG_STATIC, IDC_COMMENTLINE_BG_STATIC, IDC_COMMENTLINE_FONTSTYLEGROUP_STATIC, IDC_COMMENTLINE_FONTNAME_STATIC, IDC_COMMENTLINE_FONTSIZE_STATIC, IDC_COMMENTLINE_BOLD_CHECK, IDC_COMMENTLINE_ITALIC_CHECK, IDC_COMMENTLINE_UNDERLINE_CHECK}\ + }; + + const int nbGrpOperator = 3; + int operatorID[nbGrpOperator][nbControl] = {\ + {IDC_SYMBOL_COLORSTYLEGROUP_STATIC, IDC_SYMBOL_FG_STATIC, IDC_SYMBOL_BG_STATIC, IDC_SYMBOL_FONTSTYLEGROUP_STATIC, IDC_SYMBOL_FONTNAME_STATIC, IDC_SYMBOL_FONTSIZE_STATIC, IDC_SYMBOL_BOLD_CHECK, IDC_SYMBOL_ITALIC_CHECK, IDC_SYMBOL_UNDERLINE_CHECK},\ + {IDC_SYMBOL_COLORSTYLEGROUP2_STATIC, IDC_SYMBOL_FG2_STATIC, IDC_SYMBOL_BG2_STATIC, IDC_SYMBOL_FONTSTYLEGROUP2_STATIC, IDC_SYMBOL_FONTNAME2_STATIC, IDC_SYMBOL_FONTSIZE2_STATIC, IDC_SYMBOL_BOLD2_CHECK, IDC_SYMBOL_ITALIC2_CHECK, IDC_SYMBOL_UNDERLINE2_CHECK},\ + {IDC_SYMBOL_COLORSTYLEGROUP3_STATIC, IDC_SYMBOL_FG3_STATIC, IDC_SYMBOL_BG3_STATIC, IDC_SYMBOL_FONTSTYLEGROUP3_STATIC, IDC_SYMBOL_FONTNAME3_STATIC, IDC_SYMBOL_FONTSIZE3_STATIC, IDC_SYMBOL_BOLD3_CHECK, IDC_SYMBOL_ITALIC3_CHECK, IDC_SYMBOL_UNDERLINE3_CHECK} + }; + + int nbGpArray[nbDlg] = {nbGrpFolder, nbGrpKeywords, nbGrpComment, nbGrpOperator}; + const char nodeNameArray[nbDlg][16] = {"Folder", "Keywords", "Comment", "Operator"}; + + for (int i = 0 ; i < nbDlg ; i++) + { + + for (int j = 0 ; j < nbGpArray[i] ; j++) + { + switch (i) + { + case 0 : changeStyleCtrlsLang(hDlgArrary[i], folderID[j], translatedText); break; + case 1 : changeStyleCtrlsLang(hDlgArrary[i], keywordsID[j], translatedText); break; + case 2 : changeStyleCtrlsLang(hDlgArrary[i], commentID[j], translatedText); break; + case 3 : changeStyleCtrlsLang(hDlgArrary[i], operatorID[j], translatedText); break; + } + } + TiXmlNodeA *node = userDefineDlgNode->FirstChild(nodeNameArray[i]); + + if (node) + { + // Set Title + titre = (node->ToElement())->Attribute("title"); + if (titre &&titre[0]) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(titre, _nativeLangEncoding); + userDefineDlg->setTabName(i, nameW); +#else + userDefineDlg->setTabName(i, titre); +#endif + } + for (TiXmlNodeA *childNode = node->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElementA *element = childNode->ToElement(); + int id; + const char *sentinel = element->Attribute("id", &id); + const char *name = element->Attribute("name"); + if (sentinel && (name && name[0])) + { + HWND hItem = ::GetDlgItem(hDlgArrary[i], id); + if (hItem) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(name, _nativeLangEncoding); + ::SetWindowText(hItem, nameW); +#else + ::SetWindowText(hItem, name); +#endif + } + } + } + } + } +} + +void Notepad_plus::changeFindReplaceDlgLang() +{ + if (_nativeLangA) + { + TiXmlNodeA *dlgNode = _nativeLangA->FirstChild("Dialog"); + if (dlgNode) + { + NppParameters *pNppParam = NppParameters::getInstance(); + dlgNode = searchDlgNode(dlgNode, "Find"); + if (dlgNode) + { + const char *titre1 = (dlgNode->ToElement())->Attribute("titleFind"); + const char *titre2 = (dlgNode->ToElement())->Attribute("titleReplace"); + const char *titre3 = (dlgNode->ToElement())->Attribute("titleFindInFiles"); + if (titre1 && titre2 && titre3) + { +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + + basic_string nameW = wmc->char2wchar(titre1, _nativeLangEncoding); + pNppParam->getFindDlgTabTitiles()._find = nameW; + + nameW = wmc->char2wchar(titre2, _nativeLangEncoding); + pNppParam->getFindDlgTabTitiles()._replace = nameW; + + nameW = wmc->char2wchar(titre3, _nativeLangEncoding); + pNppParam->getFindDlgTabTitiles()._findInFiles = nameW; +#else + pNppParam->getFindDlgTabTitiles()._find = titre1; + pNppParam->getFindDlgTabTitiles()._replace = titre2; + pNppParam->getFindDlgTabTitiles()._findInFiles = titre3; +#endif + } + } + + _findReplaceDlg.changeTabName(FIND_DLG, pNppParam->getFindDlgTabTitiles()._find.c_str()); + _findReplaceDlg.changeTabName(REPLACE_DLG, pNppParam->getFindDlgTabTitiles()._replace.c_str()); + _findReplaceDlg.changeTabName(FINDINFILES_DLG, pNppParam->getFindDlgTabTitiles()._findInFiles.c_str()); + } + } + changeDlgLang(_findReplaceDlg.getHSelf(), "Find"); +} + +void Notepad_plus::changePrefereceDlgLang() +{ + changeDlgLang(_preference.getHSelf(), "Preference"); + + char titre[128]; + +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); +#endif + + changeDlgLang(_preference._barsDlg.getHSelf(), "Global", titre); + if (*titre) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(titre, _nativeLangEncoding); + _preference._ctrlTab.renameTab(TEXT("Global"), nameW); +#else + _preference._ctrlTab.renameTab("Global", titre); +#endif + } + changeDlgLang(_preference._marginsDlg.getHSelf(), "Scintillas", titre); + if (*titre) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(titre, _nativeLangEncoding); + _preference._ctrlTab.renameTab(TEXT("Scintillas"), nameW); +#else + _preference._ctrlTab.renameTab("Scintillas", titre); +#endif + } + + changeDlgLang(_preference._defaultNewDocDlg.getHSelf(), "NewDoc", titre); + if (*titre) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(titre, _nativeLangEncoding); + _preference._ctrlTab.renameTab(TEXT("NewDoc"), nameW); +#else + _preference._ctrlTab.renameTab("NewDoc", titre); +#endif + } + + changeDlgLang(_preference._fileAssocDlg.getHSelf(), "FileAssoc", titre); + if (*titre) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(titre, _nativeLangEncoding); + _preference._ctrlTab.renameTab(TEXT("FileAssoc"), nameW); +#else + _preference._ctrlTab.renameTab("FileAssoc", titre); +#endif + } + + changeDlgLang(_preference._langMenuDlg.getHSelf(), "LangMenu", titre); + if (*titre) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(titre, _nativeLangEncoding); + _preference._ctrlTab.renameTab(TEXT("LangMenu"), nameW); +#else + _preference._ctrlTab.renameTab("LangMenu", titre); +#endif + } + + changeDlgLang(_preference._printSettingsDlg.getHSelf(), "Print1", titre); + if (*titre) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(titre, _nativeLangEncoding); + _preference._ctrlTab.renameTab(TEXT("Print1"), nameW); +#else + _preference._ctrlTab.renameTab("Print1", titre); +#endif + } + changeDlgLang(_preference._printSettings2Dlg.getHSelf(), "Print2", titre); + if (*titre) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(titre, _nativeLangEncoding); + _preference._ctrlTab.renameTab(TEXT("Print2"), nameW); +#else + _preference._ctrlTab.renameTab("Print2", titre); +#endif + } + changeDlgLang(_preference._settingsDlg.getHSelf(), "MISC", titre); + if (*titre) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(titre, _nativeLangEncoding); + _preference._ctrlTab.renameTab(TEXT("MISC"), nameW); +#else + _preference._ctrlTab.renameTab("MISC", titre); +#endif + } + changeDlgLang(_preference._backupDlg.getHSelf(), "Backup", titre); + if (*titre) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(titre, _nativeLangEncoding); + _preference._ctrlTab.renameTab(TEXT("Backup"), nameW); +#else + _preference._ctrlTab.renameTab("Backup", titre); +#endif + } +} + +void Notepad_plus::changeShortcutLang() +{ + if (!_nativeLangA) return; + + NppParameters * pNppParam = NppParameters::getInstance(); + vector & mainshortcuts = pNppParam->getUserShortcuts(); + vector & scinshortcuts = pNppParam->getScintillaKeyList(); + int mainSize = (int)mainshortcuts.size(); + int scinSize = (int)scinshortcuts.size(); + + TiXmlNodeA *shortcuts = _nativeLangA->FirstChild("Shortcuts"); + if (!shortcuts) return; + + shortcuts = shortcuts->FirstChild("Main"); + if (!shortcuts) return; + + TiXmlNodeA *entriesRoot = shortcuts->FirstChild("Entries"); + if (!entriesRoot) return; + + for (TiXmlNodeA *childNode = entriesRoot->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElementA *element = childNode->ToElement(); + int index, id; + if (element->Attribute("index", &index) && element->Attribute("id", &id)) + { + if (index > -1 && index < mainSize) { //valid index only + const char *name = element->Attribute("name"); + CommandShortcut & csc = mainshortcuts[index]; + if (csc.getID() == id) + { +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + const wchar_t * nameW = wmc->char2wchar(name, _nativeLangEncoding); + csc.setName(nameW); +#else + csc.setName(name); +#endif + } + } + } + } + + //Scintilla + shortcuts = _nativeLangA->FirstChild("Shortcuts"); + if (!shortcuts) return; + + shortcuts = shortcuts->FirstChild("Scintilla"); + if (!shortcuts) return; + + entriesRoot = shortcuts->FirstChild("Entries"); + if (!entriesRoot) return; + + for (TiXmlNodeA *childNode = entriesRoot->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElementA *element = childNode->ToElement(); + int index; + if (element->Attribute("index", &index)) + { + if (index > -1 && index < scinSize) { //valid index only + const char *name = element->Attribute("name"); + ScintillaKeyMap & skm = scinshortcuts[index]; +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + const wchar_t * nameW = wmc->char2wchar(name, _nativeLangEncoding); + skm.setName(nameW); +#else + skm.setName(name); +#endif + } + } + } + +} + +void Notepad_plus::changeShortcutmapperLang(ShortcutMapper * sm) +{ + if (!_nativeLangA) return; + + TiXmlNodeA *shortcuts = _nativeLangA->FirstChild("Dialog"); + if (!shortcuts) return; + + shortcuts = shortcuts->FirstChild("ShortcutMapper"); + if (!shortcuts) return; + + for (TiXmlNodeA *childNode = shortcuts->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElementA *element = childNode->ToElement(); + int index; + if (element->Attribute("index", &index)) + { + if (index > -1 && index < 5) //valid index only + { + const char *name = element->Attribute("name"); + +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + const wchar_t * nameW = wmc->char2wchar(name, _nativeLangEncoding); + sm->translateTab(index, nameW); +#else + sm->translateTab(index, name); +#endif + } + } + } +} + + +TiXmlNodeA * searchDlgNode(TiXmlNodeA *node, const char *dlgTagName) +{ + TiXmlNodeA *dlgNode = node->FirstChild(dlgTagName); + if (dlgNode) return dlgNode; + for (TiXmlNodeA *childNode = node->FirstChildElement(); + childNode ; + childNode = childNode->NextSibling() ) + { + dlgNode = searchDlgNode(childNode, dlgTagName); + if (dlgNode) return dlgNode; + } + return NULL; +} + +bool Notepad_plus::changeDlgLang(HWND hDlg, const char *dlgTagName, char *title) +{ + if (title) + title[0] = '\0'; + + if (!_nativeLangA) return false; + + TiXmlNodeA *dlgNode = _nativeLangA->FirstChild("Dialog"); + if (!dlgNode) return false; + + dlgNode = searchDlgNode(dlgNode, dlgTagName); + if (!dlgNode) return false; + +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); +#endif + + // Set Title + const char *titre = (dlgNode->ToElement())->Attribute("title"); + if ((titre && titre[0]) && hDlg) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(titre, _nativeLangEncoding); + ::SetWindowText(hDlg, nameW); +#else + ::SetWindowText(hDlg, titre); +#endif + if (title) + strcpy(title, titre); + } + + // Set the text of child control + for (TiXmlNodeA *childNode = dlgNode->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElementA *element = childNode->ToElement(); + int id; + const char *sentinel = element->Attribute("id", &id); + const char *name = element->Attribute("name"); + if (sentinel && (name && name[0])) + { + HWND hItem = ::GetDlgItem(hDlg, id); + if (hItem) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(name, _nativeLangEncoding); + ::SetWindowText(hItem, nameW); +#else + ::SetWindowText(hItem, name); +#endif + } + } + } + return true; +} + +static generic_string extractSymbol(TCHAR prefix, const TCHAR *str2extract) +{ + bool found = false; + TCHAR extracted[128] = TEXT(""); + + for (int i = 0, j = 0 ; i < lstrlen(str2extract) ; i++) + { + if (found) + { + if (!str2extract[i] || str2extract[i] == ' ') + { + extracted[j] = '\0'; + return generic_string(extracted); + } + extracted[j++] = str2extract[i]; + + } + else + { + if (!str2extract[i]) + return TEXT(""); + + if (str2extract[i] == prefix) + found = true; + } + } + return generic_string(extracted); +}; + +bool Notepad_plus::doBlockComment(comment_mode currCommentMode) +{ + const TCHAR *commentLineSybol; + generic_string symbol; + + Buffer * buf = _pEditView->getCurrentBuffer(); + if (buf->getLangType() == L_USER) + { + UserLangContainer * userLangContainer = NppParameters::getInstance()->getULCFromName(buf->getUserDefineLangName()); + if (!userLangContainer) + return false; + + symbol = extractSymbol('0', userLangContainer->_keywordLists[4]); + commentLineSybol = symbol.c_str(); + } + else + commentLineSybol = buf->getCommentLineSymbol(); + + + if ((!commentLineSybol) || (!commentLineSybol[0])) + return false; + + generic_string comment(commentLineSybol); + comment += TEXT(" "); + + const int linebufferSize = 1000; + TCHAR linebuf[linebufferSize]; + size_t comment_length = comment.length(); + size_t selectionStart = _pEditView->execute(SCI_GETSELECTIONSTART); + size_t selectionEnd = _pEditView->execute(SCI_GETSELECTIONEND); + size_t caretPosition = _pEditView->execute(SCI_GETCURRENTPOS); + // checking if caret is located in _beginning_ of selected block + bool move_caret = caretPosition < selectionEnd; + int selStartLine = _pEditView->execute(SCI_LINEFROMPOSITION, selectionStart); + int selEndLine = _pEditView->execute(SCI_LINEFROMPOSITION, selectionEnd); + int lines = selEndLine - selStartLine; + size_t firstSelLineStart = _pEditView->execute(SCI_POSITIONFROMLINE, selStartLine); + // "caret return" is part of the last selected line + if ((lines > 0) && (selectionEnd == static_cast(_pEditView->execute(SCI_POSITIONFROMLINE, selEndLine)))) + selEndLine--; + _pEditView->execute(SCI_BEGINUNDOACTION); + + for (int i = selStartLine; i <= selEndLine; i++) + { + int lineStart = _pEditView->execute(SCI_POSITIONFROMLINE, i); + int lineIndent = lineStart; + int lineEnd = _pEditView->execute(SCI_GETLINEENDPOSITION, i); + if ((lineEnd - lineIndent) >= linebufferSize) // Avoid buffer size problems + continue; + + lineIndent = _pEditView->execute(SCI_GETLINEINDENTPOSITION, i); + _pEditView->getGenericText(linebuf, lineIndent, lineEnd); + + generic_string linebufStr = linebuf; + + // empty lines are not commented + if (lstrlen(linebuf) < 1) + continue; + if (currCommentMode != cm_comment) + { + if (linebufStr.substr(0, comment_length - 1) == comment.substr(0, comment_length - 1)) + { + int len = (linebufStr.substr(0, comment_length) == comment)?comment_length:comment_length - 1; + + _pEditView->execute(SCI_SETSEL, lineIndent, lineIndent + len); + _pEditView->replaceSelWith(""); + + if (i == selStartLine) // is this the first selected line? + selectionStart -= len; + selectionEnd -= len; // every iteration + continue; + } + } + if ((currCommentMode == cm_toggle) || (currCommentMode == cm_comment)) + { + if (i == selStartLine) // is this the first selected line? + selectionStart += comment_length; + selectionEnd += comment_length; // every iteration + _pEditView->insertGenericTextFrom(lineIndent, comment.c_str()); + } + } + // after uncommenting selection may promote itself to the lines + // before the first initially selected line; + // another problem - if only comment symbol was selected; + if (selectionStart < firstSelLineStart) + { + if (selectionStart >= selectionEnd - (comment_length - 1)) + selectionEnd = firstSelLineStart; + selectionStart = firstSelLineStart; + } + if (move_caret) + { + // moving caret to the beginning of selected block + _pEditView->execute(SCI_GOTOPOS, selectionEnd); + _pEditView->execute(SCI_SETCURRENTPOS, selectionStart); + } + else + { + _pEditView->execute(SCI_SETSEL, selectionStart, selectionEnd); + } + _pEditView->execute(SCI_ENDUNDOACTION); + return true; +} + +bool Notepad_plus::doStreamComment() +{ + const TCHAR *commentStart; + const TCHAR *commentEnd; + + generic_string symbolStart; + generic_string symbolEnd; + + Buffer * buf = _pEditView->getCurrentBuffer(); + if (buf->getLangType() == L_USER) + { + UserLangContainer * userLangContainer = NppParameters::getInstance()->getULCFromName(buf->getUserDefineLangName()); + + if (!userLangContainer) + return false; + + symbolStart = extractSymbol('1', userLangContainer->_keywordLists[4]); + commentStart = symbolStart.c_str(); + symbolEnd = extractSymbol('2', userLangContainer->_keywordLists[4]); + commentEnd = symbolEnd.c_str(); + } + else + { + commentStart = buf->getCommentStart(); + commentEnd = buf->getCommentEnd(); + } + + if ((!commentStart) || (!commentStart[0])) + return false; + if ((!commentEnd) || (!commentEnd[0])) + return false; + + generic_string start_comment(commentStart); + generic_string end_comment(commentEnd); + generic_string white_space(TEXT(" ")); + + start_comment += white_space; + white_space += end_comment; + end_comment = white_space; + size_t start_comment_length = start_comment.length(); + size_t selectionStart = _pEditView->execute(SCI_GETSELECTIONSTART); + size_t selectionEnd = _pEditView->execute(SCI_GETSELECTIONEND); + size_t caretPosition = _pEditView->execute(SCI_GETCURRENTPOS); + // checking if caret is located in _beginning_ of selected block + bool move_caret = caretPosition < selectionEnd; + // if there is no selection? + if (selectionEnd - selectionStart <= 0) + { + int selLine = _pEditView->execute(SCI_LINEFROMPOSITION, selectionStart); + int lineIndent = _pEditView->execute(SCI_GETLINEINDENTPOSITION, selLine); + int lineEnd = _pEditView->execute(SCI_GETLINEENDPOSITION, selLine); + + TCHAR linebuf[1000]; + _pEditView->getGenericText(linebuf, lineIndent, lineEnd); + + int caret = _pEditView->execute(SCI_GETCURRENTPOS); + int line = _pEditView->execute(SCI_LINEFROMPOSITION, caret); + int lineStart = _pEditView->execute(SCI_POSITIONFROMLINE, line); + int current = caret - lineStart; + // checking if we are not inside a word + + int startword = current; + int endword = current; + int start_counter = 0; + int end_counter = 0; + while (startword > 0)// && wordCharacters.contains(linebuf[startword - 1])) + { + start_counter++; + startword--; + } + // checking _beginning_ of the word + if (startword == current) + return true; // caret is located _before_ a word + while (linebuf[endword + 1] != '\0') // && wordCharacters.contains(linebuf[endword + 1])) + { + end_counter++; + endword++; + } + selectionStart -= start_counter; + selectionEnd += (end_counter + 1); + } + _pEditView->execute(SCI_BEGINUNDOACTION); + _pEditView->insertGenericTextFrom(selectionStart, start_comment.c_str()); + selectionEnd += start_comment_length; + selectionStart += start_comment_length; + _pEditView->insertGenericTextFrom(selectionEnd, end_comment.c_str()); + if (move_caret) + { + // moving caret to the beginning of selected block + _pEditView->execute(SCI_GOTOPOS, selectionEnd); + _pEditView->execute(SCI_SETCURRENTPOS, selectionStart); + } + else + { + _pEditView->execute(SCI_SETSEL, selectionStart, selectionEnd); + } + _pEditView->execute(SCI_ENDUNDOACTION); + return true; +} + +bool Notepad_plus::saveScintillaParams(bool whichOne) +{ + ScintillaViewParams svp; + ScintillaEditView *pView = (whichOne == SCIV_PRIMARY)?&_mainEditView:&_subEditView; + + svp._lineNumberMarginShow = pView->hasMarginShowed(ScintillaEditView::_SC_MARGE_LINENUMBER); + svp._bookMarkMarginShow = pView->hasMarginShowed(ScintillaEditView::_SC_MARGE_SYBOLE); + //svp._docChangeStateMarginShow = pView->hasMarginShowed(ScintillaEditView::_SC_MARGE_MODIFMARKER); + svp._indentGuideLineShow = pView->isShownIndentGuide(); + svp._folderStyle = pView->getFolderStyle(); + svp._currentLineHilitingShow = pView->isCurrentLineHiLiting(); + svp._wrapSymbolShow = pView->isWrapSymbolVisible(); + svp._doWrap = pView->isWrap(); + svp._edgeMode = int(pView->execute(SCI_GETEDGEMODE)); + svp._edgeNbColumn = int(pView->execute(SCI_GETEDGECOLUMN)); + svp._zoom = int(pView->execute(SCI_GETZOOM)); + svp._whiteSpaceShow = pView->isInvisibleCharsShown(); + svp._eolShow = pView->isEolVisible(); + + return (NppParameters::getInstance())->writeScintillaParams(svp, whichOne); +} + +bool Notepad_plus::addCurrentMacro() +{ + vector & theMacros = (NppParameters::getInstance())->getMacroList(); + + int nbMacro = theMacros.size(); + + int cmdID = ID_MACRO + nbMacro; + MacroShortcut ms(Shortcut(), _macro, cmdID); + ms.init(_hInst, _hSelf); + + if (ms.doDialog() != -1) + { + HMENU hMacroMenu = ::GetSubMenu(_mainMenuHandle, MENUINDEX_MACRO); + int const posBase = 6; //separator at index 5 + if (nbMacro == 0) + { + ::InsertMenu(hMacroMenu, posBase-1, MF_BYPOSITION, (unsigned int)-1, 0); //no separator yet, add one + } + + theMacros.push_back(ms); + ::InsertMenu(hMacroMenu, posBase + nbMacro, MF_BYPOSITION, cmdID, ms.toMenuItemString().c_str()); + _accelerator.updateShortcuts(); + return true; + } + return false; +} + +void Notepad_plus::changeToolBarIcons() +{ + if (!_toolIcons) + return; + for (int i = 0 ; i < int(_customIconVect.size()) ; i++) + _toolBar.changeIcons(_customIconVect[i].listIndex, _customIconVect[i].iconIndex, (_customIconVect[i].iconLocation).c_str()); +} + +bool Notepad_plus::switchToFile(BufferID id) +{ + int i = 0; + int iView = currentView(); + if (id == BUFFER_INVALID) + return false; + + if ((i = _pDocTab->getIndexByBuffer(id)) != -1) + { + iView = currentView(); + } + else if ((i = _pNonDocTab->getIndexByBuffer(id)) != -1) + { + iView = otherView(); + } + + if (i != -1) + { + switchEditViewTo(iView); + //_pDocTab->activateAt(i); + activateBuffer(id, currentView()); + return true; + } + return false; +} + +ToolBarButtonUnit toolBarIcons[] = { + {IDM_FILE_NEW, IDI_NEW_OFF_ICON, IDI_NEW_ON_ICON, IDI_NEW_OFF_ICON, IDR_FILENEW}, + {IDM_FILE_OPEN, IDI_OPEN_OFF_ICON, IDI_OPEN_ON_ICON, IDI_NEW_OFF_ICON, IDR_FILEOPEN}, + {IDM_FILE_SAVE, IDI_SAVE_OFF_ICON, IDI_SAVE_ON_ICON, IDI_SAVE_DISABLE_ICON, IDR_FILESAVE}, + {IDM_FILE_SAVEALL, IDI_SAVEALL_OFF_ICON, IDI_SAVEALL_ON_ICON, IDI_SAVEALL_DISABLE_ICON, IDR_SAVEALL}, + {IDM_FILE_CLOSE, IDI_CLOSE_OFF_ICON, IDI_CLOSE_ON_ICON, IDI_CLOSE_OFF_ICON, IDR_CLOSEFILE}, + {IDM_FILE_CLOSEALL, IDI_CLOSEALL_OFF_ICON, IDI_CLOSEALL_ON_ICON, IDI_CLOSEALL_OFF_ICON, IDR_CLOSEALL}, + {IDM_FILE_PRINTNOW, IDI_PRINT_OFF_ICON, IDI_PRINT_ON_ICON, IDI_PRINT_OFF_ICON, IDR_PRINT}, + + //-------------------------------------------------------------------------------------// + {0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON}, + //-------------------------------------------------------------------------------------// + + {IDM_EDIT_CUT, IDI_CUT_OFF_ICON, IDI_CUT_ON_ICON, IDI_CUT_DISABLE_ICON, IDR_CUT}, + {IDM_EDIT_COPY, IDI_COPY_OFF_ICON, IDI_COPY_ON_ICON, IDI_COPY_DISABLE_ICON, IDR_COPY}, + {IDM_EDIT_PASTE, IDI_PASTE_OFF_ICON, IDI_PASTE_ON_ICON, IDI_PASTE_DISABLE_ICON, IDR_PASTE}, + + //-------------------------------------------------------------------------------------// + {0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON}, + //-------------------------------------------------------------------------------------// + + {IDM_EDIT_UNDO, IDI_UNDO_OFF_ICON, IDI_UNDO_ON_ICON, IDI_UNDO_DISABLE_ICON, IDR_UNDO}, + {IDM_EDIT_REDO, IDI_REDO_OFF_ICON, IDI_REDO_ON_ICON, IDI_REDO_DISABLE_ICON, IDR_REDO}, + //-------------------------------------------------------------------------------------// + {0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON}, + //-------------------------------------------------------------------------------------// + + {IDM_SEARCH_FIND, IDI_FIND_OFF_ICON, IDI_FIND_ON_ICON, IDI_FIND_OFF_ICON, IDR_FIND}, + {IDM_SEARCH_REPLACE, IDI_REPLACE_OFF_ICON, IDI_REPLACE_ON_ICON, IDI_REPLACE_OFF_ICON, IDR_REPLACE}, + + //-------------------------------------------------------------------------------------// + {0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON}, + //-------------------------------------------------------------------------------------// + {IDM_VIEW_ZOOMIN, IDI_ZOOMIN_OFF_ICON, IDI_ZOOMIN_ON_ICON, IDI_ZOOMIN_OFF_ICON, IDR_ZOOMIN}, + {IDM_VIEW_ZOOMOUT, IDI_ZOOMOUT_OFF_ICON, IDI_ZOOMOUT_ON_ICON, IDI_ZOOMOUT_OFF_ICON, IDR_ZOOMOUT}, + + //-------------------------------------------------------------------------------------// + {0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON}, + //-------------------------------------------------------------------------------------// + {IDM_VIEW_SYNSCROLLV, IDI_SYNCV_OFF_ICON, IDI_SYNCV_ON_ICON, IDI_SYNCV_DISABLE_ICON, IDR_SYNCV}, + {IDM_VIEW_SYNSCROLLH, IDI_SYNCH_OFF_ICON, IDI_SYNCH_ON_ICON, IDI_SYNCH_DISABLE_ICON, IDR_SYNCH}, + + //-------------------------------------------------------------------------------------// + {0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON}, + //-------------------------------------------------------------------------------------// + {IDM_VIEW_WRAP, IDI_VIEW_WRAP_OFF_ICON, IDI_VIEW_WRAP_ON_ICON, IDI_VIEW_WRAP_OFF_ICON, IDR_WRAP}, + {IDM_VIEW_ALL_CHARACTERS, IDI_VIEW_ALL_CHAR_OFF_ICON, IDI_VIEW_ALL_CHAR_ON_ICON, IDI_VIEW_ALL_CHAR_OFF_ICON, IDR_INVISIBLECHAR}, + {IDM_VIEW_INDENT_GUIDE, IDI_VIEW_INDENT_OFF_ICON, IDI_VIEW_INDENT_ON_ICON, IDI_VIEW_INDENT_OFF_ICON, IDR_INDENTGUIDE}, + {IDM_VIEW_USER_DLG, IDI_VIEW_UD_DLG_OFF_ICON, IDI_VIEW_UD_DLG_ON_ICON, IDI_VIEW_UD_DLG_OFF_ICON, IDR_SHOWPANNEL}, + + //-------------------------------------------------------------------------------------// + {0, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON, IDI_SEPARATOR_ICON}, + //-------------------------------------------------------------------------------------// + + {IDM_MACRO_STARTRECORDINGMACRO, IDI_STARTRECORD_OFF_ICON, IDI_STARTRECORD_ON_ICON, IDI_STARTRECORD_DISABLE_ICON, IDR_STARTRECORD}, + {IDM_MACRO_STOPRECORDINGMACRO, IDI_STOPRECORD_OFF_ICON, IDI_STOPRECORD_ON_ICON, IDI_STOPRECORD_DISABLE_ICON, IDR_STOPRECORD}, + {IDM_MACRO_PLAYBACKRECORDEDMACRO, IDI_PLAYRECORD_OFF_ICON, IDI_PLAYRECORD_ON_ICON, IDI_PLAYRECORD_DISABLE_ICON, IDR_PLAYRECORD}, + {IDM_MACRO_RUNMULTIMACRODLG, IDI_MMPLAY_OFF_ICON, IDI_MMPLAY_ON_ICON, IDI_MMPLAY_DIS_ICON, IDR_M_PLAYRECORD}, + {IDM_MACRO_SAVECURRENTMACRO, IDI_SAVERECORD_OFF_ICON, IDI_SAVERECORD_ON_ICON, IDI_SAVERECORD_DISABLE_ICON, IDR_SAVERECORD} + +}; + +void Notepad_plus::getTaskListInfo(TaskListInfo *tli) +{ + size_t currentNbDoc = _pDocTab->nbItem(); + size_t nonCurrentNbDoc = _pNonDocTab->nbItem(); + + tli->_currentIndex = 0; + + if (!viewVisible(otherView())) + nonCurrentNbDoc = 0; + + for (size_t i = 0 ; i < currentNbDoc ; i++) + { + BufferID bufID = _pDocTab->getBufferByIndex(i); + Buffer * b = MainFileManager->getBufferByID(bufID); + int status = b->isReadOnly()?tb_ro:(b->isDirty()?tb_unsaved:tb_saved); + tli->_tlfsLst.push_back(TaskLstFnStatus(currentView(), i, b->getFullPathName(), status)); + } + for (size_t i = 0 ; i < nonCurrentNbDoc ; i++) + { + BufferID bufID = _pNonDocTab->getBufferByIndex(i); + Buffer * b = MainFileManager->getBufferByID(bufID); + int status = b->isReadOnly()?tb_ro:(b->isDirty()?tb_unsaved:tb_saved); + tli->_tlfsLst.push_back(TaskLstFnStatus(otherView(), i, b->getFullPathName(), status)); + } +} + +LRESULT Notepad_plus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + LRESULT result = FALSE; + + NppParameters *pNppParam = NppParameters::getInstance(); + switch (Message) + { + case WM_NCACTIVATE: + { + // Note: lParam is -1 to prevent endless loops of calls + ::SendMessage(_dockingManager.getHSelf(), WM_NCACTIVATE, wParam, (LPARAM)-1); + return ::DefWindowProc(hwnd, Message, wParam, lParam); + } + case WM_CREATE: + { + NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); + + // Menu + _mainMenuHandle = ::GetMenu(_hSelf); + int langPos2BeRemoved = MENUINDEX_LANGUAGE+1; + if (nppGUI._isLangMenuCompact) + langPos2BeRemoved = MENUINDEX_LANGUAGE; + ::RemoveMenu(_mainMenuHandle, langPos2BeRemoved, MF_BYPOSITION); + + //Views + _pDocTab = &_mainDocTab; + _pEditView = &_mainEditView; + _pNonDocTab = &_subDocTab; + _pNonEditView = &_subEditView; + + _mainEditView.init(_hInst, hwnd); + _subEditView.init(_hInst, hwnd); + + _fileEditView.init(_hInst, hwnd); + MainFileManager->init(this, &_fileEditView); //get it up and running asap. + + pNppParam->setFontList(hwnd); + + + _mainWindowStatus = WindowMainActive; + _activeView = MAIN_VIEW; + + const ScintillaViewParams & svp1 = pNppParam->getSVP(SCIV_PRIMARY); + const ScintillaViewParams & svp2 = pNppParam->getSVP(SCIV_SECOND); + + int tabBarStatus = nppGUI._tabStatus; + _toReduceTabBar = ((tabBarStatus & TAB_REDUCE) != 0); + _docTabIconList.create(_toReduceTabBar?13:20, _hInst, docTabIconIDs, sizeof(docTabIconIDs)/sizeof(int)); + + _mainDocTab.init(_hInst, hwnd, &_mainEditView, &_docTabIconList); + _subDocTab.init(_hInst, hwnd, &_subEditView, &_docTabIconList); + + _mainEditView.display(); + + _invisibleEditView.init(_hInst, hwnd); + _invisibleEditView.execute(SCI_SETUNDOCOLLECTION); + _invisibleEditView.execute(SCI_EMPTYUNDOBUFFER); + + // Configuration of 2 scintilla views + _mainEditView.showMargin(ScintillaEditView::_SC_MARGE_LINENUMBER, svp1._lineNumberMarginShow); + _subEditView.showMargin(ScintillaEditView::_SC_MARGE_LINENUMBER, svp2._lineNumberMarginShow); + _mainEditView.showMargin(ScintillaEditView::_SC_MARGE_SYBOLE, svp1._bookMarkMarginShow); + _subEditView.showMargin(ScintillaEditView::_SC_MARGE_SYBOLE, svp2._bookMarkMarginShow); + //_mainEditView.showMargin(ScintillaEditView::_SC_MARGE_MODIFMARKER, svp1._docChangeStateMarginShow); + //_subEditView.showMargin(ScintillaEditView::_SC_MARGE_MODIFMARKER, svp2._docChangeStateMarginShow); + + _mainEditView.showIndentGuideLine(svp1._indentGuideLineShow); + _subEditView.showIndentGuideLine(svp2._indentGuideLineShow); + + ::SendMessage(hwnd, NPPM_INTERNAL_SETCARETWIDTH, 0, 0); + ::SendMessage(hwnd, NPPM_INTERNAL_SETCARETBLINKRATE, 0, 0); + + _configStyleDlg.init(_hInst, _hSelf); + _preference.init(_hInst, _hSelf); + + //Marker Margin config + _mainEditView.setMakerStyle(svp1._folderStyle); + _subEditView.setMakerStyle(svp2._folderStyle); + + _mainEditView.execute(SCI_SETCARETLINEVISIBLE, svp1._currentLineHilitingShow); + _subEditView.execute(SCI_SETCARETLINEVISIBLE, svp2._currentLineHilitingShow); + + _mainEditView.execute(SCI_SETCARETLINEVISIBLEALWAYS, true); + _subEditView.execute(SCI_SETCARETLINEVISIBLEALWAYS, true); + + _mainEditView.wrap(svp1._doWrap); + _subEditView.wrap(svp2._doWrap); + + _mainEditView.execute(SCI_SETEDGECOLUMN, svp1._edgeNbColumn); + _mainEditView.execute(SCI_SETEDGEMODE, svp1._edgeMode); + _subEditView.execute(SCI_SETEDGECOLUMN, svp2._edgeNbColumn); + _subEditView.execute(SCI_SETEDGEMODE, svp2._edgeMode); + + _mainEditView.showEOL(svp1._eolShow); + _subEditView.showEOL(svp2._eolShow); + + _mainEditView.showWSAndTab(svp1._whiteSpaceShow); + _subEditView.showWSAndTab(svp2._whiteSpaceShow); + + _mainEditView.showWrapSymbol(svp1._wrapSymbolShow); + _subEditView.showWrapSymbol(svp2._wrapSymbolShow); + + _mainEditView.performGlobalStyles(); + _subEditView.performGlobalStyles(); + + _zoomOriginalValue = _pEditView->execute(SCI_GETZOOM); + _mainEditView.execute(SCI_SETZOOM, svp1._zoom); + _subEditView.execute(SCI_SETZOOM, svp2._zoom); + + TabBarPlus::doDragNDrop(true); + + if (_toReduceTabBar) + { + HFONT hf = (HFONT)::GetStockObject(DEFAULT_GUI_FONT); + + if (hf) + { + ::SendMessage(_mainDocTab.getHSelf(), WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE, 0)); + ::SendMessage(_subDocTab.getHSelf(), WM_SETFONT, (WPARAM)hf, MAKELPARAM(TRUE, 0)); + } + TabCtrl_SetItemSize(_mainDocTab.getHSelf(), 45, 20); + TabCtrl_SetItemSize(_subDocTab.getHSelf(), 45, 20); + } + _mainDocTab.display(); + + + TabBarPlus::doDragNDrop((tabBarStatus & TAB_DRAGNDROP) != 0); + TabBarPlus::setDrawTopBar((tabBarStatus & TAB_DRAWTOPBAR) != 0); + TabBarPlus::setDrawInactiveTab((tabBarStatus & TAB_DRAWINACTIVETAB) != 0); + TabBarPlus::setDrawTabCloseButton((tabBarStatus & TAB_CLOSEBUTTON) != 0); + TabBarPlus::setDbClk2Close((tabBarStatus & TAB_DBCLK2CLOSE) != 0); + TabBarPlus::setVertical((tabBarStatus & TAB_VERTICAL) != 0); + drawTabbarColoursFromStylerArray(); + + //--Splitter Section--// + bool isVertical = (nppGUI._splitterPos == POS_VERTICAL); + + _subSplitter.init(_hInst, _hSelf); + _subSplitter.create(&_mainDocTab, &_subDocTab, 8, DYNAMIC, 50, isVertical); + + //--Status Bar Section--// + bool willBeShown = nppGUI._statusBarShow; + _statusBar.init(_hInst, hwnd, 6); + _statusBar.setPartWidth(STATUSBAR_DOC_SIZE, 180); + _statusBar.setPartWidth(STATUSBAR_CUR_POS, 250); + _statusBar.setPartWidth(STATUSBAR_EOF_FORMAT, 80); + _statusBar.setPartWidth(STATUSBAR_UNICODE_TYPE, 100); + _statusBar.setPartWidth(STATUSBAR_TYPING_MODE, 30); + _statusBar.display(willBeShown); + + _pMainWindow = &_mainDocTab; + + _dockingManager.init(_hInst, hwnd, &_pMainWindow); + + if (nppGUI._isMinimizedToTray) + _pTrayIco = new trayIconControler(_hSelf, IDI_M30ICON, IDC_MINIMIZED_TRAY, ::LoadIcon(_hInst, MAKEINTRESOURCE(IDI_M30ICON)), TEXT("")); + + checkSyncState(); + + // Plugin Manager + NppData nppData; + nppData._nppHandle = _hSelf; + nppData._scintillaMainHandle = _mainEditView.getHSelf(); + nppData._scintillaSecondHandle = _subEditView.getHSelf(); + + _scintillaCtrls4Plugins.init(_hInst, hwnd); + _pluginsManager.init(nppData); + _pluginsManager.loadPlugins(); + const TCHAR *appDataNpp = pNppParam->getAppDataNppDir(); + if (appDataNpp[0]) + _pluginsManager.loadPlugins(appDataNpp); + + // ------------ // + // Menu Section // + // ------------ // + + // Macro Menu + std::vector & macros = pNppParam->getMacroList(); + HMENU hMacroMenu = ::GetSubMenu(_mainMenuHandle, MENUINDEX_MACRO); + size_t const posBase = 6; + size_t nbMacro = macros.size(); + if (nbMacro >= 1) + ::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()); + } + // Run Menu + std::vector & userCommands = pNppParam->getUserCommandList(); + HMENU hRunMenu = ::GetSubMenu(_mainMenuHandle, MENUINDEX_RUN); + int const runPosBase = 2; + size_t nbUserCommand = userCommands.size(); + if (nbUserCommand >= 1) + ::InsertMenu(hRunMenu, runPosBase - 1, MF_BYPOSITION, (unsigned int)-1, 0); + for (size_t i = 0 ; i < nbUserCommand ; i++) + { + ::InsertMenu(hRunMenu, runPosBase + i, MF_BYPOSITION, ID_USER_CMD + i, userCommands[i].toMenuItemString().c_str()); + } + + // Updater menu item + if (!nppGUI._doesExistUpdater) + { + //::MessageBox(NULL, TEXT("pas de updater"), TEXT(""), MB_OK); + ::DeleteMenu(_mainMenuHandle, IDM_UPDATE_NPP, MF_BYCOMMAND); + ::DrawMenuBar(hwnd); + } + //Languages Menu + HMENU hLangMenu = ::GetSubMenu(_mainMenuHandle, MENUINDEX_LANGUAGE); + + // Add external languages to menu + for (int i = 0 ; i < pNppParam->getNbExternalLang() ; i++) + { + ExternalLangContainer & externalLangContainer = pNppParam->getELCFromIndex(i); + + int numLangs = ::GetMenuItemCount(hLangMenu); + const int bufferSize = 100; + TCHAR buffer[bufferSize]; + + int x; + for(x = 0; (x == 0 || lstrcmp(externalLangContainer._name, buffer) > 0) && x < numLangs; x++) + { + ::GetMenuString(hLangMenu, x, buffer, bufferSize, MF_BYPOSITION); + } + + ::InsertMenu(hLangMenu, x-1, MF_BYPOSITION, IDM_LANG_EXTERNAL + i, externalLangContainer._name); + } + + if (nppGUI._excludedLangList.size() > 0) + { + for (size_t i = 0 ; i < nppGUI._excludedLangList.size() ; i++) + { + int cmdID = pNppParam->langTypeToCommandID(nppGUI._excludedLangList[i]._langType); + const int itemSize = 256; + TCHAR itemName[itemSize]; + ::GetMenuString(hLangMenu, cmdID, itemName, itemSize, MF_BYCOMMAND); + nppGUI._excludedLangList[i]._cmdID = cmdID; + nppGUI._excludedLangList[i]._langName = itemName; + ::DeleteMenu(hLangMenu, cmdID, MF_BYCOMMAND); + DrawMenuBar(_hSelf); + } + } + + // Add User Define Languages Entry + int udlpos = ::GetMenuItemCount(hLangMenu) - 1; + + for (int i = 0 ; i < pNppParam->getNbUserLang() ; i++) + { + UserLangContainer & userLangContainer = pNppParam->getULCFromIndex(i); + ::InsertMenu(hLangMenu, udlpos + i, MF_BYPOSITION, IDM_LANG_USER + i + 1, userLangContainer.getName()); + } + + //Add recent files + HMENU hFileMenu = ::GetSubMenu(_mainMenuHandle, MENUINDEX_FILE); + int nbLRFile = pNppParam->getNbLRFile(); + int pos = IDM_FILEMENU_LASTONE - IDM_FILE + 2; + + _lastRecentFileList.initMenu(hFileMenu, IDM_FILEMENU_LASTONE + 1, pos); + for (int i = 0 ; i < nbLRFile ; i++) + { + generic_string * stdStr = pNppParam->getLRFile(i); + if (nppGUI._checkHistoryFiles) + { + if (PathFileExists(stdStr->c_str())) + { + _lastRecentFileList.add(stdStr->c_str()); + } + } + else + { + _lastRecentFileList.add(stdStr->c_str()); + } + } + + //Plugin menu + _pluginsManager.setMenu(_mainMenuHandle, NULL); + + //Main menu is loaded, now load context menu items + pNppParam->getContextMenuFromXmlTree(_mainMenuHandle); + + if (pNppParam->hasCustomContextMenu()) + { + _mainEditView.execute(SCI_USEPOPUP, FALSE); + _subEditView.execute(SCI_USEPOPUP, FALSE); + } + + generic_string pluginsTrans, windowTrans; + changeMenuLang(pluginsTrans, windowTrans); + + if (_pluginsManager.hasPlugins() && pluginsTrans != TEXT("")) + { + ::ModifyMenu(_mainMenuHandle, MENUINDEX_PLUGINS, MF_BYPOSITION, 0, pluginsTrans.c_str()); + } + //Windows menu + _windowsMenu.init(_hInst, _mainMenuHandle, windowTrans.c_str()); + + // Update context menu strings + vector & tmp = pNppParam->getContextMenuItems(); + size_t len = tmp.size(); + TCHAR menuName[64]; + for (size_t i = 0 ; i < len ; i++) + { + if (tmp[i]._itemName == TEXT("")) + { + ::GetMenuString(_mainMenuHandle, tmp[i]._cmdID, menuName, 64, MF_BYCOMMAND); + tmp[i]._itemName = purgeMenuItemString(menuName); + } + } + + //Input all the menu item names into shortcut list + //This will automatically do all translations, since menu translation has been done already + vector & shortcuts = pNppParam->getUserShortcuts(); + len = shortcuts.size(); + + for(size_t i = 0; i < len; i++) + { + CommandShortcut & csc = shortcuts[i]; + if (!csc.getName()[0]) + { //no predefined name, get name from menu and use that + ::GetMenuString(_mainMenuHandle, csc.getID(), menuName, 64, MF_BYCOMMAND); + csc.setName(purgeMenuItemString(menuName, true).c_str()); + } + } + //Translate non-menu shortcuts + changeShortcutLang(); + + //Update plugin shortcuts, all plugin commands should be available now + pNppParam->reloadPluginCmds(); + + // Shortcut Accelerator : should be the last one since it will capture all the shortcuts + _accelerator.init(_mainMenuHandle, _hSelf); + pNppParam->setAccelerator(&_accelerator); + + // Scintilla key accelerator + vector scints; + scints.push_back(_mainEditView.getHSelf()); + scints.push_back(_subEditView.getHSelf()); + _scintaccelerator.init(&scints, _mainMenuHandle, _hSelf); + + pNppParam->setScintillaAccelerator(&_scintaccelerator); + _scintaccelerator.updateKeys(); + + ::DrawMenuBar(_hSelf); + + + //-- Tool Bar Section --// + toolBarStatusType tbStatus = nppGUI._toolBarStatus; + willBeShown = nppGUI._toolbarShow; + + // To notify plugins that toolbar icons can be registered + SCNotification scnN; + scnN.nmhdr.code = NPPN_TBMODIFICATION; + scnN.nmhdr.hwndFrom = _hSelf; + scnN.nmhdr.idFrom = 0; + _pluginsManager.notify(&scnN); + + _toolBar.init(_hInst, hwnd, tbStatus, toolBarIcons, sizeof(toolBarIcons)/sizeof(ToolBarButtonUnit)); + + changeToolBarIcons(); + + _rebarTop.init(_hInst, hwnd); + _rebarBottom.init(_hInst, hwnd); + _toolBar.addToRebar(&_rebarTop); + _rebarTop.setIDVisible(REBAR_BAR_TOOLBAR, willBeShown); + + //--Init dialogs--// + _findReplaceDlg.init(_hInst, hwnd, &_pEditView); + _incrementFindDlg.init(_hInst, hwnd, &_findReplaceDlg, _isRTL); + _incrementFindDlg.addToRebar(&_rebarBottom); + _goToLineDlg.init(_hInst, hwnd, &_pEditView); + _colEditorDlg.init(_hInst, hwnd, &_pEditView); + _aboutDlg.init(_hInst, hwnd); + _runDlg.init(_hInst, hwnd); + _runMacroDlg.init(_hInst, hwnd); + + //--User Define Dialog Section--// + int uddStatus = nppGUI._userDefineDlgStatus; + UserDefineDialog *udd = _pEditView->getUserDefineDlg(); + + bool uddShow = false; + switch (uddStatus) + { + case UDD_SHOW : // show & undocked + udd->doDialog(true, _isRTL); + changeUserDefineLang(); + uddShow = true; + break; + case UDD_DOCKED : { // hide & docked + _isUDDocked = true; + break;} + case (UDD_SHOW | UDD_DOCKED) : // show & docked + udd->doDialog(true, _isRTL); + changeUserDefineLang(); + ::SendMessage(udd->getHSelf(), WM_COMMAND, IDC_DOCK_BUTTON, 0); + uddShow = true; + break; + + default : // hide & undocked + break; + } + // UserDefine Dialog + + checkMenuItem(IDM_VIEW_USER_DLG, uddShow); + _toolBar.setCheck(IDM_VIEW_USER_DLG, uddShow); + + //launch the plugin dlg memorized at the last session + DockingManagerData &dmd = nppGUI._dockingData; + + _dockingManager.setDockedContSize(CONT_LEFT , nppGUI._dockingData._leftWidth); + _dockingManager.setDockedContSize(CONT_RIGHT , nppGUI._dockingData._rightWidth); + _dockingManager.setDockedContSize(CONT_TOP , nppGUI._dockingData._topHeight); + _dockingManager.setDockedContSize(CONT_BOTTOM, nppGUI._dockingData._bottomHight); + + for (size_t i = 0 ; i < dmd._pluginDockInfo.size() ; i++) + { + PlugingDlgDockingInfo & pdi = dmd._pluginDockInfo[i]; + + if (pdi._isVisible) + _pluginsManager.runPluginCommand(pdi._name, pdi._internalID); + } + + for (size_t i = 0 ; i < dmd._containerTabInfo.size() ; i++) + { + 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); + activateBuffer(_mainEditView.getCurrentBufferID(), MAIN_VIEW); + activateBuffer(_subEditView.getCurrentBufferID(), SUB_VIEW); + MainFileManager->increaseDocNr(); //so next doc starts at 2 + + ::SetFocus(_mainEditView.getHSelf()); + result = TRUE; + } + break; + + case WM_DRAWITEM : + { + DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *)lParam; + if (dis->CtlType == ODT_TAB) + { + return ::SendMessage(dis->hwndItem, WM_DRAWITEM, wParam, lParam); + } + } + + case WM_DOCK_USERDEFINE_DLG: + { + dockUserDlg(); + return TRUE; + } + + case WM_UNDOCK_USERDEFINE_DLG: + { + undockUserDlg(); + return TRUE; + } + + case WM_REMOVE_USERLANG: + { + TCHAR name[256]; + lstrcpy(name, (TCHAR *)lParam); + //loop through buffers and reset the language (L_USER, TEXT("")) if (L_USER, name) + Buffer * buf; + for(int i = 0; i < MainFileManager->getNrBuffers(); i++) { + buf = MainFileManager->getBufferByIndex(i); + if (buf->getLangType() == L_USER && !lstrcmp(buf->getUserDefineLangName(), name)) + buf->setLangType(L_USER, TEXT("")); + } + return TRUE; + } + + case WM_RENAME_USERLANG: + { + TCHAR oldName[256]; + TCHAR newName[256]; + lstrcpy(oldName, (TCHAR *)lParam); + lstrcpy(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++) { + buf = MainFileManager->getBufferByIndex(i); + if (buf->getLangType() == L_USER && !lstrcmp(buf->getUserDefineLangName(), oldName)) + buf->setLangType(L_USER, newName); + } + return TRUE; + } + + case WM_CLOSE_USERDEFINE_DLG : + { + checkMenuItem(IDM_VIEW_USER_DLG, false); + _toolBar.setCheck(IDM_VIEW_USER_DLG, false); + return TRUE; + } + + case WM_REPLACEALL_INOPENEDDOC : + { + replaceAllFiles(); + return TRUE; + } + + case WM_FINDALL_INOPENEDDOC : + { + findInOpenedFiles(); + return TRUE; + } + + case WM_FINDALL_INCURRENTDOC : + { + findInCurrentFile(); + return TRUE; + } + + case WM_FINDINFILES : + { + return findInFiles(); + } + + case WM_REPLACEINFILES : + { + replaceInFiles(); + return TRUE; + } + case NPPM_LAUNCHFINDINFILESDLG : + { + const int strSize = FINDREPLACE_MAXLENGTH; + TCHAR str[strSize]; + + bool isFirstTime = !_findReplaceDlg.isCreated(); + _findReplaceDlg.doDialog(FIND_DLG, _isRTL); + + _pEditView->getGenericSelectedText(str, strSize); + _findReplaceDlg.setSearchText(str); + if (isFirstTime) + changeDlgLang(_findReplaceDlg.getHSelf(), "Find"); + _findReplaceDlg.launchFindInFilesDlg(); + setFindReplaceFolderFilter((const TCHAR*) wParam, (const TCHAR*) lParam); + return TRUE; + } + + case NPPM_DOOPEN: + case WM_DOOPEN: + { + BufferID id = doOpen((const TCHAR *)lParam); + if (id != BUFFER_INVALID) + { + return switchToFile(id); + } + } + break; + + case NPPM_INTERNAL_SETFILENAME: + { + if (!lParam && !wParam) + return FALSE; + BufferID id = (BufferID)wParam; + Buffer * b = MainFileManager->getBufferByID(id); + if (b && b->getStatus() == DOC_UNNAMED) { + b->setFileName((const TCHAR*)lParam); + return TRUE; + } + return FALSE; + } + break; + + case NPPM_GETBUFFERLANGTYPE: + { + if (!wParam) + return -1; + BufferID id = (BufferID)wParam; + Buffer * b = MainFileManager->getBufferByID(id); + return b->getLangType(); + } + break; + + case NPPM_SETBUFFERLANGTYPE: + { + if (!wParam) + return FALSE; + if (lParam < L_TXT || lParam >= L_EXTERNAL || lParam == L_USER) + return FALSE; + + BufferID id = (BufferID)wParam; + Buffer * b = MainFileManager->getBufferByID(id); + b->setLangType((LangType)lParam); + return TRUE; + } + break; + + case NPPM_GETBUFFERENCODING: + { + if (!wParam) + return -1; + BufferID id = (BufferID)wParam; + Buffer * b = MainFileManager->getBufferByID(id); + return b->getUnicodeMode(); + } + break; + + case NPPM_SETBUFFERENCODING: + { + if (!wParam) + return FALSE; + if (lParam < uni8Bit || lParam >= uniEnd) + return FALSE; + + BufferID id = (BufferID)wParam; + Buffer * b = MainFileManager->getBufferByID(id); + if (b->getStatus() != DOC_UNNAMED || b->isDirty()) //do not allow to change the encoding if the file has any content + return FALSE; + b->setUnicodeMode((UniMode)lParam); + return TRUE; + } + break; + + case NPPM_GETBUFFERFORMAT: + { + if (!wParam) + return -1; + BufferID id = (BufferID)wParam; + Buffer * b = MainFileManager->getBufferByID(id); + return b->getFormat(); + } + break; + + case NPPM_SETBUFFERFORMAT: + { + if (!wParam) + return FALSE; + if (lParam < WIN_FORMAT || lParam >= UNIX_FORMAT) + return FALSE; + + BufferID id = (BufferID)wParam; + Buffer * b = MainFileManager->getBufferByID(id); + b->setFormat((formatType)lParam); + return TRUE; + } + break; + + case NPPM_GETBUFFERIDFROMPOS: + { + DocTabView * pView = NULL; + if (lParam == MAIN_VIEW) { + pView = &_mainDocTab; + } else if (lParam == SUB_VIEW) { + pView = &_subDocTab; + } else { + return (LRESULT)BUFFER_INVALID; + } + 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: + { + if (!wParam) + 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; + + case NPPM_SWITCHTOFILE : + { + BufferID id = MainFileManager->getBufferFromName((const TCHAR *)lParam); + if (id != BUFFER_INVALID) + return switchToFile(id); + return false; + } + + case NPPM_SAVECURRENTFILE: + { + return fileSave(); + } + break; + + case NPPM_SAVEALLFILES: + { + return fileSaveAll(); + } + break; + + case WM_SIZE: + { + RECT rc; + getClientRect(rc); + 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); + ::SendMessage(_statusBar.getHSelf(), WM_SIZE, wParam, lParam); + + 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); + + result = TRUE; + } + break; + + case WM_MOVE: + { + result = TRUE; + } + break; + + case WM_MOVING: + { + result = FALSE; + } + break; + + case WM_SIZING: + { + result = FALSE; + } + break; + + case WM_COPYDATA : + { + COPYDATASTRUCT *pCopyData = (COPYDATASTRUCT *)lParam; + + switch (pCopyData->dwData) + { + case COPYDATA_PARAMS : + { + pNppParam->setCmdlineParam(*((CmdLineParams *)pCopyData->lpData)); + break; + } + + case COPYDATA_FILENAMESA : + { + char *fileNamesA = (char *)pCopyData->lpData; + CmdLineParams & cmdLineParams = pNppParam->getCmdLineParams(); +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + const wchar_t *fileNamesW = wmc->char2wchar(fileNamesA, CP_ACP); + loadCommandlineParams(fileNamesW, &cmdLineParams); +#else + loadCommandlineParams(fileNamesA, &cmdLineParams); +#endif + break; + } + + case COPYDATA_FILENAMESW : + { + wchar_t *fileNamesW = (wchar_t *)pCopyData->lpData; + CmdLineParams & cmdLineParams = pNppParam->getCmdLineParams(); + +#ifdef UNICODE + loadCommandlineParams(fileNamesW, &cmdLineParams); +#else + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + const char *fileNamesA = wmc->wchar2char(fileNamesW, CP_ACP); + loadCommandlineParams(fileNamesA, &cmdLineParams); +#endif + break; + } + } + + return TRUE; + } + + case WM_COMMAND: + if (HIWORD(wParam) == SCEN_SETFOCUS) + { + HWND hMain = _mainEditView.getHSelf(), hSec = _subEditView.getHSelf(); + HWND hFocus = (HWND)lParam; + if (hMain == hFocus) + switchEditViewTo(MAIN_VIEW); + else if (hSec == hFocus) + switchEditViewTo(SUB_VIEW); + else { + //Other Scintilla, ignore + } + return TRUE; + } + else + { + if ((lParam == 1) || (lParam == 2)) + { + specialCmd(LOWORD(wParam), lParam); + } + else + command(LOWORD(wParam)); + } + return TRUE; + + case NPPM_INTERNAL_RELOADNATIVELANG: + { + reloadLang(); + } + return TRUE; + + case NPPM_INTERNAL_RELOADSTYLERS: + { + loadStyles(); + } + return TRUE; + + case NPPM_INTERNAL_PLUGINSHORTCUTMOTIFIED: + { + SCNotification scnN; + scnN.nmhdr.code = NPPN_SHORTCUTREMAPPED; + scnN.nmhdr.hwndFrom = (void *)lParam; // ShortcutKey structure + scnN.nmhdr.idFrom = (uptr_t)wParam; // cmdID + _pluginsManager.notify(&scnN); + } + return TRUE; + + case NPPM_GETSHORTCUTBYCMDID: + { + int cmdID = wParam; // cmdID + ShortcutKey *sk = (ShortcutKey *)lParam; // ShortcutKey structure + + return _pluginsManager.getShortcutByCmdID(cmdID, sk); + } + + case NPPM_MENUCOMMAND : + command(lParam); + return TRUE; + + case NPPM_GETFULLCURRENTPATH : + case NPPM_GETCURRENTDIRECTORY : + case NPPM_GETFILENAME : + case NPPM_GETNAMEPART : + case NPPM_GETEXTPART : + { + TCHAR str[MAX_PATH]; + // par defaut : NPPM_GETCURRENTDIRECTORY + TCHAR *fileStr = lstrcpy(str, _pEditView->getCurrentBuffer()->getFullPathName()); + + if (Message == NPPM_GETCURRENTDIRECTORY) + PathRemoveFileSpec(str); + else if (Message == NPPM_GETFILENAME) + fileStr = PathFindFileName(str); + else if (Message == NPPM_GETNAMEPART) + { + fileStr = PathFindFileName(str); + PathRemoveExtension(fileStr); + } + else if (Message == NPPM_GETEXTPART) + fileStr = PathFindExtension(str); + + // For the compability reason, if wParam is 0, then we assume the size of generic_string buffer (lParam) is large enough. + // otherwise we check if the generic_string buffer size is enough for the generic_string to copy. + if (wParam != 0) + { + if (lstrlen(fileStr) >= int(wParam)) + { + ::MessageBox(_hSelf, TEXT("Allocated buffer size is not enough to copy the string."), TEXT("NPPM error"), MB_OK); + return FALSE; + } + } + + lstrcpy((TCHAR *)lParam, fileStr); + return TRUE; + } + + case NPPM_GETCURRENTWORD : + { + const int strSize = CURRENTWORD_MAXLENGTH; + TCHAR str[strSize]; + + _pEditView->getGenericSelectedText((TCHAR *)str, strSize); + // For the compability reason, if wParam is 0, then we assume the size of generic_string buffer (lParam) is large enough. + // otherwise we check if the generic_string buffer size is enough for the generic_string to copy. + if (wParam != 0) + { + if (lstrlen(str) >= int(wParam)) //buffer too small + { + ::MessageBox(_hSelf, 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 + { + lstrcpyn((TCHAR *)lParam, str, wParam); + return TRUE; + } + } + + lstrcpy((TCHAR *)lParam, str); + return TRUE; + } + + case NPPM_GETNPPDIRECTORY : + { + const int strSize = MAX_PATH; + TCHAR str[strSize]; + + ::GetModuleFileName(NULL, str, strSize); + PathRemoveFileSpec(str); + + // For the compability reason, if wParam is 0, then we assume the size of generic_string buffer (lParam) is large enough. + // otherwise we check if the generic_string buffer size is enough for the generic_string to copy. + if (wParam != 0) + { + if (lstrlen(str) >= int(wParam)) + { + ::MessageBox(_hSelf, TEXT("Allocated buffer size is not enough to copy the string."), TEXT("NPPM_GETNPPDIRECTORY error"), MB_OK); + return FALSE; + } + } + + lstrcpy((TCHAR *)lParam, str); + return TRUE; + } + + case NPPM_GETCURRENTLINE : + { + return _pEditView->getCurrentLineNumber(); + } + + 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_GETCURRENTLANGTYPE : + { + *((LangType *)lParam) = _pEditView->getCurrentBuffer()->getLangType(); + return TRUE; + } + + case NPPM_SETCURRENTLANGTYPE : + { + _pEditView->getCurrentBuffer()->setLangType((LangType)lParam); + return TRUE; + } + + 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; + else if (lParam == SECOND_VIEW) + return nbDocSecond; + } + + case NPPM_GETOPENFILENAMESPRIMARY : + case NPPM_GETOPENFILENAMESSECOND : + case NPPM_GETOPENFILENAMES : + { + if (!wParam) return 0; + + TCHAR **fileNames = (TCHAR **)wParam; + int nbFileNames = lParam; + + int j = 0; + if (Message != NPPM_GETOPENFILENAMESSECOND) { + for (int i = 0 ; i < _mainDocTab.nbItem() && j < nbFileNames ; i++) + { + BufferID id = _mainDocTab.getBufferByIndex(i); + Buffer * buf = MainFileManager->getBufferByID(id); + lstrcpy(fileNames[j++], buf->getFullPathName()); + } + } + if (Message != NPPM_GETOPENFILENAMESPRIMARY) { + for (int i = 0 ; i < _subDocTab.nbItem() && j < nbFileNames ; i++) + { + BufferID id = _subDocTab.getBufferByIndex(i); + Buffer * buf = MainFileManager->getBufferByID(id); + lstrcpy(fileNames[j++], buf->getFullPathName()); + } + } + return j; + } + + case WM_GETTASKLISTINFO : + { + if (!wParam) return 0; + TaskListInfo * tli = (TaskListInfo *)wParam; + getTaskListInfo(tli); + + if (NppParameters::getInstance()->getNppGUI()._styleMRU) + { + tli->_currentIndex = 0; + std::sort(tli->_tlfsLst.begin(),tli->_tlfsLst.end(),SortTaskListPred(_mainDocTab,_subDocTab)); + } + else + { + for(int idx = 0; idx < (int)tli->_tlfsLst.size(); ++idx) + { + if(tli->_tlfsLst[idx]._iView == currentView() && + tli->_tlfsLst[idx]._docIndex == _pDocTab->getCurrentTabIndex()) + { + tli->_currentIndex = idx; + break; + } + } + } + return TRUE; + } + + case WM_MOUSEWHEEL : + { + if (LOWORD(wParam) & MK_RBUTTON) + { + // redirect to the IDC_PREV_DOC or IDC_NEXT_DOC so that we have the unified process + + pNppParam->_isTaskListRBUTTONUP_Active = true; + short zDelta = (short) HIWORD(wParam); + return ::SendMessage(_hSelf, WM_COMMAND, zDelta>0?IDC_PREV_DOC:IDC_NEXT_DOC, 0); + } + return TRUE; + } + + case WM_APPCOMMAND : + { + switch(GET_APPCOMMAND_LPARAM(lParam)) + { + 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; + } + return ::DefWindowProc(hwnd, Message, wParam, lParam); + } + + case NPPM_GETNBSESSIONFILES : + { + const TCHAR *sessionFileName = (const TCHAR *)lParam; + if ((!sessionFileName) || (sessionFileName[0] == '\0')) return 0; + Session session2Load; + if (pNppParam->loadSession(session2Load, sessionFileName)) + { + return session2Load.nbMainFiles() + session2Load.nbSubFiles(); + } + return 0; + } + + case NPPM_GETSESSIONFILES : + { + const TCHAR *sessionFileName = (const TCHAR *)lParam; + TCHAR **sessionFileArray = (TCHAR **)wParam; + + if ((!sessionFileName) || (sessionFileName[0] == '\0')) return FALSE; + + Session session2Load; + if (pNppParam->loadSession(session2Load, sessionFileName)) + { + size_t i = 0; + for ( ; i < session2Load.nbMainFiles() ; ) + { + const TCHAR *pFn = session2Load._mainViewFiles[i]._fileName.c_str(); + lstrcpy(sessionFileArray[i++], pFn); + } + + for (size_t j = 0 ; j < session2Load.nbSubFiles() ; j++) + { + const TCHAR *pFn = session2Load._subViewFiles[j]._fileName.c_str(); + lstrcpy(sessionFileArray[i++], pFn); + } + return TRUE; + } + return FALSE; + } + + 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]; + pSci->execute(SCI_GETTEXT, length, (LPARAM)buffer); + + // convert here + UniMode unicodeMode = pSci->getCurrentBuffer()->getUnicodeMode(); + UnicodeConvertor.setEncoding(unicodeMode); + length = UnicodeConvertor.convert(buffer, length-1); + + // set text in target + pSci->execute(SCI_CLEARALL); + pSci->addText(length, UnicodeConvertor.getNewBuf()); + pSci->execute(SCI_EMPTYUNDOBUFFER); + + pSci->execute(SCI_SETCODEPAGE); + + // set cursor position + pSci->execute(SCI_GOTOPOS); + + // clean buffer + delete [] buffer; + + return unicodeMode; + } + + 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) + pSci = &_subEditView; + else + return -1; + + // get text of current scintilla + length = pSci->execute(SCI_GETTEXTLENGTH, 0, 0) + 1; + buffer = new char[length]; + pSci->execute(SCI_GETTEXT, length, (LPARAM)buffer); + + 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 + pSci->execute(SCI_GOTOPOS); + + // clean buffer + delete [] buffer; + + // set new encoding if BOM was changed by other programms + UniMode um = UnicodeConvertor.getEncoding(); + (pSci->getCurrentBuffer())->setUnicodeMode(um); + (pSci->getCurrentBuffer())->setDirty(true); + return um; + } + + case NPPM_ACTIVATEDOC : + case NPPM_TRIGGERTABBARCONTEXTMENU: + { + // similar to NPPM_ACTIVEDOC + int whichView = ((wParam != MAIN_VIEW) && (wParam != SUB_VIEW))?currentView():wParam; + int index = lParam; + + switchEditViewTo(whichView); + activateDoc(index); + + if (Message == NPPM_TRIGGERTABBARCONTEXTMENU) + { + // open here tab menu + NMHDR nmhdr; + nmhdr.code = NM_RCLICK; + + nmhdr.hwndFrom = (whichView == MAIN_VIEW)?_mainDocTab.getHSelf():_subDocTab.getHSelf(); + + nmhdr.idFrom = ::GetDlgCtrlID(nmhdr.hwndFrom); + ::SendMessage(_hSelf, WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr); + } + return TRUE; + } + + case NPPM_GETNPPVERSION: + { + const TCHAR * verStr = VERSION_VALUE; + TCHAR mainVerStr[16]; + TCHAR auxVerStr[16]; + bool isDot = false; + int j =0; + int k = 0; + for (int i = 0 ; verStr[i] ; i++) + { + if (verStr[i] == '.') + isDot = true; + else + { + if (!isDot) + mainVerStr[j++] = verStr[i]; + else + auxVerStr[k++] = verStr[i]; + } + } + mainVerStr[j] = '\0'; + auxVerStr[k] = '\0'; + + int mainVer, auxVer = 0; + if (mainVerStr) + mainVer = generic_atoi(mainVerStr); + if (auxVerStr) + auxVer = generic_atoi(auxVerStr); + + return MAKELONG(auxVer, mainVer); + } + + case WM_ISCURRENTMACRORECORDED : + return (!_macro.empty() && !_recordingMacro); + + case WM_MACRODLGRUNMACRO: + { + if (!_recordingMacro) // if we're not currently recording, then playback the recorded keystrokes + { + 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(); + int indexMacro = _runMacroDlg.getMacro2Exec(); + int deltaLastLine = 0; + int deltaCurrLine = 0; + + Macro m = _macro; + + if (indexMacro != -1) + { + vector & ms = pNppParam->getMacroList(); + m = ms[indexMacro].getMacro(); + } + + _pEditView->execute(SCI_BEGINUNDOACTION); + while (true) + { + for (Macro::iterator step = m.begin(); step != m.end(); step++) + step->PlayBack(this, _pEditView); + + counter++; + if ( times >= 0 ) + { + if ( counter >= times ) break; + } + else // run until eof + { + bool cursorMovedUp = deltaCurrLine < 0; + deltaLastLine = int(_pEditView->execute(SCI_GETLINECOUNT)) - 1 - lastLine; + deltaCurrLine = _pEditView->getCurrentLineNumber() - currLine; + + if (( deltaCurrLine == 0 ) // line no. not changed? + && (deltaLastLine >= 0)) // and no lines removed? + break; // exit + + // Update the line count, but only if the number of lines remaining is shrinking. + // Otherwise, the macro playback may never end. + if (deltaLastLine < deltaCurrLine) + lastLine += deltaLastLine; + + // save current line + currLine += deltaCurrLine; + + // eof? + if ((currLine >= lastLine) || (currLine < 0) + || ((deltaCurrLine == 0) && (currLine == 0) && ((deltaLastLine >= 0) || cursorMovedUp))) + break; + } + } + _pEditView->execute(SCI_ENDUNDOACTION); + } + } + break; + + case NPPM_CREATESCINTILLAHANDLE : + { + return (LRESULT)_scintillaCtrls4Plugins.createSintilla((lParam == NULL?_hSelf:(HWND)lParam)); + } + + case NPPM_DESTROYSCINTILLAHANDLE : + { + return _scintillaCtrls4Plugins.destroyScintilla((HWND)lParam); + } + + case NPPM_GETNBUSERLANG : + { + if (lParam) + *((int *)lParam) = IDM_LANG_USER; + return pNppParam->getNbUserLang(); + } + + case NPPM_GETCURRENTDOCINDEX : + { + if (lParam == SUB_VIEW) + { + if (!viewVisible(SUB_VIEW)) + return -1; + return _subDocTab.getCurrentTabIndex(); + } + else //MAIN_VIEW + { + if (!viewVisible(MAIN_VIEW)) + return -1; + return _mainDocTab.getCurrentTabIndex(); + } + } + + case NPPM_SETSTATUSBAR : + { + TCHAR *str2set = (TCHAR *)lParam; + if (!str2set || !str2set[0]) + return FALSE; + + 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 : + _statusBar.setText(str2set, wParam); + return TRUE; + default : + return FALSE; + } + } + + case NPPM_GETMENUHANDLE : + { + if (wParam == NPPPLUGINMENU) + return (LRESULT)_pluginsManager.getMenuHandle(); + else + return NULL; + } + + case NPPM_LOADSESSION : + { + fileLoadSession((const TCHAR *)lParam); + return TRUE; + } + + case NPPM_SAVECURRENTSESSION : + { + return (LRESULT)fileSaveSession(0, NULL, (const TCHAR *)lParam); + } + + case NPPM_SAVESESSION : + { + sessionInfo *pSi = (sessionInfo *)lParam; + return (LRESULT)fileSaveSession(pSi->nbFile, pSi->files, pSi->sessionFilePathName); + } + + case NPPM_INTERNAL_CLEARSCINTILLAKEY : + { + _mainEditView.execute(SCI_CLEARCMDKEY, wParam); + _subEditView.execute(SCI_CLEARCMDKEY, wParam); + return TRUE; + } + case NPPM_INTERNAL_BINDSCINTILLAKEY : + { + _mainEditView.execute(SCI_ASSIGNCMDKEY, wParam, lParam); + _subEditView.execute(SCI_ASSIGNCMDKEY, wParam, lParam); + + return TRUE; + } + case NPPM_INTERNAL_CMDLIST_MODIFIED : + { + //changeMenuShortcut(lParam, (const TCHAR *)wParam); + ::DrawMenuBar(_hSelf); + return TRUE; + } + + case NPPM_INTERNAL_MACROLIST_MODIFIED : + { + return TRUE; + } + + case NPPM_INTERNAL_USERCMDLIST_MODIFIED : + { + return TRUE; + } + + case NPPM_INTERNAL_SETCARETWIDTH : + { + NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); + + if (nppGUI._caretWidth < 4) + { + _mainEditView.execute(SCI_SETCARETSTYLE, CARETSTYLE_LINE); + _subEditView.execute(SCI_SETCARETSTYLE, CARETSTYLE_LINE); + _mainEditView.execute(SCI_SETCARETWIDTH, nppGUI._caretWidth); + _subEditView.execute(SCI_SETCARETWIDTH, nppGUI._caretWidth); + } + else + { + _mainEditView.execute(SCI_SETCARETWIDTH, 1); + _subEditView.execute(SCI_SETCARETWIDTH, 1); + _mainEditView.execute(SCI_SETCARETSTYLE, CARETSTYLE_BLOCK); + _subEditView.execute(SCI_SETCARETSTYLE, CARETSTYLE_BLOCK); + } + return TRUE; + } + + case NPPM_INTERNAL_SETCARETBLINKRATE : + { + NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); + _mainEditView.execute(SCI_SETCARETPERIOD, nppGUI._caretBlinkRate); + _subEditView.execute(SCI_SETCARETPERIOD, nppGUI._caretBlinkRate); + return TRUE; + } + + case NPPM_INTERNAL_ISTABBARREDUCED : + { + return _toReduceTabBar?TRUE:FALSE; + } + + // ADD: success->hwnd; failure->NULL + // REMOVE: success->NULL; failure->hwnd + case NPPM_MODELESSDIALOG : + { + if (wParam == MODELESSDIALOGADD) + { + for (size_t i = 0 ; i < _hModelessDlgs.size() ; i++) + if (_hModelessDlgs[i] == (HWND)lParam) + return NULL; + _hModelessDlgs.push_back((HWND)lParam); + return lParam; + } + else if (wParam == MODELESSDIALOGREMOVE) + { + for (size_t i = 0 ; i < _hModelessDlgs.size() ; i++) + if (_hModelessDlgs[i] == (HWND)lParam) + { + vector::iterator hDlg = _hModelessDlgs.begin() + i; + _hModelessDlgs.erase(hDlg); + return NULL; + } + return lParam; + } + return TRUE; + } + + case WM_CONTEXTMENU : + { + if (pNppParam->_isTaskListRBUTTONUP_Active) + { + pNppParam->_isTaskListRBUTTONUP_Active = false; + } + else + { + if ((HWND(wParam) == _mainEditView.getHSelf()) || (HWND(wParam) == _subEditView.getHSelf())) + { + if ((HWND(wParam) == _mainEditView.getHSelf())) { + switchEditViewTo(MAIN_VIEW); + } else { + switchEditViewTo(SUB_VIEW); + } + POINT p; + ::GetCursorPos(&p); + ContextMenu scintillaContextmenu; + vector & tmp = pNppParam->getContextMenuItems(); + vector isEnable; + for (size_t i = 0 ; i < tmp.size() ; i++) + { + isEnable.push_back((::GetMenuState(_mainMenuHandle, tmp[i]._cmdID, MF_BYCOMMAND)&MF_DISABLED) == 0); + } + scintillaContextmenu.create(_hSelf, tmp); + for (size_t i = 0 ; i < isEnable.size() ; i++) + scintillaContextmenu.enableItem(tmp[i]._cmdID, isEnable[i]); + + scintillaContextmenu.display(p); + return TRUE; + } + } + + return ::DefWindowProc(hwnd, Message, wParam, lParam); + } + + case WM_NOTIFY: + { + checkClipboard(); + checkUndoState(); + checkMacroState(); + _pluginsManager.notify(reinterpret_cast(lParam)); + return notify(reinterpret_cast(lParam)); + } + + case NPPM_INTERNAL_CHECKDOCSTATUS : + case WM_ACTIVATEAPP : + { + if (wParam == TRUE) // if npp is about to be activated + { + const NppGUI & nppgui = pNppParam->getNppGUI(); + if (LOWORD(wParam) && (nppgui._fileAutoDetection != cdDisabled)) + { + _activeAppInf._isActivated = true; + checkModifiedDocument(); + return FALSE; + } + } + break; + } + + case NPPM_INTERNAL_GETCHECKDOCOPT : + { + return (LRESULT)((NppGUI &)(pNppParam->getNppGUI()))._fileAutoDetection; + } + + 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) + ((NppGUI &)(pNppParam->getNppGUI()))._fileAutoDetection = (ChangeDetect)wParam; + return TRUE; + } + + case NPPM_GETPOSFROMBUFFERID : + { + int i; + + if ((i = _mainDocTab.getIndexByBuffer((BufferID)wParam)) != -1) + { + long view = MAIN_VIEW; + view <<= 30; + return view|i; + } + if ((i = _subDocTab.getIndexByBuffer((BufferID)wParam)) != -1) + { + long view = SUB_VIEW; + view <<= 30; + return view|i; + } + return -1; + } + + case NPPM_GETFULLPATHFROMBUFFERID : + { + return MainFileManager->getFileNameFromBuffer((BufferID)wParam, (TCHAR *)lParam); + } + + case NPPM_INTERNAL_ENABLECHECKDOCOPT: + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + if (wParam == CHECKDOCOPT_NONE) + nppgui._fileAutoDetection = cdDisabled; + else if (wParam == CHECKDOCOPT_UPDATESILENTLY) + nppgui._fileAutoDetection = cdAutoUpdate; + else if (wParam == CHECKDOCOPT_UPDATEGO2END) + nppgui._fileAutoDetection = cdGo2end; + else if (wParam == (CHECKDOCOPT_UPDATESILENTLY | CHECKDOCOPT_UPDATEGO2END)) + nppgui._fileAutoDetection = cdAutoUpdateGo2end; + + return TRUE; + } + + case WM_ACTIVATE : + _pEditView->getFocus(); + return TRUE; + + case WM_DROPFILES: + { + dropFiles(reinterpret_cast(wParam)); + return TRUE; + } + + case WM_UPDATESCINTILLAS: + { + //reset styler for change in Stylers.xml + _mainEditView.defineDocType(_mainEditView.getCurrentBuffer()->getLangType()); + _subEditView.defineDocType(_subEditView.getCurrentBuffer()->getLangType()); + _mainEditView.performGlobalStyles(); + _subEditView.performGlobalStyles(); + _findReplaceDlg.updateFinderScintilla(); + + drawTabbarColoursFromStylerArray(); + + // Notify plugins of update to styles xml + SCNotification scnN; + scnN.nmhdr.code = NPPN_WORDSTYLESUPDATED; + scnN.nmhdr.hwndFrom = _hSelf; + scnN.nmhdr.idFrom = (uptr_t) _pEditView->getCurrentBufferID(); + _pluginsManager.notify(&scnN); + return TRUE; + } + + case WM_QUERYENDSESSION: + case WM_CLOSE: + { + const NppGUI & nppgui = pNppParam->getNppGUI(); + + Session currentSession; + if (nppgui._rememberLastSession) + { + getCurrentOpenedFiles(currentSession); + //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(); //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 + return FALSE; + } + + 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(); + + SCNotification scnN; + scnN.nmhdr.code = NPPN_SHUTDOWN; + scnN.nmhdr.hwndFrom = _hSelf; + scnN.nmhdr.idFrom = 0; + _pluginsManager.notify(&scnN); + + saveFindHistory(); + + _lastRecentFileList.saveLRFL(); + saveScintillaParams(SCIV_PRIMARY); + saveScintillaParams(SCIV_SECOND); + saveGUIParams(); + saveUserDefineLangs(); + saveShortcuts(); + if (nppgui._rememberLastSession) + saveSession(currentSession); + + //Sends WM_DESTROY, Notepad++ will end + ::DestroyWindow(hwnd); + + return TRUE; + } + + case WM_DESTROY: + { + killAllChildren(); + ::PostQuitMessage(0); + gNppHWND = NULL; + return TRUE; + } + + case WM_SYSCOMMAND: + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + if ((nppgui._isMinimizedToTray) && (wParam == SC_MINIMIZE)) + { + if (!_pTrayIco) + _pTrayIco = new trayIconControler(_hSelf, IDI_M30ICON, IDC_MINIMIZED_TRAY, ::LoadIcon(_hInst, MAKEINTRESOURCE(IDI_M30ICON)), TEXT("")); + + _pTrayIco->doTrayIcon(ADD); + ::ShowWindow(hwnd, SW_HIDE); + return TRUE; + } + + if (wParam == SC_KEYMENU && lParam == VK_SPACE) + { + _sysMenuEntering = true; + } + else if (wParam == 0xF093) //it should be SC_MOUSEMENU. A bug? + { + _sysMenuEntering = true; + } + + return ::DefWindowProc(hwnd, Message, wParam, lParam); + } + + case WM_LBUTTONDBLCLK: + { + ::SendMessage(_hSelf, WM_COMMAND, IDM_FILE_NEW, 0); + return TRUE; + } + + case IDC_MINIMIZED_TRAY: + { + switch (lParam) + { + //case WM_LBUTTONDBLCLK: + case WM_LBUTTONUP : + _pEditView->getFocus(); + ::ShowWindow(_hSelf, SW_SHOW); + _pTrayIco->doTrayIcon(REMOVE); + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + return TRUE; +/* + case WM_RBUTTONUP: + { + POINT p; + GetCursorPos(&p); + TrackPopupMenu(hTrayIconMenu, TPM_LEFTALIGN, p.x, p.y, 0, hwnd, NULL); + return TRUE; + } +*/ + } + return TRUE; + } + + case NPPM_DMMSHOW: + { + _dockingManager.showDockableDlg((HWND)lParam, SW_SHOW); + return TRUE; + } + + case NPPM_DMMHIDE: + { + _dockingManager.showDockableDlg((HWND)lParam, SW_HIDE); + return TRUE; + } + + case NPPM_DMMUPDATEDISPINFO: + { + if (::IsWindowVisible((HWND)lParam)) + _dockingManager.updateContainerInfo((HWND)lParam); + return TRUE; + } + + case NPPM_DMMREGASDCKDLG: + { + tTbData *pData = (tTbData *)lParam; + int iCont = -1; + bool isVisible = false; + + getIntegralDockingData(*pData, iCont, isVisible); + _dockingManager.createDockableDlg(*pData, iCont, isVisible); + return TRUE; + } + + case NPPM_DMMVIEWOTHERTAB: + { + _dockingManager.showDockableDlg((TCHAR*)lParam, SW_SHOW); + return TRUE; + } + + case NPPM_DMMGETPLUGINHWNDBYNAME : //(const TCHAR *windowName, const TCHAR *moduleName) + { + if (!lParam) return NULL; + + TCHAR *moduleName = (TCHAR *)lParam; + TCHAR *windowName = (TCHAR *)wParam; + vector dockContainer = _dockingManager.getContainerInfo(); + for (size_t i = 0 ; i < dockContainer.size() ; i++) + { + vector tbData = dockContainer[i]->getDataOfAllTb(); + for (size_t j = 0 ; j < tbData.size() ; 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) + return (LRESULT)tbData[j]->hClient; + } + } + } + return NULL; + } + + case NPPM_ADDTOOLBARICON: + { + _toolBar.registerDynBtn((UINT)wParam, (toolbarIcons*)lParam); + return TRUE; + } + + case NPPM_SETMENUITEMCHECK: + { + ::CheckMenuItem(_mainMenuHandle, (UINT)wParam, MF_BYCOMMAND | ((BOOL)lParam ? MF_CHECKED : MF_UNCHECKED)); + _toolBar.setCheck((int)wParam, bool(lParam != 0)); + return TRUE; + } + + case NPPM_GETWINDOWSVERSION: + { + return _winVersion; + } + + case NPPM_MAKECURRENTBUFFERDIRTY : + { + _pEditView->getCurrentBuffer()->setDirty(true); + return TRUE; + } + + case NPPM_GETENABLETHEMETEXTUREFUNC : + { + return (LRESULT)pNppParam->getEnableThemeDlgTexture(); + } + + case NPPM_GETPLUGINSCONFIGDIR : + { + if (!lParam || !wParam) + return FALSE; + + const TCHAR *pluginsConfigDirPrefix = pNppParam->getAppDataNppDir(); + + if (!pluginsConfigDirPrefix[0]) + pluginsConfigDirPrefix = pNppParam->getNppPath(); + + const TCHAR *secondPart = TEXT("plugins\\Config"); + + int len = wParam; + if (len < lstrlen(pluginsConfigDirPrefix) + lstrlen(secondPart)) + return FALSE; + + TCHAR *pluginsConfigDir = (TCHAR *)lParam; + lstrcpy(pluginsConfigDir, pluginsConfigDirPrefix); + + ::PathAppend(pluginsConfigDir, secondPart); + return TRUE; + } + + case NPPM_MSGTOPLUGIN : + { + return _pluginsManager.relayPluginMessages(Message, wParam, lParam); + } + + case NPPM_HIDETABBAR : + { + bool hide = (lParam != 0); + bool oldVal = DocTabView::getHideTabBarStatus(); + if (hide == oldVal) return oldVal; + + DocTabView::setHideTabBarStatus(hide); + ::SendMessage(_hSelf, WM_SIZE, 0, 0); + + NppGUI & nppGUI = (NppGUI &)((NppParameters::getInstance())->getNppGUI()); + if (hide) + nppGUI._tabStatus |= TAB_HIDE; + else + nppGUI._tabStatus &= ~TAB_HIDE; + + return oldVal; + } + case NPPM_ISTABBARHIDDEN : + { + return _mainDocTab.getHideTabBarStatus(); + } + + + case NPPM_HIDETOOLBAR : + { + bool show = (lParam != TRUE); + bool currentStatus = _rebarTop.getIDVisible(REBAR_BAR_TOOLBAR); + if (show != currentStatus) + _rebarTop.setIDVisible(REBAR_BAR_TOOLBAR, show); + return currentStatus; + } + case NPPM_ISTOOLBARHIDDEN : + { + return !_rebarTop.getIDVisible(REBAR_BAR_TOOLBAR); + } + + case NPPM_HIDEMENU : + { + bool hide = (lParam == TRUE); + bool isHidden = ::GetMenu(_hSelf) == NULL; + if (hide == isHidden) + return isHidden; + + NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); + nppGUI._menuBarShow = !hide; + if (nppGUI._menuBarShow) + ::SetMenu(_hSelf, _mainMenuHandle); + else + ::SetMenu(_hSelf, NULL); + + return isHidden; + } + case NPPM_ISMENUHIDDEN : + { + return (::GetMenu(_hSelf) == NULL); + } + + case NPPM_HIDESTATUSBAR: + { + bool show = (lParam != TRUE); + NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); + bool oldVal = nppGUI._statusBarShow; + if (show == oldVal) + { + return oldVal; + } + RECT rc; + getClientRect(rc); + + nppGUI._statusBarShow = show; + _statusBar.display(nppGUI._statusBarShow); + ::SendMessage(_hSelf, WM_SIZE, SIZE_RESTORED, MAKELONG(rc.bottom, rc.right)); + return oldVal; + } + + case NPPM_ISSTATUSBARHIDDEN : + { + NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); + return !nppGUI._statusBarShow; + } + +/* + 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 : + { + HWND hTabToTest = (currentView() == MAIN_VIEW)?_mainDocTab.getHSelf():_subDocTab.getHSelf(); + return (HWND)lParam == hTabToTest; + } + + case NPPM_INTERNAL_GETMENU : + { + return (LRESULT)_mainMenuHandle; + } + + case NPPM_INTERNAL_CLEARINDICATOR : + { + _pEditView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_2); + return TRUE; + } + case NPPM_INTERNAL_CLEARINDICATORTAGMATCH : + { + _pEditView->clearIndicator(SCE_UNIVERSAL_TAGMATCH); + _pEditView->clearIndicator(SCE_UNIVERSAL_TAGATTR); + return TRUE; + } + case NPPM_INTERNAL_CLEARINDICATORTAGATTR : + { + _pEditView->clearIndicator(SCE_UNIVERSAL_TAGATTR); + return TRUE; + } + + case NPPM_INTERNAL_SWITCHVIEWFROMHWND : + { + HWND handle = (HWND)lParam; + if (_mainEditView.getHSelf() == handle || _mainDocTab.getHSelf() == handle) + { + switchEditViewTo(MAIN_VIEW); + } + else if (_subEditView.getHSelf() == handle || _subDocTab.getHSelf() == handle) + { + switchEditViewTo(SUB_VIEW); + } + return TRUE; + } + + case NPPM_INTERNAL_UPDATETITLEBAR : + { + setTitle(); + return TRUE; + } + + case WM_INITMENUPOPUP: + { + _windowsMenu.initPopupMenu((HMENU)wParam, _pDocTab); + return TRUE; + } + + case WM_ENTERMENULOOP: + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + if (!nppgui._menuBarShow && !wParam && !_sysMenuEntering) + ::SetMenu(_hSelf, _mainMenuHandle); + + return TRUE; + } + + case WM_EXITMENULOOP: + { + NppGUI & nppgui = (NppGUI &)(pNppParam->getNppGUI()); + if (!nppgui._menuBarShow && !wParam && !_sysMenuEntering) + ::SetMenu(_hSelf, NULL); + _sysMenuEntering = false; + return FALSE; + } + + default: + { + if (Message == WDN_NOTIFY) + { + NMWINDLG* nmdlg = (NMWINDLG*)lParam; + 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 + for (int i = 0; i < (int)nmdlg->nItems; i++) { + fileSave(_pDocTab->getBufferByIndex(i)); + } + nmdlg->processed = TRUE; + } + break; + case WDT_CLOSE: + { + //loop through nmdlg->nItems, get index and close it + for (int i = 0; i < (int)nmdlg->nItems; i++) { + fileClose(_pDocTab->getBufferByIndex(nmdlg->Items[i]), currentView()); + UINT pos = nmdlg->Items[i]; + nmdlg->Items[i] = 0xFFFFFFFF; // indicate file was closed + + for (int j=i+1; j<(int)nmdlg->nItems; ++j) + if (nmdlg->Items[j] > pos) + --nmdlg->Items[j]; + } + nmdlg->processed = TRUE; + } + break; + case WDT_SORT: + if (nmdlg->nItems != _pDocTab->nbItem()) //sanity check, if mismatch just abort + break; + //Collect all buffers + std::vector tempBufs; + 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++) { + _pDocTab->setBuffer(i, tempBufs[nmdlg->Items[i]]); + } + activateBuffer(_pDocTab->getBufferByIndex(_pDocTab->getCurrentTabIndex()), currentView()); + break; + } + return TRUE; + } + + return ::DefWindowProc(hwnd, Message, wParam, lParam); + } + } + + _pluginsManager.relayNppMessages(Message, wParam, lParam); + return result; +} + +LRESULT CALLBACK Notepad_plus::Notepad_plus_Proc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + + static bool isFirstGetMinMaxInfoMsg = true; + + switch(Message) + { + case WM_NCCREATE : // First message we get the ptr of instantiated object + // then stock it into GWL_USERDATA index in order to retrieve afterward + { + Notepad_plus *pM30ide = (Notepad_plus *)(((LPCREATESTRUCT)lParam)->lpCreateParams); + pM30ide->_hSelf = hwnd; + ::SetWindowLongPtr(hwnd, GWL_USERDATA, (LONG)pM30ide); + + return TRUE; + } + + default : + { + return ((Notepad_plus *)::GetWindowLongPtr(hwnd, GWL_USERDATA))->runProc(hwnd, Message, wParam, lParam); + } + } +} + +void Notepad_plus::fullScreenToggle() +{ + if (!_beforeSpecialView.isFullScreen) //toggle fullscreen on + { + _beforeSpecialView._winPlace.length = sizeof(_beforeSpecialView._winPlace); + ::GetWindowPlacement(_hSelf, &_beforeSpecialView._winPlace); + + RECT fullscreenArea; //RECT used to calculate window fullscreen size + //Preset view area, in case something fails, primary monitor values + fullscreenArea.top = 0; + fullscreenArea.left = 0; + fullscreenArea.right = GetSystemMetrics(SM_CXSCREEN); + fullscreenArea.bottom = GetSystemMetrics(SM_CYSCREEN); + + //if (_winVersion != WV_NT) + { + HMONITOR currentMonitor; //Handle to monitor where fullscreen should go + MONITORINFO mi; //Info of that monitor + //Caution, this will not work on windows 95, so probably add some checking of some sorts like Unicode checks, IF 95 were to be supported + currentMonitor = ::MonitorFromWindow(_hSelf, MONITOR_DEFAULTTONEAREST); //should always be valid monitor handle + mi.cbSize = sizeof(MONITORINFO); + if (::GetMonitorInfo(currentMonitor, &mi) != FALSE) + { + fullscreenArea = mi.rcMonitor; + fullscreenArea.right -= fullscreenArea.left; + fullscreenArea.bottom -= fullscreenArea.top; + } + } + + //Setup GUI + if (!_beforeSpecialView.isPostIt) + { + //only change the GUI if not already done by postit + _beforeSpecialView.isMenuShown = ::SendMessage(_hSelf, NPPM_ISMENUHIDDEN, 0, 0) != TRUE; + if (_beforeSpecialView.isMenuShown) + ::SendMessage(_hSelf, NPPM_HIDEMENU, 0, TRUE); + + //Hide rebar + _rebarTop.display(false); + _rebarBottom.display(false); + } + + //Hide window so windows can properly update it + ::ShowWindow(_hSelf, SW_HIDE); + + //Set popup style for fullscreen window and store the old style + if (!_beforeSpecialView.isPostIt) + { + _beforeSpecialView.preStyle = ::SetWindowLongPtr( _hSelf, GWL_STYLE, WS_POPUP ); + if (!_beforeSpecialView.preStyle) { //something went wrong, use default settings + _beforeSpecialView.preStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN; + } + } + + //Set fullscreen window, highest non-top z-order, show the window and redraw it (refreshing the windowmanager cache aswell) + ::ShowWindow(_hSelf, SW_SHOW); + ::SetWindowPos(_hSelf, HWND_TOP, fullscreenArea.left, fullscreenArea.top, fullscreenArea.right, fullscreenArea.bottom, SWP_NOZORDER|SWP_DRAWFRAME|SWP_FRAMECHANGED); + ::SetForegroundWindow(_hSelf); + } + else //toggle fullscreen off + { + //Hide window for updating, restore style and menu then restore position and Z-Order + ::ShowWindow(_hSelf, SW_HIDE); + + //Setup GUI + if (!_beforeSpecialView.isPostIt) + { + //only change the GUI if postit isnt active + if (_beforeSpecialView.isMenuShown) + ::SendMessage(_hSelf, NPPM_HIDEMENU, 0, FALSE); + + //Show rebar + _rebarTop.display(true); + _rebarBottom.display(true); + } + + //Set old style if not fullscreen + if (!_beforeSpecialView.isPostIt) + { + ::SetWindowLongPtr( _hSelf, GWL_STYLE, _beforeSpecialView.preStyle); + //Redraw the window and refresh windowmanager cache, dont do anything else, sizing is done later on + ::SetWindowPos(_hSelf, HWND_TOP,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_DRAWFRAME|SWP_FRAMECHANGED); + ::ShowWindow(_hSelf, SW_SHOW); + } + + if (_beforeSpecialView._winPlace.length) + { + if (_beforeSpecialView._winPlace.showCmd == SW_SHOWMAXIMIZED) + { + //::ShowWindow(_hSelf, SW_RESTORE); + ::ShowWindow(_hSelf, SW_SHOWMAXIMIZED); + } + else + { + ::SetWindowPlacement(_hSelf, &_beforeSpecialView._winPlace); + } + } + else //fallback + { + ::ShowWindow(_hSelf, SW_SHOW); + } + } + //::SetForegroundWindow(_hSelf); + _beforeSpecialView.isFullScreen = !_beforeSpecialView.isFullScreen; + ::SendMessage(_hSelf, WM_SIZE, 0, 0); +} + +void Notepad_plus::postItToggle() +{ + NppParameters * pNppParam = NppParameters::getInstance(); + if (!_beforeSpecialView.isPostIt) // PostIt disabled, enable it + { + NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); + // get current status before switch to postIt + //check these always + { + _beforeSpecialView.isAlwaysOnTop = ::GetMenuState(_mainMenuHandle, IDM_VIEW_ALWAYSONTOP, MF_BYCOMMAND) == MF_CHECKED; + _beforeSpecialView.isTabbarShown = ::SendMessage(_hSelf, NPPM_ISTABBARHIDDEN, 0, 0) != TRUE; + _beforeSpecialView.isStatusbarShown = nppGUI._statusBarShow; + if (nppGUI._statusBarShow) + ::SendMessage(_hSelf, NPPM_HIDESTATUSBAR, 0, TRUE); + if (_beforeSpecialView.isTabbarShown) + ::SendMessage(_hSelf, NPPM_HIDETABBAR, 0, TRUE); + if (!_beforeSpecialView.isAlwaysOnTop) + ::SendMessage(_hSelf, WM_COMMAND, IDM_VIEW_ALWAYSONTOP, 0); + } + //Only check these if not fullscreen + if (!_beforeSpecialView.isFullScreen) + { + _beforeSpecialView.isMenuShown = ::SendMessage(_hSelf, NPPM_ISMENUHIDDEN, 0, 0) != TRUE; + if (_beforeSpecialView.isMenuShown) + ::SendMessage(_hSelf, NPPM_HIDEMENU, 0, TRUE); + + //Hide rebar + _rebarTop.display(false); + _rebarBottom.display(false); + } + + // PostIt! + + //Set popup style for fullscreen window and store the old style + if (!_beforeSpecialView.isFullScreen) + { + //Hide window so windows can properly update it + ::ShowWindow(_hSelf, SW_HIDE); + _beforeSpecialView.preStyle = ::SetWindowLongPtr( _hSelf, GWL_STYLE, WS_POPUP ); + if (!_beforeSpecialView.preStyle) { //something went wrong, use default settings + _beforeSpecialView.preStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN; + } + //Redraw the window and refresh windowmanager cache, dont do anything else, sizing is done later on + ::SetWindowPos(_hSelf, HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_DRAWFRAME|SWP_FRAMECHANGED); + ::ShowWindow(_hSelf, SW_SHOW); + } + } + else //PostIt enabled, disable it + { + //Setup GUI + if (!_beforeSpecialView.isFullScreen) + { + //only change the these parts of GUI if not already done by fullscreen + if (_beforeSpecialView.isMenuShown) + ::SendMessage(_hSelf, NPPM_HIDEMENU, 0, FALSE); + + //Show rebar + _rebarTop.display(true); + _rebarBottom.display(true); + } + //Do this GUI config always + if (_beforeSpecialView.isStatusbarShown) + ::SendMessage(_hSelf, NPPM_HIDESTATUSBAR, 0, FALSE); + if (_beforeSpecialView.isTabbarShown) + ::SendMessage(_hSelf, NPPM_HIDETABBAR, 0, FALSE); + if (!_beforeSpecialView.isAlwaysOnTop) + ::SendMessage(_hSelf, WM_COMMAND, IDM_VIEW_ALWAYSONTOP, 0); + + //restore window style if not fullscreen + if (!_beforeSpecialView.isFullScreen) + { + //dwStyle |= (WS_CAPTION | WS_SIZEBOX); + ::ShowWindow(_hSelf, SW_HIDE); + ::SetWindowLongPtr(_hSelf, GWL_STYLE, _beforeSpecialView.preStyle); + + //Redraw the window and refresh windowmanager cache, dont do anything else, sizing is done later on + ::SetWindowPos(_hSelf, HWND_NOTOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_DRAWFRAME|SWP_FRAMECHANGED); + ::ShowWindow(_hSelf, SW_SHOW); + } + } + + _beforeSpecialView.isPostIt = !_beforeSpecialView.isPostIt; + ::SendMessage(_hSelf, WM_SIZE, 0, 0); +} + +void Notepad_plus::doSynScorll(HWND whichView) +{ + int column = 0; + int line = 0; + ScintillaEditView *pView; + + // var for Line + int mainCurrentLine, subCurrentLine; + + // var for Column + int mxoffset, sxoffset; + int pixel; + int mainColumn, subColumn; + + if (whichView == _mainEditView.getHSelf()) + { + if (_syncInfo._isSynScollV) + { + // Compute for Line + mainCurrentLine = _mainEditView.execute(SCI_GETFIRSTVISIBLELINE); + subCurrentLine = _subEditView.execute(SCI_GETFIRSTVISIBLELINE); + line = mainCurrentLine - _syncInfo._line - subCurrentLine; + } + if (_syncInfo._isSynScollH) + { + // Compute for Column + mxoffset = _mainEditView.execute(SCI_GETXOFFSET); + pixel = int(_mainEditView.execute(SCI_TEXTWIDTH, STYLE_DEFAULT, (LPARAM)"P")); + mainColumn = mxoffset/pixel; + + sxoffset = _subEditView.execute(SCI_GETXOFFSET); + pixel = int(_subEditView.execute(SCI_TEXTWIDTH, STYLE_DEFAULT, (LPARAM)"P")); + subColumn = sxoffset/pixel; + column = mainColumn - _syncInfo._column - subColumn; + } + pView = &_subEditView; + } + else if (whichView == _subEditView.getHSelf()) + { + if (_syncInfo._isSynScollV) + { + // Compute for Line + mainCurrentLine = _mainEditView.execute(SCI_GETFIRSTVISIBLELINE); + subCurrentLine = _subEditView.execute(SCI_GETFIRSTVISIBLELINE); + line = subCurrentLine + _syncInfo._line - mainCurrentLine; + } + if (_syncInfo._isSynScollH) + { + // Compute for Column + mxoffset = _mainEditView.execute(SCI_GETXOFFSET); + pixel = int(_mainEditView.execute(SCI_TEXTWIDTH, STYLE_DEFAULT, (LPARAM)"P")); + mainColumn = mxoffset/pixel; + + sxoffset = _subEditView.execute(SCI_GETXOFFSET); + pixel = int(_subEditView.execute(SCI_TEXTWIDTH, STYLE_DEFAULT, (LPARAM)"P")); + subColumn = sxoffset/pixel; + column = subColumn + _syncInfo._column - mainColumn; + } + pView = &_mainEditView; + } + else + return; + + pView->scroll(column, line); +} + +bool Notepad_plus::getIntegralDockingData(tTbData & dockData, int & iCont, bool & isVisible) +{ + DockingManagerData & dockingData = (DockingManagerData &)(NppParameters::getInstance())->getNppGUI()._dockingData; + + for (size_t i = 0 ; i < dockingData._pluginDockInfo.size() ; i++) + { + const PlugingDlgDockingInfo & pddi = dockingData._pluginDockInfo[i]; + + if (!generic_stricmp(pddi._name, dockData.pszModuleName) && (pddi._internalID == dockData.dlgID)) + { + iCont = pddi._currContainer; + isVisible = pddi._isVisible; + dockData.iPrevCont = pddi._prevContainer; + + if (dockData.iPrevCont != -1) + { + int cont = (pddi._currContainer < DOCKCONT_MAX ? pddi._prevContainer : pddi._currContainer); + RECT *pRc = dockingData.getFloatingRCFrom(cont); + if (pRc) + dockData.rcFloat = *pRc; + } + return true; + } + } + return false; +} + + +void Notepad_plus::getCurrentOpenedFiles(Session & session) +{ + _mainEditView.saveCurrentPos(); //save position so itll be correct in the session + _subEditView.saveCurrentPos(); //both views + session._activeView = currentView(); + session._activeMainIndex = _mainDocTab.getCurrentTabIndex(); + session._activeSubIndex = _subDocTab.getCurrentTabIndex(); + + //Use _invisibleEditView to temporarily open documents to retrieve markers + //Buffer * mainBuf = _mainEditView.getCurrentBuffer(); + //Buffer * subBuf = _subEditView.getCurrentBuffer(); + Document oldDoc = _invisibleEditView.execute(SCI_GETDOCPOINTER); + + for (int i = 0 ; i < _mainDocTab.nbItem() ; i++) + { + BufferID bufID = _mainDocTab.getBufferByIndex(i); + Buffer * buf = MainFileManager->getBufferByID(bufID); + if (!buf->isUntitled() && PathFileExists(buf->getFullPathName())) + { + generic_string languageName = getLangFromMenu( buf ); + const TCHAR *langName = languageName.c_str(); + + sessionFileInfo sfi(buf->getFullPathName(), langName, buf->getPosition(&_mainEditView)); + + //_mainEditView.activateBuffer(buf->getID()); + _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, buf->getDocument()); + int maxLine = _invisibleEditView.execute(SCI_GETLINECOUNT); + for (int j = 0 ; j < maxLine ; j++) + { + if ((_invisibleEditView.execute(SCI_MARKERGET, j)&(1 << MARK_BOOKMARK)) != 0) + { + sfi.marks.push_back(j); + } + } + session._mainViewFiles.push_back(sfi); + } + } + + for (int i = 0 ; i < _subDocTab.nbItem() ; i++) + { + BufferID bufID = _subDocTab.getBufferByIndex(i); + Buffer * buf = MainFileManager->getBufferByID(bufID); + if (!buf->isUntitled() && PathFileExists(buf->getFullPathName())) + { + generic_string languageName = getLangFromMenu( buf ); + const TCHAR *langName = languageName.c_str(); + + sessionFileInfo sfi(buf->getFullPathName(), langName, buf->getPosition(&_subEditView)); + + _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, buf->getDocument()); + int maxLine = _invisibleEditView.execute(SCI_GETLINECOUNT); + for (int j = 0 ; j < maxLine ; j++) + { + if ((_invisibleEditView.execute(SCI_MARKERGET, j)&(1 << MARK_BOOKMARK)) != 0) + { + sfi.marks.push_back(j); + } + } + session._subViewFiles.push_back(sfi); + } + } + + //_mainEditView.activateBuffer(mainBuf->getID()); //restore buffer + //_subEditView.activateBuffer(subBuf->getID()); //restore buffer + //_mainEditView.execute(SCI_SETDOCPOINTER, 0, mainBuf->getDocument()); + //_mainEditView.restoreCurrentPos(); + //_subEditView.execute(SCI_SETDOCPOINTER, 0, subBuf->getDocument()); + //_subEditView.restoreCurrentPos(); + + _invisibleEditView.execute(SCI_SETDOCPOINTER, 0, oldDoc); +} + +bool Notepad_plus::fileLoadSession(const TCHAR *fn) +{ + bool result = false; + const TCHAR *sessionFileName = NULL; + if (fn == NULL) + { + FileDialog fDlg(_hSelf, _hInst); + fDlg.setExtFilter(TEXT("All types"), TEXT(".*"), NULL); + const TCHAR *ext = NppParameters::getInstance()->getNppGUI()._definedSessionExt.c_str(); + generic_string sessionExt = TEXT(""); + if (*ext != '\0') + { + if (*ext != '.') + sessionExt += TEXT("."); + sessionExt += ext; + fDlg.setExtFilter(TEXT("Session file"), sessionExt.c_str(), NULL); + } + sessionFileName = fDlg.doOpenSingleFileDlg(); + } + else + { + if (PathFileExists(fn)) + sessionFileName = fn; + } + + if (sessionFileName) + { + bool isAllSuccessful = true; + Session session2Load; + + if ((NppParameters::getInstance())->loadSession(session2Load, sessionFileName)) + { + isAllSuccessful = loadSession(session2Load); + result = true; + } + if (!isAllSuccessful) + (NppParameters::getInstance())->writeSession(session2Load, sessionFileName); + } + return result; +} + + +const TCHAR * Notepad_plus::fileSaveSession(size_t nbFile, TCHAR ** fileNames, const TCHAR *sessionFile2save) +{ + if (sessionFile2save) + { + Session currentSession; + if ((nbFile) && (!fileNames)) + { + for (size_t i = 0 ; i < nbFile ; i++) + { + if (PathFileExists(fileNames[i])) + currentSession._mainViewFiles.push_back(generic_string(fileNames[i])); + } + } + else + getCurrentOpenedFiles(currentSession); + + (NppParameters::getInstance())->writeSession(currentSession, sessionFile2save); + return sessionFile2save; + } + return NULL; +} + +const TCHAR * Notepad_plus::fileSaveSession(size_t nbFile, TCHAR ** fileNames) +{ + const TCHAR *sessionFileName = NULL; + + FileDialog fDlg(_hSelf, _hInst); + const TCHAR *ext = NppParameters::getInstance()->getNppGUI()._definedSessionExt.c_str(); + + fDlg.setExtFilter(TEXT("All types"), TEXT(".*"), NULL); + generic_string sessionExt = TEXT(""); + if (*ext != '\0') + { + if (*ext != '.') + sessionExt += TEXT("."); + sessionExt += ext; + fDlg.setExtFilter(TEXT("Session file"), sessionExt.c_str(), NULL); + } + sessionFileName = fDlg.doSaveDlg(); + + return fileSaveSession(nbFile, fileNames, sessionFileName); +} + + +bool Notepad_plus::str2Cliboard(const TCHAR *str2cpy) +{ + if (!str2cpy) + return false; + + int len2Allocate = lstrlen(str2cpy) + 1; + len2Allocate *= sizeof(TCHAR); + unsigned int cilpboardFormat = CF_TEXT; + +#ifdef UNICODE + cilpboardFormat = CF_UNICODETEXT; +#endif + + HGLOBAL hglbCopy = ::GlobalAlloc(GMEM_MOVEABLE, len2Allocate); + if (hglbCopy == NULL) + { + return false; + } + + if (!::OpenClipboard(_hSelf)) + return false; + + ::EmptyClipboard(); + + // Lock the handle and copy the text to the buffer. + TCHAR *pStr = (TCHAR *)::GlobalLock(hglbCopy); + lstrcpy(pStr, str2cpy); + ::GlobalUnlock(hglbCopy); + + // Place the handle on the clipboard. + ::SetClipboardData(cilpboardFormat, hglbCopy); + ::CloseClipboard(); + return true; +} + +//ONLY CALL IN CASE OF EMERGENCY: EXCEPTION +//This function is destructive +bool Notepad_plus::emergency(generic_string emergencySavedDir) +{ + bool filestatus = false; + bool dumpstatus = false; + do { + if (::CreateDirectory(emergencySavedDir.c_str(), NULL) == FALSE && ::GetLastError() != ERROR_ALREADY_EXISTS) { + break; + } + + filestatus = dumpFiles(emergencySavedDir.c_str(), TEXT("File")); + + } while (false); + + bool status = filestatus;// && dumpstatus; + return status; +} + +bool Notepad_plus::dumpFiles(const TCHAR * outdir, const TCHAR * fileprefix) { + //start dumping unsaved files to recovery directory + bool somethingsaved = false; + bool somedirty = false; + TCHAR savePath[MAX_PATH] = {0}; + + //rescue primary + for(int i = 0; i < MainFileManager->getNrBuffers(); i++) { + Buffer * docbuf = MainFileManager->getBufferByIndex(i); + if (!docbuf->isDirty()) //skip saved documents + continue; + else + somedirty = true; + + const TCHAR * unitext = (docbuf->getUnicodeMode() != uni8Bit)?TEXT("_utf8"):TEXT(""); + wsprintf(savePath, TEXT("%s\\%s%03d%s.dump"), outdir, fileprefix, i, unitext); + + bool res = MainFileManager->saveBuffer(docbuf->getID(), savePath); + + somethingsaved |= res; + } + + return somethingsaved || !somedirty; +} + +void Notepad_plus::drawTabbarColoursFromStylerArray() +{ + Style *stActText = getStyleFromName(TABBAR_ACTIVETEXT); + if (stActText && stActText->_fgColor != -1) + TabBarPlus::setColour(stActText->_fgColor, TabBarPlus::activeText); + + Style *stActfocusTop = getStyleFromName(TABBAR_ACTIVEFOCUSEDINDCATOR); + if (stActfocusTop && stActfocusTop->_fgColor != -1) + TabBarPlus::setColour(stActfocusTop->_fgColor, TabBarPlus::activeFocusedTop); + + Style *stActunfocusTop = getStyleFromName(TABBAR_ACTIVEUNFOCUSEDINDCATOR); + if (stActunfocusTop && stActunfocusTop->_fgColor != -1) + TabBarPlus::setColour(stActunfocusTop->_fgColor, TabBarPlus::activeUnfocusedTop); + + Style *stInact = getStyleFromName(TABBAR_INACTIVETEXT); + if (stInact && stInact->_fgColor != -1) + TabBarPlus::setColour(stInact->_fgColor, TabBarPlus::inactiveText); + if (stInact && stInact->_bgColor != -1) + TabBarPlus::setColour(stInact->_bgColor, TabBarPlus::inactiveBg); +} + +void Notepad_plus::notifyBufferChanged(Buffer * buffer, int mask) { + NppParameters *pNppParam = NppParameters::getInstance(); + const NppGUI & nppGUI = pNppParam->getNppGUI(); + + _mainEditView.bufferUpdated(buffer, mask); + _subEditView.bufferUpdated(buffer, mask); + _mainDocTab.bufferUpdated(buffer, mask); + _subDocTab.bufferUpdated(buffer, mask); + + bool mainActive = (_mainEditView.getCurrentBuffer() == buffer); + bool subActive = (_subEditView.getCurrentBuffer() == buffer); + + //Only event that applies to non-active Buffers + if (mask & BufferChangeStatus) { //reload etc + bool didDialog = false; + switch(buffer->getStatus()) { + case DOC_UNNAMED: //nothing todo + { + break; + } + case DOC_REGULAR: //nothing todo + { + break; + } + case DOC_MODIFIED: //ask for reloading + { + bool autoUpdate = (nppGUI._fileAutoDetection == cdAutoUpdate) || (nppGUI._fileAutoDetection == cdAutoUpdateGo2end); + if (!autoUpdate || buffer->isDirty()) + { + didDialog = true; + if (doReloadOrNot(buffer->getFullPathName(), buffer->isDirty()) != IDYES) + break; //abort + } + //activateBuffer(buffer->getID(), iView); //activate the buffer in the first view possible + doReload(buffer->getID(), false); + if (mainActive || subActive) + { + performPostReload(mainActive?MAIN_VIEW:SUB_VIEW); + } + break; + } + case DOC_DELETED: //ask for keep + { + int index = _pDocTab->getIndexByBuffer(buffer->getID()); + int iView = currentView(); + if (index == -1) + iView = otherView(); + //activateBuffer(buffer->getID(), iView); //activate the buffer in the first view possible + didDialog = true; + if (doCloseOrNot(buffer->getFullPathName()) == IDNO) + { + //close in both views, doing current view last since that has to remain opened + doClose(buffer->getID(), otherView()); + doClose(buffer->getID(), currentView()); + } + break; + } + } + + if (didDialog) + { + int curPos = _pEditView->execute(SCI_GETCURRENTPOS); + ::PostMessage(_pEditView->getHSelf(), WM_LBUTTONUP, 0, 0); + ::PostMessage(_pEditView->getHSelf(), SCI_SETSEL, curPos, curPos); + } + } + + if (!mainActive && !subActive) + { + return; + } + + if (mask & (BufferChangeLanguage)) + { + if (mainActive) + _autoCompleteMain.setLanguage(buffer->getLangType()); + if (subActive) + _autoCompleteSub.setLanguage(buffer->getLangType()); + } + + if ((currentView() == MAIN_VIEW) && !mainActive) + return; + + if ((currentView() == SUB_VIEW) && !subActive) + return; + + if (mask & (BufferChangeDirty|BufferChangeFilename)) + { + checkDocState(); + setTitle(); + TCHAR dir[MAX_PATH]; + lstrcpy(dir, buffer->getFullPathName()); + PathRemoveFileSpec(dir); + setWorkingDir(dir); + } + + if (mask & (BufferChangeLanguage)) + { + checkLangsMenu(-1); //let N++ do search for the item + setLangStatus(buffer->getLangType()); + if (_mainEditView.getCurrentBuffer() == buffer) + _autoCompleteMain.setLanguage(buffer->getLangType()); + else if (_subEditView.getCurrentBuffer() == buffer) + _autoCompleteSub.setLanguage(buffer->getLangType()); + + SCNotification scnN; + scnN.nmhdr.code = NPPN_LANGCHANGED; + scnN.nmhdr.hwndFrom = _hSelf; + scnN.nmhdr.idFrom = (uptr_t)_pEditView->getCurrentBufferID(); + _pluginsManager.notify(&scnN); + } + + if (mask & (BufferChangeFormat|BufferChangeLanguage|BufferChangeUnicode)) + { + updateStatusBar(); + checkUnicodeMenuItems(buffer->getUnicodeMode()); + setUniModeText(buffer->getUnicodeMode()); + setDisplayFormat(buffer->getFormat()); + enableConvertMenuItems(buffer->getFormat()); + } + + if (mask & (BufferChangeReadonly)) + { + checkDocState(); + } +} + +void Notepad_plus::notifyBufferActivated(BufferID bufid, int view) { + Buffer * buf = MainFileManager->getBufferByID(bufid); + buf->increaseRecentTag(); + + if (view == MAIN_VIEW) { + _autoCompleteMain.setLanguage(buf->getLangType()); + } else if (view == SUB_VIEW) { + _autoCompleteSub.setLanguage(buf->getLangType()); + } + + if (view != currentView()) { + return; //dont care if another view did something + } + + checkDocState(); + dynamicCheckMenuAndTB(); + setLangStatus(buf->getLangType()); + updateStatusBar(); + checkUnicodeMenuItems(buf->getUnicodeMode()); + setUniModeText(buf->getUnicodeMode()); + setDisplayFormat(buf->getFormat()); + enableConvertMenuItems(buf->getFormat()); + TCHAR dir[MAX_PATH]; + lstrcpy(dir, buf->getFullPathName()); + PathRemoveFileSpec(dir); + setWorkingDir(dir); + setTitle(); + //Make sure the colors of the tab controls match + ::InvalidateRect(_mainDocTab.getHSelf(), NULL, FALSE); + ::InvalidateRect(_subDocTab.getHSelf(), NULL, FALSE); + + SCNotification scnN; + scnN.nmhdr.code = NPPN_BUFFERACTIVATED; + scnN.nmhdr.hwndFrom = _hSelf; + scnN.nmhdr.idFrom = (uptr_t)bufid; + _pluginsManager.notify(&scnN); + + _linkTriggered = true; +} + +void Notepad_plus::loadCommandlineParams(const TCHAR * commandLine, CmdLineParams * pCmdParams) { + if (!commandLine || ! pCmdParams) + return; + + FileNameStringSplitter fnss(commandLine); + const TCHAR *pFn = NULL; + + LangType lt = pCmdParams->_langType;//LangType(pCopyData->dwData & LASTBYTEMASK); + int ln = pCmdParams->_line2go; + int cn = pCmdParams->_column2go; + + bool readOnly = pCmdParams->_isReadOnly; + + BufferID lastOpened = BUFFER_INVALID; + for (int i = 0 ; i < fnss.size() ; i++) + { + pFn = fnss.getFileName(i); + BufferID bufID = doOpen(pFn, readOnly); + if (bufID == BUFFER_INVALID) //cannot open file + continue; + + lastOpened = bufID; + + if (lt != L_EXTERNAL) + { + Buffer * pBuf = MainFileManager->getBufferByID(bufID); + pBuf->setLangType(lt); + } + + if (ln != -1) + { //we have to move the cursor manually + int iView = currentView(); //store view since fileswitch can cause it to change + switchToFile(bufID); //switch to the file. No deferred loading, but this way we can easily move the cursor to the right position + + if (cn == -1) + _pEditView->execute(SCI_GOTOLINE, ln-1); + else + { + int pos = _pEditView->execute(SCI_FINDCOLUMN, ln-1, cn-1); + _pEditView->execute(SCI_GOTOPOS, pos); + } + switchEditViewTo(iView); //restore view + } + } + if (lastOpened != BUFFER_INVALID) + { + switchToFile(lastOpened); + } +} + +void Notepad_plus::setFindReplaceFolderFilter(const TCHAR *dir, const TCHAR *filter) +{ + generic_string fltr; + NppParameters *pNppParam = NppParameters::getInstance(); + FindHistory & findHistory = pNppParam->getFindHistory(); + + // get current directory in case it's not provided. + if (!dir && findHistory._isFolderFollowDoc) + { + dir = pNppParam->getWorkingDir(); + } + + // get current language file extensions in case it's not provided. + if (!filter && findHistory._isFilterFollowDoc) + { + // Get current language file extensions + const TCHAR *ext = NULL; + LangType lt = _pEditView->getCurrentBuffer()->getLangType(); + + if (lt == L_USER) + { + Buffer * buf = _pEditView->getCurrentBuffer(); + UserLangContainer * userLangContainer = pNppParam->getULCFromName(buf->getUserDefineLangName()); + if (userLangContainer) + ext = userLangContainer->getExtention(); + } + else + { + ext = NppParameters::getInstance()->getLangExtFromLangType(lt); + } + + if (ext && ext[0]) + { + fltr = TEXT(""); + vector vStr; + cutString(ext, vStr); + for (size_t i = 0; i < vStr.size(); i++) + { + fltr += TEXT("*."); + fltr += vStr[i] + TEXT(" "); + } + } + else + { + fltr = TEXT("*.*"); + } + filter = fltr.c_str(); + } + _findReplaceDlg.setFindInFilesDirFilter(dir, filter); +} diff --git a/PowerEditor/src/Notepad_plus.h b/PowerEditor/src/Notepad_plus.h new file mode 100644 index 00000000..4a20d116 --- /dev/null +++ b/PowerEditor/src/Notepad_plus.h @@ -0,0 +1,839 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef NOTEPAD_PLUS_H +#define NOTEPAD_PLUS_H +#include +#include "Window.h" +#include "ScintillaEditView.h" +#include "ToolBar.h" +#include "ImageListSet.h" +#include "DocTabView.h" + +#include "StaticDialog.h" +#include "SplitterContainer.h" +#include "FindReplaceDlg.h" +#include "AboutDlg.h" +#include "RunDlg.h" +#include "UserDefineDialog.h" +#include "StatusBar.h" +#include "Parameters.h" +#include "lastRecentFileList.h" +#include "GoToLineDlg.h" +#include "columnEditor.h" +#include "WordStyleDlg.h" +//#include "constant.h" +#include "trayIconControler.h" +#include "ContextMenu.h" +#include "PluginsManager.h" +#include "Notepad_plus_msgs.h" +#include "preferenceDlg.h" +#include "WindowsDlg.h" +#include "RunMacroDlg.h" +#include "DockingManager.h" +#include "Process.h" +#include "AutoCompletion.h" +#include "Buffer.h" +#include "SmartHighlighter.h" + +#define MENU 0x01 +#define TOOLBAR 0x02 + +enum FileTransferMode { + TransferClone = 0x01, + TransferMove = 0x02 +}; + +enum WindowStatus { //bitwise mask + WindowMainActive = 0x01, + WindowSubActive = 0x02, + WindowBothActive = 0x03, //little helper shortcut + WindowUserActive = 0x04, + WindowMask = 0x07 +}; + +/* +//Plugins rely on #define's +enum Views { + MAIN_VIEW = 0x00, + SUB_VIEW = 0x01 +}; +*/ + +struct TaskListInfo; +static TiXmlNodeA * searchDlgNode(TiXmlNodeA *node, const char *dlgTagName); + +struct iconLocator { + int listIndex; + int iconIndex; + std::generic_string iconLocation; + + iconLocator(int iList, int iIcon, const std::generic_string iconLoc) + : listIndex(iList), iconIndex(iIcon), iconLocation(iconLoc){}; +}; + +struct VisibleGUIConf { + bool isPostIt; + bool isFullScreen; + + //Used by both views + bool isMenuShown; + //bool isToolbarShown; //toolbar forcefully hidden by hiding rebar + DWORD_PTR preStyle; + + //used by postit only + bool isTabbarShown; + bool isAlwaysOnTop; + bool isStatusbarShown; + + //used by fullscreen only + WINDOWPLACEMENT _winPlace; + + VisibleGUIConf() : isPostIt(false), isFullScreen(false), + isAlwaysOnTop(false), isMenuShown(true), isTabbarShown(true), + isStatusbarShown(true), preStyle(WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN) + { + _winPlace.length = 0; + }; +}; + +class FileDialog; + +class Notepad_plus : public Window { + enum comment_mode {cm_comment, cm_uncomment, cm_toggle}; +public: + Notepad_plus(); + virtual inline ~Notepad_plus(); + void init(HINSTANCE, HWND, const TCHAR *cmdLine, CmdLineParams *cmdLineParams); + inline void killAllChildren(); + virtual inline void destroy(); + + static const TCHAR * Notepad_plus::getClassName() { + return _className; + }; + + void setTitle(); + void getTaskListInfo(TaskListInfo *tli); + + // For filtering the modeless Dialog message + inline bool isDlgsMsg(MSG *msg, bool unicodeSupported) const { + for (size_t i = 0; i < _hModelessDlgs.size(); i++) + { + if (unicodeSupported?(::IsDialogMessageW(_hModelessDlgs[i], msg)):(::IsDialogMessageA(_hModelessDlgs[i], msg))) + return true; + } + return false; + }; + +// fileOperations + //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 isReadOnly = false); + bool doReload(BufferID id, bool alert = true); + bool doSave(BufferID, const TCHAR * filename, bool isSaveCopy = false); + void doClose(BufferID, int whichOne); + //bool doDelete(const TCHAR *fileName) const {return ::DeleteFile(fileName) != 0;}; + + inline void fileNew(); + void fileOpen(); + inline bool fileReload(); + bool fileClose(BufferID id = BUFFER_INVALID, int curView = -1); //use curView to override view to close from + bool fileCloseAll(); + bool fileCloseAllButCurrent(); + bool fileSave(BufferID id = BUFFER_INVALID); + bool fileSaveAll(); + bool fileSaveAs(BufferID id = BUFFER_INVALID, bool isSaveCopy = false); + bool fileDelete(BufferID id = BUFFER_INVALID, int curView = -1); + bool fileRename(BufferID id = BUFFER_INVALID, int curView = -1); + + 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); + bool saveScintillaParams(bool whichOne); + + inline bool saveGUIParams(); + + inline void saveDockingParams(); + + inline void saveUserDefineLangs(); + + inline void saveShortcuts(); + + inline void saveSession(const Session & session); + + inline void saveFindHistory(); + + void getCurrentOpenedFiles(Session & session); + + bool fileLoadSession(const TCHAR *fn = NULL); + const TCHAR * fileSaveSession(size_t nbFile, TCHAR ** fileNames, const TCHAR *sessionFile2save); + const TCHAR * fileSaveSession(size_t nbFile = 0, TCHAR ** fileNames = NULL); + + bool changeDlgLang(HWND hDlg, const char *dlgTagName, char *title = NULL); + void changeFindReplaceDlgLang(); + void changeConfigLang(); + void changeUserDefineLang(); + void changeMenuLang(generic_string & pluginsTrans, generic_string & windowTrans); + void changeLangTabContextMenu(); + void changeLangTabDrapContextMenu(); + void changePrefereceDlgLang(); + void changeShortcutLang(); + void changeShortcutmapperLang(ShortcutMapper * sm); + + const TCHAR * getNativeTip(int btnID); + void changeToolBarIcons(); + + bool doBlockComment(comment_mode currCommentMode); + bool doStreamComment(); + inline void doTrimTrailing(); + + inline HACCEL getAccTable() const{ + return _accelerator.getAccTable(); + }; + + bool addCurrentMacro(); + inline void loadLastSession(); + bool loadSession(Session & session); + winVer getWinVersion() const {return _winVersion;}; + + bool emergency(generic_string emergencySavedDir); + + void notifyBufferChanged(Buffer * buffer, int mask); + bool findInFiles(); + bool replaceInFiles(); + void setFindReplaceFolderFilter(const TCHAR *dir, const TCHAR *filters); + + static HWND gNppHWND; //static handle to Notepad++ window, NULL if non-existant +private: + static const TCHAR _className[32]; + TCHAR _nppPath[MAX_PATH]; + Window *_pMainWindow; + DockingManager _dockingManager; + + AutoCompletion _autoCompleteMain; + AutoCompletion _autoCompleteSub; //each Scintilla has its own autoComplete + + SmartHighlighter _smartHighlighter; + + TiXmlNode *_toolIcons; + TiXmlNodeA *_nativeLangA; + + int _nativeLangEncoding; + + DocTabView _mainDocTab; + DocTabView _subDocTab; + DocTabView *_pDocTab; + DocTabView *_pNonDocTab; + + ScintillaEditView _subEditView; + ScintillaEditView _mainEditView; + ScintillaEditView _invisibleEditView; //for searches + ScintillaEditView _fileEditView; //for FileManager + + ScintillaEditView *_pEditView; + ScintillaEditView *_pNonEditView; + + SplitterContainer *_pMainSplitter; + SplitterContainer _subSplitter; + + ContextMenu _tabPopupMenu, _tabPopupDropMenu; + + ToolBar _toolBar; + IconList _docTabIconList; + + StatusBar _statusBar; + bool _toReduceTabBar; + ReBar _rebarTop; + ReBar _rebarBottom; + + // Dialog + FindReplaceDlg _findReplaceDlg; + FindIncrementDlg _incrementFindDlg; + AboutDlg _aboutDlg; + RunDlg _runDlg; + GoToLineDlg _goToLineDlg; + ColumnEditorDlg _colEditorDlg; + WordStyleDlg _configStyleDlg; + PreferenceDlg _preference; + + // a handle list of all the Notepad++ dialogs + vector _hModelessDlgs; + + LastRecentFileList _lastRecentFileList; + + vector _customIconVect; + + WindowsMenu _windowsMenu; + HMENU _mainMenuHandle; + HMENU _menuLang; + HMENU _menuLangCompact; + + bool _sysMenuEntering; + + // For FullScreen/PostIt features + VisibleGUIConf _beforeSpecialView; + void fullScreenToggle(); + void postItToggle(); + + // Keystroke macro recording and playback + Macro _macro; + bool _recordingMacro; + RunMacroDlg _runMacroDlg; + + // For hotspot + bool _linkTriggered; + bool _isDocModifing; + bool _isHotspotDblClicked; + + //For Dynamic selection highlight + CharacterRange _prevSelectedRange; + + struct ActivateAppInfo { + bool _isActivated; + int _x; + int _y; + ActivateAppInfo() : _isActivated(false), _x(0), _y(0){}; + } _activeAppInf; + + //Synchronized Scolling + + struct SyncInfo { + int _line; + int _column; + bool _isSynScollV; + bool _isSynScollH; + SyncInfo():_line(0), _column(0), _isSynScollV(false), _isSynScollH(false){}; + bool doSync() const {return (_isSynScollV || _isSynScollH); }; + } _syncInfo; + + bool _isUDDocked; + + trayIconControler *_pTrayIco; + int _zoomOriginalValue; + + Accelerator _accelerator; + ScintillaAccelerator _scintaccelerator; + + PluginsManager _pluginsManager; + + bool _isRTL; + winVer _winVersion; + + bool _isFileOpening; + + class ScintillaCtrls { + public : + //ScintillaCtrls(); + void init(HINSTANCE hInst, HWND hNpp) { + _hInst = hInst; + _hParent = hNpp; + }; + + HWND createSintilla(HWND hParent) { + _hParent = hParent; + + ScintillaEditView *scint = new ScintillaEditView; + scint->init(_hInst, _hParent); + _scintVector.push_back(scint); + return scint->getHSelf(); + }; + bool destroyScintilla(HWND handle2Destroy) { + for (size_t i = 0 ; i < _scintVector.size() ; i++) + { + if (_scintVector[i]->getHSelf() == handle2Destroy) + { + _scintVector[i]->destroy(); + delete _scintVector[i]; + + vector::iterator it2delete = _scintVector.begin()+ i; + _scintVector.erase(it2delete); + return true; + } + } + return false; + }; + void destroy() { + for (size_t i = 0 ; i < _scintVector.size() ; i++) + { + _scintVector[i]->destroy(); + delete _scintVector[i]; + } + }; + private: + vector _scintVector; + HINSTANCE _hInst; + HWND _hParent; + } _scintillaCtrls4Plugins; + + vector > _hideLinesMarks; + + static LRESULT CALLBACK Notepad_plus_Proc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); + LRESULT runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); + + BOOL notify(SCNotification *notification); + void specialCmd(int id, int param); + void command(int id); + +//Document management + UCHAR _mainWindowStatus; //For 2 views and user dialog if docked + int _activeView; + + //User dialog docking + void dockUserDlg(); + void undockUserDlg(); + + //View visibility + void showView(int whichOne); + bool viewVisible(int whichOne); + void hideView(int whichOne); + void hideCurrentView(); + bool bothActive() { return (_mainWindowStatus & WindowBothActive) == WindowBothActive; }; + bool reloadLang(); + bool loadStyles(); + + int currentView(){ + return _activeView; + }; + int otherView(){ + return (_activeView == MAIN_VIEW?SUB_VIEW:MAIN_VIEW); + }; + int otherFromView(int whichOne){ + return (whichOne == MAIN_VIEW?SUB_VIEW:MAIN_VIEW); + }; + bool canHideView(int whichOne); //true if view can safely be hidden (no open docs etc) + + int switchEditViewTo(int gid); //activate other view (set focus etc) + + void docGotoAnotherEditView(FileTransferMode mode); //TransferMode + void docOpenInNewInstance(FileTransferMode mode, int x = 0, int y = 0); + + void loadBufferIntoView(BufferID id, int whichOne, bool dontClose = false); //Doesnt _activate_ the buffer + void removeBufferFromView(BufferID id, int whichOne); //Activates alternative of possible, or creates clean document if not clean already + + bool activateBuffer(BufferID id, int whichOne); //activate buffer in that view if found + void notifyBufferActivated(BufferID bufid, int view); + void performPostReload(int whichOne); +//END: Document management + + int doSaveOrNot(const TCHAR *fn) { + TCHAR pattern[64] = TEXT("Save file \"%s\" ?"); + TCHAR phrase[512]; + wsprintf(phrase, pattern, fn); + return doActionOrNot(TEXT("Save"), phrase, MB_YESNOCANCEL | MB_ICONQUESTION | MB_APPLMODAL); + }; + + int doReloadOrNot(const TCHAR *fn, bool dirty) { + TCHAR* pattern = TEXT("%s\r\rThis file has been modified by another program.\rDo you want to reload it%s?"); + TCHAR* lose_info_str = dirty ? TEXT(" and lose the changes made in Notepad++") : TEXT(""); + TCHAR phrase[512]; + wsprintf(phrase, pattern, fn, lose_info_str); + int icon = dirty ? MB_ICONEXCLAMATION : MB_ICONQUESTION; + return doActionOrNot(TEXT("Reload"), phrase, MB_YESNO | MB_APPLMODAL | icon); + }; + + int doCloseOrNot(const TCHAR *fn) { + TCHAR pattern[128] = TEXT("The file \"%s\" doesn't exist anymore.\rKeep this file in editor?"); + TCHAR phrase[512]; + wsprintf(phrase, pattern, fn); + return doActionOrNot(TEXT("Keep non existing file"), phrase, MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL); + }; + + int doDeleteOrNot(const TCHAR *fn) { + TCHAR pattern[128] = TEXT("The file \"%s\"\rwill be deleted from your disk and this document will be closed.\rContinue?"); + TCHAR phrase[512]; + wsprintf(phrase, pattern, fn); + return doActionOrNot(TEXT("Delete file"), phrase, MB_YESNO | MB_ICONQUESTION | MB_APPLMODAL); + }; + + int doActionOrNot(const TCHAR *title, const TCHAR *displayText, int type) { + return ::MessageBox(_hSelf, displayText, title, type); + }; + void enableMenu(int cmdID, bool doEnable) const { + int flag = doEnable?MF_ENABLED | MF_BYCOMMAND:MF_DISABLED | MF_GRAYED | MF_BYCOMMAND; + ::EnableMenuItem(_mainMenuHandle, cmdID, flag); + } + void enableCommand(int cmdID, bool doEnable, int which) const; + void checkClipboard(); + void checkDocState(); + void checkUndoState(); + void checkMacroState(); + void checkSyncState(); + void dropFiles(HDROP hdrop); + void checkModifiedDocument(); + + void getMainClientRect(RECT & rc) const; + + void dynamicCheckMenuAndTB() const; + + void enableConvertMenuItems(formatType f) 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); + }; + + void checkUnicodeMenuItems(UniMode um) const; + + generic_string getLangDesc(LangType langType, bool shortDesc = false); + + void setLangStatus(LangType langType){ + _statusBar.setText(getLangDesc(langType).c_str(), STATUSBAR_DOC_TYPE); + }; + + void setDisplayFormat(formatType f) { + std::generic_string str; + switch (f) + { + case MAC_FORMAT : + str = TEXT("MAC"); + break; + case UNIX_FORMAT : + str = TEXT("UNIX"); + break; + default : + str = TEXT("Dos\\Windows"); + } + _statusBar.setText(str.c_str(), STATUSBAR_EOF_FORMAT); + }; + + void setUniModeText(UniMode um) + { + TCHAR *uniModeText; + switch (um) + { + case uniUTF8: + uniModeText = TEXT("UTF-8"); break; + case uni16BE: + uniModeText = TEXT("UCS-2 Big Endian"); break; + case uni16LE: + uniModeText = TEXT("UCS-2 little Endian"); break; + case uniCookie: + uniModeText = TEXT("ANSI as UTF-8"); break; + default : + uniModeText = TEXT("ANSI"); + } + _statusBar.setText(uniModeText, STATUSBAR_UNICODE_TYPE); + }; + + void checkLangsMenu(int id) const ; + + void setLanguage(int id, LangType langType); + + enum LangType menuID2LangType(int cmdID); + + int getFolderMarginStyle() const { + if (::GetMenuState(_mainMenuHandle, IDM_VIEW_FOLDERMAGIN_SIMPLE, MF_BYCOMMAND) == MF_CHECKED) + return IDM_VIEW_FOLDERMAGIN_SIMPLE; + + if (::GetMenuState(_mainMenuHandle, IDM_VIEW_FOLDERMAGIN_ARROW, MF_BYCOMMAND) == MF_CHECKED) + return IDM_VIEW_FOLDERMAGIN_ARROW; + + if (::GetMenuState(_mainMenuHandle, IDM_VIEW_FOLDERMAGIN_CIRCLE, MF_BYCOMMAND) == MF_CHECKED) + return IDM_VIEW_FOLDERMAGIN_CIRCLE; + + if (::GetMenuState(_mainMenuHandle, IDM_VIEW_FOLDERMAGIN_BOX, MF_BYCOMMAND) == MF_CHECKED) + return IDM_VIEW_FOLDERMAGIN_BOX; + + return 0; + }; + + void checkFolderMarginStyleMenu(int id2Check) const { + ::CheckMenuRadioItem(_mainMenuHandle, IDM_VIEW_FOLDERMAGIN_SIMPLE, IDM_VIEW_FOLDERMAGIN_BOX, id2Check, MF_BYCOMMAND); + }; + + int getFolderMaginStyleIDFrom(folderStyle fStyle) const { + switch (fStyle) + { + case FOLDER_STYLE_SIMPLE : return IDM_VIEW_FOLDERMAGIN_SIMPLE; + case FOLDER_STYLE_ARROW : return IDM_VIEW_FOLDERMAGIN_ARROW; + case FOLDER_STYLE_CIRCLE : return IDM_VIEW_FOLDERMAGIN_CIRCLE; + case FOLDER_STYLE_BOX : return IDM_VIEW_FOLDERMAGIN_BOX; + default : return FOLDER_TYPE; + } + //return + }; + + void checkMenuItem(int itemID, bool willBeChecked) const { + ::CheckMenuItem(_mainMenuHandle, itemID, MF_BYCOMMAND | (willBeChecked?MF_CHECKED:MF_UNCHECKED)); + }; + void charAdded(TCHAR chAdded); + void MaintainIndentation(TCHAR ch); + + void addHotSpot(bool docIsModifing = false); + + void bookmarkAdd(int lineno) const { + if (lineno == -1) + lineno = _pEditView->getCurrentLineNumber(); + if (!bookmarkPresent(lineno)) + _pEditView->execute(SCI_MARKERADD, lineno, MARK_BOOKMARK); + }; + void bookmarkDelete(int lineno) const { + if (lineno == -1) + lineno = _pEditView->getCurrentLineNumber(); + if ( bookmarkPresent(lineno)) + _pEditView->execute(SCI_MARKERDELETE, lineno, MARK_BOOKMARK); + }; + bool bookmarkPresent(int lineno) const { + if (lineno == -1) + lineno = _pEditView->getCurrentLineNumber(); + LRESULT state = _pEditView->execute(SCI_MARKERGET, lineno); + return ((state & (1 << MARK_BOOKMARK)) != 0); + }; + void bookmarkToggle(int lineno) const { + if (lineno == -1) + lineno = _pEditView->getCurrentLineNumber(); + + if (bookmarkPresent(lineno)) + bookmarkDelete(lineno); + else + bookmarkAdd(lineno); + }; + void bookmarkNext(bool forwardScan); + void bookmarkClearAll() const { + _pEditView->execute(SCI_MARKERDELETEALL, MARK_BOOKMARK); + }; + + + void copyMarkedLines() { + int lastLine = _pEditView->lastZeroBasedLineNumber(); + generic_string globalStr = TEXT(""); + for (int i = lastLine ; i >= 0 ; i--) + { + if (bookmarkPresent(i)) + { + generic_string currentStr = getMarkedLine(i) + globalStr; + globalStr = currentStr; + } + } + str2Cliboard(globalStr.c_str()); + }; + + void cutMarkedLines() { + int lastLine = _pEditView->lastZeroBasedLineNumber(); + generic_string globalStr = TEXT(""); + + _pEditView->execute(SCI_BEGINUNDOACTION); + for (int i = lastLine ; i >= 0 ; i--) + { + if (bookmarkPresent(i)) + { + generic_string currentStr = getMarkedLine(i) + globalStr; + globalStr = currentStr; + + deleteMarkedline(i); + } + } + _pEditView->execute(SCI_ENDUNDOACTION); + str2Cliboard(globalStr.c_str()); + }; + + void deleteMarkedLines() { + int lastLine = _pEditView->lastZeroBasedLineNumber(); + + _pEditView->execute(SCI_BEGINUNDOACTION); + for (int i = lastLine ; i >= 0 ; i--) + { + if (bookmarkPresent(i)) + deleteMarkedline(i); + } + _pEditView->execute(SCI_ENDUNDOACTION); + }; + + void pasteToMarkedLines() { + int clipFormat; + #ifdef UNICODE + clipFormat = CF_UNICODETEXT; + #else + clipFormat = CF_TEXT; + #endif + BOOL canPaste = ::IsClipboardFormatAvailable(clipFormat); + if (!canPaste) + return; + int lastLine = _pEditView->lastZeroBasedLineNumber(); + + ::OpenClipboard(_hSelf); + HANDLE clipboardData = ::GetClipboardData(clipFormat); + int len = ::GlobalSize(clipboardData); + LPVOID clipboardDataPtr = ::GlobalLock(clipboardData); + + generic_string clipboardStr = (const TCHAR *)clipboardDataPtr; + + ::GlobalUnlock(clipboardData); + ::CloseClipboard(); + + _pEditView->execute(SCI_BEGINUNDOACTION); + for (int i = lastLine ; i >= 0 ; i--) + { + if (bookmarkPresent(i)) + { + replaceMarkedline(i, clipboardStr.c_str()); + } + } + _pEditView->execute(SCI_ENDUNDOACTION); + }; + + void deleteMarkedline(int ln) { + int lineLen = _pEditView->execute(SCI_LINELENGTH, ln); + int lineBegin = _pEditView->execute(SCI_POSITIONFROMLINE, ln); + + bookmarkDelete(ln); + TCHAR emptyString[2] = TEXT(""); + _pEditView->replaceTarget(emptyString, lineBegin, lineBegin + lineLen); + }; + + void replaceMarkedline(int ln, const TCHAR *str) { + int lineBegin = _pEditView->execute(SCI_POSITIONFROMLINE, ln); + int lineEnd = _pEditView->execute(SCI_GETLINEENDPOSITION, ln); + + _pEditView->replaceTarget(str, lineBegin, lineEnd); + }; + + generic_string getMarkedLine(int ln) { + int lineLen = _pEditView->execute(SCI_LINELENGTH, ln); + int lineBegin = _pEditView->execute(SCI_POSITIONFROMLINE, ln); + + TCHAR * buf = new TCHAR[lineLen+1]; + _pEditView->getGenericText(buf, lineBegin, lineBegin + lineLen); + generic_string line = buf; + delete [] buf; + + return line; + }; + + void findMatchingBracePos(int & braceAtCaret, int & braceOpposite); + void braceMatch(); + + void activateNextDoc(bool direction); + void activateDoc(int pos); + + void updateStatusBar(); + + void showAutoComp(); + void autoCompFromCurrentFile(bool autoInsert = true); + void showFunctionComp(); + + void changeStyleCtrlsLang(HWND hDlg, int *idArray, const char **translatedText); + bool replaceAllFiles(); + bool findInOpenedFiles(); + bool findInCurrentFile(); + + bool matchInList(const TCHAR *fileName, const vector & patterns); + void getMatchedFileNames(const TCHAR *dir, const vector & patterns, vector & fileNames, bool isRecursive, bool isInHiddenDir); + + void doSynScorll(HWND hW); + void setWorkingDir(TCHAR *dir) { + NppParameters * params = NppParameters::getInstance(); + if (params->getNppGUI()._openSaveDir == dir_last) + return; + if (params->getNppGUI()._openSaveDir == dir_userDef) + { + params->setWorkingDir(NULL); + } + else if (dir && PathIsDirectory(dir)) + { + params->setWorkingDir(dir); + } + } + bool str2Cliboard(const TCHAR *str2cpy); + bool bin2Cliboard(const UCHAR *uchar2cpy, size_t length); + + bool getIntegralDockingData(tTbData & dockData, int & iCont, bool & isVisible); + + int getLangFromMenuName(const TCHAR * langName) { + int id = 0; + const int menuSize = 64; + TCHAR menuLangName[menuSize]; + + for ( int i = IDM_LANG_C; i <= IDM_LANG_USER; i++ ) + if ( ::GetMenuString( _mainMenuHandle, i, menuLangName, menuSize, MF_BYCOMMAND ) ) + if ( !lstrcmp( langName, menuLangName ) ) + { + id = i; + break; + } + + if ( id == 0 ) + { + for ( int i = IDM_LANG_USER + 1; i <= IDM_LANG_USER_LIMIT; i++ ) + if ( ::GetMenuString( _mainMenuHandle, i, menuLangName, menuSize, MF_BYCOMMAND ) ) + if ( !lstrcmp( langName, menuLangName ) ) + { + id = i; + break; + } + } + + return id; + }; + + generic_string getLangFromMenu(const Buffer * buf) { + int id; + const TCHAR * userLangName; + TCHAR menuLangName[32]; + + id = (NppParameters::getInstance())->langTypeToCommandID( buf->getLangType() ); + + if ( ( id != IDM_LANG_USER ) || !( buf->isUserDefineLangExt() ) ) + { + ( ::GetMenuString( _mainMenuHandle, id, menuLangName, sizeof( menuLangName ), MF_BYCOMMAND ) ); + userLangName = (TCHAR *)menuLangName; + } + else + { + userLangName = buf->getUserDefineLangName(); + } + return userLangName; + }; + + void setFileOpenSaveDlgFilters(FileDialog & fDlg); + void markSelectedTextInc(bool enable); + + Style * getStyleFromName(const TCHAR *styleName) { + StyleArray & stylers = (NppParameters::getInstance())->getMiscStylerArray(); + + int i = stylers.getStylerIndexByName(styleName); + Style * st = NULL; + if (i != -1) + { + Style & style = stylers.getStyler(i); + st = &style; + } + return st; + }; + + bool dumpFiles(const TCHAR * outdir, const TCHAR * fileprefix = TEXT("")); //helper func + void drawTabbarColoursFromStylerArray(); + + void loadCommandlineParams(const TCHAR * commandLine, CmdLineParams * pCmdParams); + + bool noOpenedDoc() const { + if (_mainDocTab.isVisible() && _subDocTab.isVisible()) + return false; + if (_pDocTab->nbItem() == 1) + { + BufferID buffer = _pDocTab->getBufferByIndex(0); + Buffer * buf = MainFileManager->getBufferByID(buffer); + if (!buf->isDirty() && buf->isUntitled()) + return true; + } + return false; + }; +}; + +#endif //NOTEPAD_PLUS_H diff --git a/PowerEditor/src/Notepad_plus.rc b/PowerEditor/src/Notepad_plus.rc new file mode 100644 index 00000000..0dca6778 --- /dev/null +++ b/PowerEditor/src/Notepad_plus.rc @@ -0,0 +1,622 @@ + /* +this file is part of notepad++ +Copyright (C)2003 Don HO ( donho@altern.org ) + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#include +#include "resource.h" +#include "menuCmdID.h" + +VS_VERSION_INFO VERSIONINFO +FILEVERSION VERSION_DIGITALVALUE +PRODUCTVERSION VERSION_DIGITALVALUE +FILEFLAGSMASK 0x3fL +FILEFLAGS 0 +FILEOS VOS_NT_WINDOWS32 +FILETYPE VFT_APP +FILESUBTYPE VFT2_UNKNOWN +BEGIN + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "CompanyName", "Don HO don.h@free.fr\0" + VALUE "FileDescription", "Notepad++ : a free (GNU) source code editor\0" + VALUE "FileVersion", VERSION_VALUE + VALUE "InternalName", "npp.exe\0" + VALUE "LegalCopyright", "Copyleft 1998-2006 by Don HO\0" + VALUE "OriginalFilename", "Notepad++.exe\0" + VALUE "ProductName", "Notepad++\0" + VALUE "ProductVersion", VERSION_VALUE + END + END +END + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_M30ICON ICON "icons\\npp.ico" +IDI_NEW_OFF_ICON ICON "icons\\new_off.ico" +IDI_OPEN_OFF_ICON ICON "icons\\open_off.ico" +IDI_SAVE_OFF_ICON ICON "icons\\save_off.ico" +IDI_SAVEALL_OFF_ICON ICON "icons\\saveall_off.ico" +IDI_CLOSE_OFF_ICON ICON "icons\\supp_off.ico" +IDI_CLOSEALL_OFF_ICON ICON "icons\\suppall_off.ico" +IDI_CUT_OFF_ICON ICON "icons\\cut_off.ico" +IDI_COPY_OFF_ICON ICON "icons\\dupli_off.ico" +IDI_PASTE_OFF_ICON ICON "icons\\paste_off.ico" +IDI_UNDO_OFF_ICON ICON "icons\\undo_off.ico" +IDI_REDO_OFF_ICON ICON "icons\\redo_off.ico" +IDI_FIND_OFF_ICON ICON "icons\\find_off.ico" +IDI_REPLACE_OFF_ICON ICON "icons\\findrep_off.ico" +IDI_ZOOMIN_OFF_ICON ICON "icons\\zoomIn_off.ico" +IDI_ZOOMOUT_OFF_ICON ICON "icons\\zoomOut_off.ico" +IDI_VIEW_UD_DLG_OFF_ICON ICON "icons\\userDefineDlg_off.ico" +IDI_VIEW_ALL_CHAR_OFF_ICON ICON "icons\\allChars_off.ico" +IDI_VIEW_INDENT_OFF_ICON ICON "icons\\indentGuide_off.ico" +IDI_VIEW_WRAP_OFF_ICON ICON "icons\\wrap_off.ico" +IDI_PRINT_OFF_ICON ICON "icons\\imprim_off.ico" + +IDI_NEW_ON_ICON ICON "icons\\new_on.ico" +IDI_OPEN_ON_ICON ICON "icons\\open_on.ico" +IDI_SAVE_ON_ICON ICON "icons\\save_on.ico" +IDI_SAVEALL_ON_ICON ICON "icons\\saveall_on.ico" +IDI_CLOSE_ON_ICON ICON "icons\\supp_on.ico" +IDI_CLOSEALL_ON_ICON ICON "icons\\suppall_on.ico" +IDI_CUT_ON_ICON ICON "icons\\cut_on.ico" +IDI_COPY_ON_ICON ICON "icons\\dupli_on.ico" +IDI_PASTE_ON_ICON ICON "icons\\paste_on.ico" +IDI_UNDO_ON_ICON ICON "icons\\undo_on.ico" +IDI_REDO_ON_ICON ICON "icons\\redo_on.ico" +IDI_FIND_ON_ICON ICON "icons\\find_on.ico" +IDI_REPLACE_ON_ICON ICON "icons\\findrep_on.ico" +IDI_ZOOMIN_ON_ICON ICON "icons\\zoomIn_on.ico" +IDI_ZOOMOUT_ON_ICON ICON "icons\\zoomOut_on.ico" +IDI_VIEW_UD_DLG_ON_ICON ICON "icons\\userDefineDlg_on.ico" +IDI_VIEW_ALL_CHAR_ON_ICON ICON "icons\\allChars_on.ico" +IDI_VIEW_INDENT_ON_ICON ICON "icons\\indentGuide_on.ico" +IDI_VIEW_WRAP_ON_ICON ICON "icons\\wrap_on.ico" +IDI_PRINT_ON_ICON ICON "icons\\imprim_on.ico" + +IDI_SAVE_DISABLE_ICON ICON "icons\\save_dis.ico" +IDI_SAVEALL_DISABLE_ICON ICON "icons\\saveall_dis.ico" +IDI_CUT_DISABLE_ICON ICON "icons\\cut_dis.ico" +IDI_COPY_DISABLE_ICON ICON "icons\\dupli_dis.ico" +IDI_PASTE_DISABLE_ICON ICON "icons\\paste_dis.ico" +IDI_UNDO_DISABLE_ICON ICON "icons\\undo_dis.ico" +IDI_REDO_DISABLE_ICON ICON "icons\\redo_dis.ico" +// +IDI_SAVED_ICON ICON "icons\\saved.ico" +IDI_UNSAVED_ICON ICON "icons\\unsaved.ico" +IDI_READONLY_ICON ICON "icons\\readonly.ico" +IDI_DELETE_ICON ICON "icons\\delete.ico" + +IDI_FIND_RESULT_ICON ICON "icons\\findResult.ico" + +IDC_DRAG_TAB CURSOR "cursors\\drag.cur" +IDC_DRAG_INTERDIT_TAB CURSOR "cursors\\drag_interdit.cur" +IDC_DRAG_PLUS_TAB CURSOR "cursors\\drag_plus.cur" +IDC_DRAG_OUT_TAB CURSOR "cursors\\drag_out.cur" + +IDR_FILENEW BITMAP "icons\\newFile.bmp" +IDR_FILEOPEN BITMAP "icons\\openFile.bmp" +IDR_FILESAVE BITMAP "icons\\saveFile.bmp" +IDR_SAVEALL BITMAP "icons\\saveAll.bmp" +IDR_CLOSEFILE BITMAP "icons\\closeFile.bmp" +IDR_CLOSEALL BITMAP "icons\\closeAll.bmp" +IDR_FIND BITMAP "icons\\find.bmp" +IDR_REPLACE BITMAP "icons\\findReplace.bmp" +IDR_ZOOMIN BITMAP "icons\\zoomIn.bmp" +IDR_ZOOMOUT BITMAP "icons\\zoomOut.bmp" +IDR_WRAP BITMAP "icons\\wrap.bmp" +IDR_INVISIBLECHAR BITMAP "icons\\invisibleChar.bmp" +IDR_INDENTGUIDE BITMAP "icons\\indentGuide.bmp" +IDR_SHOWPANNEL BITMAP "icons\\showPannel.bmp" +IDR_STARTRECORD BITMAP "icons\\startRecord.bmp" +IDR_STOPRECORD BITMAP "icons\\stopRecord.bmp" +IDR_PLAYRECORD BITMAP "icons\\playRecord.bmp" +IDR_M_PLAYRECORD BITMAP "icons\\playRecord_m.bmp" +IDR_SAVERECORD BITMAP "icons\\saveRecord.bmp" +IDR_CUT BITMAP "icons\\cut.bmp" +IDR_COPY BITMAP "icons\\copy.bmp" +IDR_PASTE BITMAP "icons\\paste.bmp" +IDR_UNDO BITMAP "icons\\undo.bmp" +IDR_REDO BITMAP "icons\\redo.bmp" + +IDR_SYNCV BITMAP "icons\\syncV.bmp" +IDR_SYNCH BITMAP "icons\\syncH.bmp" +IDR_PRINT BITMAP "icons\\print.bmp" +IDR_CLOSETAB BITMAP "icons\\closeTabButton.bmp" +IDR_CLOSETAB_INACT BITMAP "icons\\closeTabButton_inact.bmp" +IDR_CLOSETAB_HOVER BITMAP "icons\\closeTabButton_hover.bmp" +IDR_CLOSETAB_PUSH BITMAP "icons\\closeTabButton_push.bmp" + +IDI_STARTRECORD_OFF_ICON ICON "icons\\startrecord_off.ico" +IDI_STARTRECORD_ON_ICON ICON "icons\\startrecord_on.ico" +IDI_STARTRECORD_DISABLE_ICON ICON "icons\\startrecord_dis.ico" +IDI_STOPRECORD_OFF_ICON ICON "icons\\stoprecord_off.ico" +IDI_STOPRECORD_ON_ICON ICON "icons\\stoprecord_on.ico" +IDI_STOPRECORD_DISABLE_ICON ICON "icons\\stoprecord_dis.ico" +IDI_PLAYRECORD_OFF_ICON ICON "icons\\playrecord_off.ico" +IDI_PLAYRECORD_ON_ICON ICON "icons\\playrecord_on.ico" +IDI_PLAYRECORD_DISABLE_ICON ICON "icons\\playrecord_dis.ico" +IDI_SAVERECORD_OFF_ICON ICON "icons\\saverecord_off.ico" +IDI_SAVERECORD_ON_ICON ICON "icons\\saverecord_on.ico" +IDI_SAVERECORD_DISABLE_ICON ICON "icons\\saverecord_dis.ico" + +IDI_SYNCV_OFF_ICON ICON "icons\\syncV_off.ico" +IDI_SYNCV_ON_ICON ICON "icons\\syncV_on.ico" +IDI_SYNCV_DISABLE_ICON ICON "icons\\syncV_dis.ico" +IDI_SYNCH_OFF_ICON ICON "icons\\syncH_off.ico" +IDI_SYNCH_ON_ICON ICON "icons\\syncH_on.ico" +IDI_SYNCH_DISABLE_ICON ICON "icons\\syncH_dis.ico" + +// multi run macro +IDI_MMPLAY_DIS_ICON ICON "icons\\playrecord_m_dis.ico" +IDI_MMPLAY_OFF_ICON ICON "icons\\playrecord_m_off.ico" +IDI_MMPLAY_ON_ICON ICON "icons\\playrecord_m_on.ico" + +IDR_M30_MENU MENU +BEGIN + POPUP "&File" + BEGIN + MENUITEM "&New", IDM_FILE_NEW + MENUITEM "&Open...", IDM_FILE_OPEN + MENUITEM "Re&load from Disk", IDM_FILE_RELOAD + MENUITEM "&Save", IDM_FILE_SAVE + MENUITEM "Save &As...", IDM_FILE_SAVEAS + MENUITEM "Save a Copy As...", IDM_FILE_SAVECOPYAS + MENUITEM "Sav&e All", IDM_FILE_SAVEALL + MENUITEM "Rename...", IDM_FILE_RENAME + MENUITEM "&Close", IDM_FILE_CLOSE + MENUITEM "Cl&ose All", IDM_FILE_CLOSEALL + MENUITEM "Close All but Active Document", IDM_FILE_CLOSEALL_BUT_CURRENT + MENUITEM "Delete from Disk", IDM_FILE_DELETE + MENUITEM SEPARATOR + MENUITEM "Load Session...", IDM_FILE_LOADSESSION + MENUITEM "Save Session...", IDM_FILE_SAVESESSION + MENUITEM SEPARATOR + MENUITEM "Print...", IDM_FILE_PRINT + MENUITEM "Print Now!", IDM_FILE_PRINTNOW + MENUITEM SEPARATOR + MENUITEM "E&xit", IDM_FILE_EXIT + END + + POPUP "&Edit" + BEGIN + MENUITEM "&Undo", IDM_EDIT_UNDO + MENUITEM "&Redo", IDM_EDIT_REDO + MENUITEM SEPARATOR + MENUITEM "Cu&t", IDM_EDIT_CUT + MENUITEM "&Copy", IDM_EDIT_COPY + MENUITEM "&Paste", IDM_EDIT_PASTE + MENUITEM "Select A&ll", IDM_EDIT_SELECTALL + MENUITEM SEPARATOR + POPUP "Copy to clipboard" + BEGIN + MENUITEM "Current full file path to Clipboard", IDM_EDIT_FULLPATHTOCLIP + MENUITEM "Current file name to Clipboard", IDM_EDIT_FILENAMETOCLIP + MENUITEM "Current dir path to Clipboard", IDM_EDIT_CURRENTDIRTOCLIP + END + POPUP "Indent" + BEGIN + MENUITEM "Increase Line Indent", IDM_EDIT_INS_TAB + MENUITEM "Decrease Line Indent", IDM_EDIT_RMV_TAB + END + POPUP "Convert case" + BEGIN + MENUITEM "to &UPPERCASE", IDM_EDIT_UPPERCASE + MENUITEM "to &lowercase", IDM_EDIT_LOWERCASE + END + POPUP "Line operations" + BEGIN + MENUITEM "Duplicate current line", IDM_EDIT_DUP_LINE + MENUITEM "Split lines", IDM_EDIT_SPLIT_LINES + MENUITEM "Join lines", IDM_EDIT_JOIN_LINES + MENUITEM "Move Up current line", IDM_EDIT_LINE_UP + MENUITEM "Move Down current line", IDM_EDIT_LINE_DOWN + END + POPUP "Comment/Uncomment" + BEGIN + MENUITEM "Toggle block comment", IDM_EDIT_BLOCK_COMMENT + MENUITEM "Block comment", IDM_EDIT_BLOCK_COMMENT_SET + MENUITEM "Block uncomment", IDM_EDIT_BLOCK_UNCOMMENT + MENUITEM "Stream comment", IDM_EDIT_STREAM_COMMENT + END + POPUP "Auto-completion" + BEGIN + MENUITEM "Function completion", IDM_EDIT_AUTOCOMPLETE + MENUITEM "Word completion", IDM_EDIT_AUTOCOMPLETE_CURRENTFILE + MENUITEM "Function parameters hint", IDM_EDIT_FUNCCALLTIP + END + MENUITEM "Trim Trailing Space", IDM_EDIT_TRIMTRAILING + MENUITEM SEPARATOR + MENUITEM "Column Editor...", IDM_EDIT_COLUMNMODE + MENUITEM SEPARATOR + MENUITEM "Set Read Only", IDM_EDIT_SETREADONLY + MENUITEM "Clear Read Only Flag", IDM_EDIT_CLEARREADONLY + //MENUITEM SEPARATOR + END + + POPUP "&Search" + BEGIN + MENUITEM "&Find...", IDM_SEARCH_FIND + MENUITEM "Find in files...", IDM_SEARCH_FINDINFILES + MENUITEM "Find &Next", IDM_SEARCH_FINDNEXT + MENUITEM "Find &Previous", IDM_SEARCH_FINDPREV + MENUITEM "Find (volatile) Next", IDM_SEARCH_VOLATILE_FINDNEXT + MENUITEM "Find (volatile) Previous", IDM_SEARCH_VOLATILE_FINDPREV + MENUITEM "&Replace...", IDM_SEARCH_REPLACE + MENUITEM "&Incremental Search...", IDM_SEARCH_FINDINCREMENT + MENUITEM "&Go to...", IDM_SEARCH_GOTOLINE + MENUITEM "Go to matching brace", IDM_SEARCH_GOTOMATCHINGBRACE + MENUITEM SEPARATOR + + POPUP "Mark all" + BEGIN + MENUITEM "Using 1st style", IDM_SEARCH_MARKALLEXT1 + MENUITEM "Using 2nd style", IDM_SEARCH_MARKALLEXT2 + MENUITEM "Using 3rd style", IDM_SEARCH_MARKALLEXT3 + MENUITEM "Using 4th style", IDM_SEARCH_MARKALLEXT4 + MENUITEM "Using 5th style", IDM_SEARCH_MARKALLEXT5 + END + POPUP "Unmark all" + BEGIN + MENUITEM "Clear 1st style", IDM_SEARCH_UNMARKALLEXT1 + MENUITEM "Clear 2nd style", IDM_SEARCH_UNMARKALLEXT2 + MENUITEM "Clear 3rd style", IDM_SEARCH_UNMARKALLEXT3 + MENUITEM "Clear 4th style", IDM_SEARCH_UNMARKALLEXT4 + MENUITEM "Clear 5th style", IDM_SEARCH_UNMARKALLEXT5 + MENUITEM "Clear all styles", IDM_SEARCH_CLEARALLMARKS + END + + + MENUITEM SEPARATOR + MENUITEM "Toggle Bookmark" , IDM_SEARCH_TOGGLE_BOOKMARK + MENUITEM "Next Bookmark", IDM_SEARCH_NEXT_BOOKMARK + MENUITEM "Previous Bookmark", IDM_SEARCH_PREV_BOOKMARK + MENUITEM "Clear all Bookmarks", IDM_SEARCH_CLEAR_BOOKMARKS + MENUITEM "Cut bookmarked lines", IDM_SEARCH_CUTMARKEDLINES + MENUITEM "Copy bookmarked lines", IDM_SEARCH_COPYMARKEDLINES + MENUITEM "Paste to (Replace) bookmarked lines", IDM_SEARCH_PASTEMARKEDLINES + MENUITEM "Delete bookmarked lines", IDM_SEARCH_DELETEMARKEDLINES + END + + POPUP "&View" + BEGIN + MENUITEM "Always on top", IDM_VIEW_ALWAYSONTOP + MENUITEM "Toggle Full Screen Mode", IDM_VIEW_FULLSCREENTOGGLE + MENUITEM "Post-it", IDM_VIEW_POSTIT + + MENUITEM SEPARATOR + POPUP "Show Symbol" + BEGIN + MENUITEM "Show White Space and TAB", IDM_VIEW_TAB_SPACE + MENUITEM "Show End Of Line", IDM_VIEW_EOL + MENUITEM "Show all characters", IDM_VIEW_ALL_CHARACTERS + MENUITEM SEPARATOR + MENUITEM "Show Indent guide", IDM_VIEW_INDENT_GUIDE + MENUITEM "Show wrap symbol", IDM_VIEW_WRAP_SYMBOL + END + POPUP "Zoom" + BEGIN + MENUITEM "Zoom &in", IDM_VIEW_ZOOMIN + MENUITEM "Zoom &out", IDM_VIEW_ZOOMOUT + MENUITEM "Restore default zoom", IDM_VIEW_ZOOMRESTORE + END + POPUP "Move/Clone current document" + BEGIN + MENUITEM "Move to other view", IDM_VIEW_GOTO_ANOTHER_VIEW + MENUITEM "Clone to other view", IDM_VIEW_CLONE_TO_ANOTHER_VIEW + MENUITEM "Move to new instance", IDM_VIEW_GOTO_NEW_INSTANCE + MENUITEM "Open in new instance", IDM_VIEW_LOAD_IN_NEW_INSTANCE + END + MENUITEM "Word wrap", IDM_VIEW_WRAP + MENUITEM "Focus on other view", IDM_VIEW_SWITCHTO_OTHER_VIEW + MENUITEM "Hide lines", IDM_VIEW_HIDELINES + MENUITEM "User Define Dialog...", IDM_VIEW_USER_DLG + MENUITEM SEPARATOR + MENUITEM "Fold all", IDM_VIEW_TOGGLE_FOLDALL + MENUITEM "Unfold all", IDM_VIEW_TOGGLE_UNFOLDALL + MENUITEM "Collapse current level", IDM_VIEW_FOLD_CURRENT + MENUITEM "Uncollapse current level", IDM_VIEW_UNFOLD_CURRENT + POPUP "Collapse level" + BEGIN + MENUITEM "1" , IDM_VIEW_FOLD_1 + MENUITEM "2", IDM_VIEW_FOLD_2 + MENUITEM "3", IDM_VIEW_FOLD_3 + MENUITEM "4", IDM_VIEW_FOLD_4 + MENUITEM "5" , IDM_VIEW_FOLD_5 + MENUITEM "6", IDM_VIEW_FOLD_6 + MENUITEM "7", IDM_VIEW_FOLD_7 + MENUITEM "8", IDM_VIEW_FOLD_8 + END + POPUP "Uncollapse level" + BEGIN + MENUITEM "1" , IDM_VIEW_UNFOLD_1 + MENUITEM "2", IDM_VIEW_UNFOLD_2 + MENUITEM "3", IDM_VIEW_UNFOLD_3 + MENUITEM "4", IDM_VIEW_UNFOLD_4 + MENUITEM "5" , IDM_VIEW_UNFOLD_5 + MENUITEM "6", IDM_VIEW_UNFOLD_6 + MENUITEM "7", IDM_VIEW_UNFOLD_7 + MENUITEM "8", IDM_VIEW_UNFOLD_8 + END + + MENUITEM SEPARATOR + MENUITEM "Synchronize Vertical Scrolling", IDM_VIEW_SYNSCROLLV + MENUITEM "Synchronize Horizontal Scrolling", IDM_VIEW_SYNSCROLLH + MENUITEM SEPARATOR + MENUITEM "Text Direction RTL", IDM_EDIT_RTL + MENUITEM "Text Direction LTR", IDM_EDIT_LTR + END + + POPUP "For&mat" + BEGIN + MENUITEM "Convert to Windows Format", IDM_FORMAT_TODOS + MENUITEM "Convert to UNIX Format", IDM_FORMAT_TOUNIX + MENUITEM "Convert to Mac Format", IDM_FORMAT_TOMAC + MENUITEM SEPARATOR + MENUITEM "Encode in ANSI", IDM_FORMAT_ANSI + MENUITEM "Encode in UTF-8 without BOM", IDM_FORMAT_AS_UTF_8 + MENUITEM "Encode in UTF-8", IDM_FORMAT_UTF_8 + MENUITEM "Encode in UCS-2 Big Endian", IDM_FORMAT_UCS_2BE + MENUITEM "Encode in UCS-2 Little Endian", IDM_FORMAT_UCS_2LE + MENUITEM SEPARATOR + MENUITEM "Convert to ANSI", IDM_FORMAT_CONV2_ANSI + MENUITEM "Convert to UTF-8 without BOM", IDM_FORMAT_CONV2_AS_UTF_8 + MENUITEM "Convert to UTF-8", IDM_FORMAT_CONV2_UTF_8 + MENUITEM "Convert to UCS-2 Big Endian", IDM_FORMAT_CONV2_UCS_2BE + MENUITEM "Convert to UCS-2 Little Endian", IDM_FORMAT_CONV2_UCS_2LE + END + + POPUP "&Language" + BEGIN + + MENUITEM "Ada", IDM_LANG_ADA + MENUITEM "ASP", IDM_LANG_ASP + MENUITEM "Assembly", IDM_LANG_ASM + MENUITEM "AutoIt", IDM_LANG_AU3 + MENUITEM "Batch", IDM_LANG_BATCH + MENUITEM "C", IDM_LANG_C + MENUITEM "C#", IDM_LANG_CS + MENUITEM "C++", IDM_LANG_CPP + MENUITEM "Caml", IDM_LANG_CAML + MENUITEM "Cmake", IDM_LANG_CMAKE + MENUITEM "CSS", IDM_LANG_CSS + MENUITEM "Diff", IDM_LANG_DIFF + MENUITEM "Flash actionscript", IDM_LANG_FLASH + MENUITEM "Fortran", IDM_LANG_FORTRAN + MENUITEM "Haskell", IDM_LANG_HASKELL + MENUITEM "HTML", IDM_LANG_HTML + MENUITEM "INNO", IDM_LANG_INNO + MENUITEM "Java", IDM_LANG_JAVA + MENUITEM "Javascript", IDM_LANG_JS + MENUITEM "KIXtart", IDM_LANG_KIX + MENUITEM "LISP", IDM_LANG_LISP + MENUITEM "Lua", IDM_LANG_LUA + MENUITEM "Makefile", IDM_LANG_MAKEFILE + MENUITEM "Matlab", IDM_LANG_MATLAB + MENUITEM "MS INI file", IDM_LANG_INI + MENUITEM "MS-DOS Style", IDM_LANG_ASCII + MENUITEM "Normal Text", IDM_LANG_TEXT + MENUITEM "NSIS", IDM_LANG_NSIS + MENUITEM "Objective-C", IDM_LANG_OBJC + MENUITEM "Pascal", IDM_LANG_PASCAL + MENUITEM "Perl", IDM_LANG_PERL + MENUITEM "PHP", IDM_LANG_PHP + MENUITEM "Postscript", IDM_LANG_PS + MENUITEM "Properties", IDM_LANG_PROPS + MENUITEM "Python", IDM_LANG_PYTHON + MENUITEM "rc resource file", IDM_LANG_RC + MENUITEM "Ruby", IDM_LANG_RUBY + MENUITEM "Shell", IDM_LANG_SH + MENUITEM "Scheme", IDM_LANG_SCHEME + MENUITEM "Smalltalk", IDM_LANG_SMALLTALK + MENUITEM "SQL", IDM_LANG_SQL + MENUITEM "TCL", IDM_LANG_TCL + MENUITEM "TeX", IDM_LANG_TEX + MENUITEM "VB", IDM_LANG_VB + MENUITEM "VHDL", IDM_LANG_VHDL + MENUITEM "Verilog", IDM_LANG_VERILOG + MENUITEM "XML", IDM_LANG_XML + MENUITEM "YAML", IDM_LANG_YAML + MENUITEM SEPARATOR + MENUITEM "User Defined", IDM_LANG_USER + END + POPUP "&Language" + BEGIN + POPUP "A" + BEGIN + MENUITEM "Ada", IDM_LANG_ADA + MENUITEM "ASP", IDM_LANG_ASP + MENUITEM "Assembly", IDM_LANG_ASM + MENUITEM "AutoIt", IDM_LANG_AU3 + END + MENUITEM "Batch", IDM_LANG_BATCH + POPUP "C" + BEGIN + MENUITEM "C", IDM_LANG_C + MENUITEM "C#", IDM_LANG_CS + MENUITEM "C++", IDM_LANG_CPP + MENUITEM "Caml", IDM_LANG_CAML + MENUITEM "Cmake", IDM_LANG_CMAKE + MENUITEM "CSS", IDM_LANG_CSS + END + MENUITEM "Diff", IDM_LANG_DIFF + POPUP "F" + BEGIN + MENUITEM "Flash actionscript", IDM_LANG_FLASH + MENUITEM "Fortran", IDM_LANG_FORTRAN + END + POPUP "H" + BEGIN + MENUITEM "Haskell", IDM_LANG_HASKELL + MENUITEM "HTML", IDM_LANG_HTML + END + MENUITEM "INNO", IDM_LANG_INNO + POPUP "J" + BEGIN + MENUITEM "Java", IDM_LANG_JAVA + MENUITEM "Javascript", IDM_LANG_JS + END + MENUITEM "KIXtart", IDM_LANG_KIX + POPUP "L" + BEGIN + MENUITEM "LISP", IDM_LANG_LISP + MENUITEM "Lua", IDM_LANG_LUA + END + POPUP "M" + BEGIN + MENUITEM "Makefile", IDM_LANG_MAKEFILE + MENUITEM "Matlab", IDM_LANG_MATLAB + MENUITEM "MS INI file", IDM_LANG_INI + MENUITEM "MS-DOS Style", IDM_LANG_ASCII + END + POPUP "N" + BEGIN + MENUITEM "Normal Text", IDM_LANG_TEXT + MENUITEM "NSIS", IDM_LANG_NSIS + END + MENUITEM "Objective-C", IDM_LANG_OBJC + POPUP "P" + BEGIN + MENUITEM "Pascal", IDM_LANG_PASCAL + MENUITEM "Perl", IDM_LANG_PERL + MENUITEM "PHP", IDM_LANG_PHP + MENUITEM "Postscript", IDM_LANG_PS + MENUITEM "Properties", IDM_LANG_PROPS + MENUITEM "Python", IDM_LANG_PYTHON + END + POPUP "R" + BEGIN + MENUITEM "rc resource file", IDM_LANG_RC + MENUITEM "Ruby", IDM_LANG_RUBY + END + POPUP "S" + BEGIN + MENUITEM "Shell", IDM_LANG_SH + MENUITEM "Scheme", IDM_LANG_SCHEME + MENUITEM "Smalltalk", IDM_LANG_SMALLTALK + MENUITEM "SQL", IDM_LANG_SQL + END + POPUP "T" + BEGIN + MENUITEM "TCL", IDM_LANG_TCL + MENUITEM "TeX", IDM_LANG_TEX + END + POPUP "V" + BEGIN + MENUITEM "VB", IDM_LANG_VB + MENUITEM "VHDL", IDM_LANG_VHDL + MENUITEM "Verilog", IDM_LANG_VERILOG + END + MENUITEM "XML", IDM_LANG_XML + MENUITEM "YAML", IDM_LANG_YAML + MENUITEM SEPARATOR + MENUITEM "User Defined", IDM_LANG_USER + END + + POPUP "Se&ttings" + BEGIN + MENUITEM "Preferences...", IDM_SETTING_PREFERECE + MENUITEM "Styler Configurator...", IDM_LANGSTYLE_CONFIG_DLG + MENUITEM "Shortcut Mapper...", IDM_SETTING_SHORTCUT_MAPPER + END + + POPUP "Macro" + BEGIN + MENUITEM "Start Re&cording", IDM_MACRO_STARTRECORDINGMACRO + MENUITEM "S&top Recording", IDM_MACRO_STOPRECORDINGMACRO + MENUITEM "&Playback", IDM_MACRO_PLAYBACKRECORDEDMACRO + MENUITEM "&Save current recorded macro...", IDM_MACRO_SAVECURRENTMACRO + MENUITEM "&Run a macro multiple times...", IDM_MACRO_RUNMULTIMACRODLG + END + + POPUP "Run" + BEGIN + MENUITEM "&Run...", IDM_EXECUTE + END + + POPUP "&?" + BEGIN + MENUITEM "Help content", IDM_HELP + MENUITEM SEPARATOR + MENUITEM "Notepad++ Home", IDM_HOMESWEETHOME + MENUITEM "Notepad++ Project Page", IDM_PROJECTPAGE + MENUITEM "Online help", IDM_ONLINEHELP + MENUITEM "Wiki FAQ", IDM_WIKIFAQ + MENUITEM "Forum", IDM_FORUM + MENUITEM "Get more plugins", IDM_PLUGINSHOME + MENUITEM SEPARATOR + MENUITEM "Update Notepad++", IDM_UPDATE_NPP + MENUITEM "About Notepad++", IDM_ABOUT + END + + MENUITEM "X", IDM_FILE_CLOSE, HELP +END + +IDD_ABOUTBOX DIALOGEX 0, 0, 271, 240 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_BORDER | WS_SYSMENU +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x1 +BEGIN + LTEXT NOTEPAD_PLUS_VERSION, IDC_STATIC,50,16,65,11 + LTEXT UNICODE_ANSI_MODE, IDC_STATIC,120,16,65,11 + GROUPBOX "GNU General Public Licence",IDC_STATIC,19,75,231,131,BS_CENTER + DEFPUSHBUTTON "Ok",IDOK,106,215,50,14,BS_FLAT,WS_EX_STATICEDGE + LTEXT "Author :",IDC_STATIC,21,41,31,8 + LTEXT "Don HO",IDC_AUTHOR_NAME,78,41,25,8 + LTEXT "Home Page :",IDC_STATIC,21,54,47,8 + LTEXT "http://notepad-plus.sourceforge.net/",IDC_HOME_ADDR,78,54,126,8 + EDITTEXT IDC_LICENCE_EDIT,31,99,209,96,ES_MULTILINE | ES_AUTOVSCROLL | ES_READONLY | NOT WS_BORDER | WS_VSCROLL + EDITTEXT IDC_BUILD_DATETIME,150,2,150,10, ES_READONLY | NOT WS_BORDER + CONTROL "",IDI_M30ICON,"Static",SS_OWNERDRAW,21,10,20,20 +END + +IDD_GOLINE DIALOGEX 26, 41, 261, 88 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE +CAPTION "Go To..." +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x0 +BEGIN + CONTROL "&Line",IDC_RADIO_GOTOLINE,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,5,9,80,10 + CONTROL "&Offset",IDC_RADIO_GOTOOFFSET,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,98,9,80,10 + LTEXT "You are here :",ID_URHERE_STATIC,5,34,95,8,NOT WS_GROUP + LTEXT "0123456789",ID_CURRLINE,100,34,45,8,NOT WS_GROUP + LTEXT "You want to &go :",ID_UGO_STATIC,5,51,95,8 + EDITTEXT ID_GOLINE_EDIT,98,49,71,12,ES_NUMBER + LTEXT "You can't go further than :",ID_NOMORETHAN_STATIC,5,68,92,8,NOT WS_GROUP + LTEXT "0123456789",ID_LASTLINE,100,68,45,8,NOT WS_GROUP + DEFPUSHBUTTON "Go !",IDOK,181,48,70,14,BS_NOTIFY + PUSHBUTTON "I'm going nowhere",IDCANCEL,181,66,70,14,BS_NOTIFY +END + +IDD_VALUE_DLG DIALOGEX 0, 0, 74, 17 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | + WS_SYSMENU +EXSTYLE WS_EX_TOOLWINDOW +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x1 +BEGIN + LTEXT "STATIC :",IDC_VALUE_STATIC,6,4,45,8 + EDITTEXT IDC_VALUE_EDIT,49,2,18,14,ES_NUMBER,WS_EX_DLGMODALFRAME +END + +// xp style +1 RT_MANIFEST "notepad++.exe.manifest" diff --git a/PowerEditor/src/Parameters.cpp b/PowerEditor/src/Parameters.cpp new file mode 100644 index 00000000..8ed58df1 --- /dev/null +++ b/PowerEditor/src/Parameters.cpp @@ -0,0 +1,4722 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "Parameters.h" +#include "FileDialog.h" +#include "ScintillaEditView.h" +#include + +#include "keys.h" + +struct WinMenuKeyDefinition { //more or less matches accelerator table definition, easy copy/paste + //const TCHAR * name; //name retrieved from menu? + int vKey; + int functionId; + bool isCtrl; + bool isAlt; + bool isShift; + TCHAR * specialName; //Used when no real menu name exists (in case of toggle for example) +}; + + +struct ScintillaKeyDefinition { + const TCHAR * name; + int functionId; + bool isCtrl; + bool isAlt; + bool isShift; + int vKey; + int redirFunctionId; //this gets set when a function is being redirected through Notepad++ if Scintilla doesnt do it properly :) +}; + +WinMenuKeyDefinition winKeyDefs[] = { //array of accelerator keys for all std menu items, values can be 0 for vKey, which means its unused + {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_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_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_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_SPACE, IDM_EDIT_AUTOCOMPLETE, true, false, 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_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, false, false, NULL}, + {VK_F3, IDM_SEARCH_VOLATILE_FINDPREV, true, false, true, NULL}, + {VK_F4, NPPM_INTERNAL_SEARCH_GOTONEXTFOUND, false, false, false, TEXT("Goto next found result")}, + {VK_F4, NPPM_INTERNAL_SEARCH_GOTOPREVFOUND, false, false, true, TEXT("Goto previous found result")}, + {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_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_F7, NPPM_INTERNAL_FOCUS_ON_FOUND_RESULTS,false, false, false, TEXT("Switch to found results window")}, + + {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_VIEW_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_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_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_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_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")}, +}; + + +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_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}, + // +}; +#ifdef UNICODE +#include "localizationString.h" + +wstring LocalizationSwitcher::getLangFromXmlFileName(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) + return localizationDefs[i]._langName; + } + return TEXT(""); +} + +wstring LocalizationSwitcher::getXmlFilePathFromLangName(wchar_t *langName) const +{ + for (size_t i = 0 ; i < _localizationList.size() ; i++) + { + if (wcsicmp(langName, _localizationList[i].first.c_str()) == 0) + return _localizationList[i].second; + } + return TEXT(""); +} + +bool LocalizationSwitcher::addLanguageFromXml(wstring xmlFullPath) +{ + wchar_t * fn = ::PathFindFileNameW(xmlFullPath.c_str()); + wstring foundLang = getLangFromXmlFileName(fn); + if (foundLang != TEXT("")) + { + _localizationList.push_back(pair(foundLang, xmlFullPath)); + return true; + } + return false; +} + +bool LocalizationSwitcher::switchToLang(wchar_t *lang2switch) const +{ + wstring langPath = getXmlFilePathFromLangName(lang2switch); + if (langPath == TEXT("")) + return false; + + return ::CopyFileW(langPath.c_str(), _nativeLangPath.c_str(), FALSE) != FALSE; +} + +#endif + + +generic_string ThemeSwitcher::getThemeFromXmlFileName(const TCHAR *xmlFullPath) const +{ + if (xmlFullPath == TEXT("")) return xmlFullPath; + TCHAR fn[MAX_PATH]; + lstrcpy(fn, ::PathFindFileName(xmlFullPath)); + PathRemoveExtension(fn); + generic_string themeName = fn; + return themeName; +} + +typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); + +winVer getWindowsVersion() +{ + OSVERSIONINFOEX osvi; + SYSTEM_INFO si; + PGNSI pGNSI; + BOOL bOsVersionInfoEx; + + ZeroMemory(&si, sizeof(SYSTEM_INFO)); + ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); + + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); + + if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) ) + { + osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); + if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) + return WV_UNKNOWN; + } + + pGNSI = (PGNSI) GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo"); + if(pGNSI != NULL) + pGNSI(&si); + else + GetSystemInfo(&si); + + switch (osvi.dwPlatformId) + { + case VER_PLATFORM_WIN32_NT: + { + if ( osvi.dwMajorVersion == 6 && osvi.dwMinorVersion == 0 ) + { + return WV_VISTA; + } + + if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 ) + { + if (osvi.wProductType == VER_NT_WORKSTATION && + si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64) + { + return WV_XPX64; + } + return WV_S2003; + } + + if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) + return WV_XP; + + if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) + return WV_W2K; + + if ( osvi.dwMajorVersion <= 4 ) + return WV_NT; + } + 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; + + case VER_PLATFORM_WIN32s: + return WV_WIN32S; + + 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), /*_pXmlNativeLangDoc(NULL), */_pXmlNativeLangDocA(NULL),\ + _nbLang(0), _nbFile(0), _nbMaxFile(10), _pXmlToolIconsDoc(NULL),\ + _pXmlShortcutDoc(NULL), _pXmlContextMenuDoc(NULL), _pXmlSessionDoc(NULL),\ + _nbUserLang(0), _nbExternalLang(0), _hUser32(NULL), _hUXTheme(NULL),\ + _transparentFuncAddr(NULL), _enableThemeDialogTextureFuncAddr(NULL),\ + _isTaskListRBUTTONUP_Active(false), _fileSaveDlgFilterIndex(-1), _asNotepadStyle(false), _isFindReplacing(false) +{ + _findHistory._nbFindHistoryPath = 0; + _findHistory._nbFindHistoryFilter = 0; + _findHistory._nbFindHistoryFind = 0; + _findHistory._nbFindHistoryReplace = 0; + + //Get windows version + _winVersion = getWindowsVersion(); + + // Prepare for default path + TCHAR nppPath[MAX_PATH]; + ::GetModuleFileName(NULL, nppPath, MAX_PATH); + + PathRemoveFileSpec(nppPath); + lstrcpy(_nppPath, nppPath); + + //Initialize current directory to startup directory + ::GetCurrentDirectory(MAX_PATH, _currentDirectory); + + _appdataNppDir[0] = '\0'; + TCHAR notepadStylePath[MAX_PATH]; + lstrcpy(notepadStylePath, _nppPath); + PathAppend(notepadStylePath, notepadStyleFile); + + _asNotepadStyle = (PathFileExists(notepadStylePath) == TRUE); + ::AddFontResource(LINEDRAW_FONT); + + //Load initial accelerator key definitions + initMenuKeys(); + initScintillaKeys(); +} + +NppParameters::~NppParameters() +{ + for (int i = 0 ; i < _nbLang ; i++) + delete _langList[i]; + for (int i = 0 ; i < _nbFile ; i++) + delete _LRFileList[i]; + for (int i = 0 ; i < _nbUserLang ; i++) + delete _userLangArray[i]; + if (_hUser32) + FreeLibrary(_hUser32); + if (_hUXTheme) + FreeLibrary(_hUXTheme); + + ::RemoveFontResource(LINEDRAW_FONT); +} +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) +{ + if (_pXmlUserStylerDoc) + delete _pXmlUserStylerDoc; + + _pXmlUserStylerDoc = new TiXmlDocument(stylePath?stylePath:_stylerPath); + bool loadOkay = _pXmlUserStylerDoc->LoadFile(); + if (!loadOkay) + { + ::MessageBox(NULL, TEXT("Load stylers.xml failed!"), TEXT("Configurator"),MB_OK); + delete _pXmlUserStylerDoc; + _pXmlUserStylerDoc = NULL; + return false; + } + _lexerStylerArray.eraseAll(); + _widgetStyleArray.setNbStyler( 0 ); + + return getUserStylersFromXmlTree(); +} + +bool NppParameters::reloadLang() +{ + TCHAR nativeLangPath[MAX_PATH]; + lstrcpy(nativeLangPath, _userPath); + PathAppend(nativeLangPath, TEXT("nativeLang.xml")); + + if (!PathFileExists(nativeLangPath)) + { + return false; + } + + if (_pXmlNativeLangDocA) + delete _pXmlNativeLangDocA; + + _pXmlNativeLangDocA = new TiXmlDocumentA(); + + bool loadOkay = _pXmlNativeLangDocA->LoadUnicodeFilePath(nativeLangPath); + if (!loadOkay) + { + delete _pXmlNativeLangDocA; + _pXmlNativeLangDocA = NULL; + return false; + } + return loadOkay; +} + +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 + TCHAR localConfPath[MAX_PATH]; + lstrcpy(localConfPath, _nppPath); + PathAppend(localConfPath, localConfFile); + + // Test if localConf.xml exist + bool isLocal = (PathFileExists(localConfPath) == TRUE); + + if (isLocal) + { + lstrcpy(_userPath, _nppPath); + } + else + { + ITEMIDLIST *pidl; + SHGetSpecialFolderLocation(NULL, CSIDL_APPDATA, &pidl); + SHGetPathFromIDList(pidl, _userPath); + + PathAppend(_userPath, TEXT("Notepad++")); + + lstrcpy(_appdataNppDir, _userPath); + + if (!PathFileExists(_userPath)) + { + ::CreateDirectory(_userPath, NULL); + } + } + + //-------------------------------------// + // Transparent function for w2k and xp // + //-------------------------------------// + _hUser32 = ::GetModuleHandle(TEXT("User32")); + if (_hUser32) + _transparentFuncAddr = (WNDPROC)::GetProcAddress(_hUser32, "SetLayeredWindowAttributes"); + + //---------------------------------------------// + // Dlg theme texture function for xp and vista // + //---------------------------------------------// + _hUXTheme = ::LoadLibrary(TEXT("uxtheme.dll")); + if (_hUXTheme) + _enableThemeDialogTextureFuncAddr = (WNDPROC)::GetProcAddress(_hUXTheme, "EnableThemeDialogTexture"); + + //---------------------------------------// + // langs.xml : for every user statically // + //---------------------------------------// + TCHAR langs_xml_path[MAX_PATH]; + lstrcpy(langs_xml_path, _nppPath); + + PathAppend(langs_xml_path, TEXT("langs.xml")); + if (!PathFileExists(langs_xml_path)) + { + TCHAR srcLangsPath[MAX_PATH]; + lstrcpy(srcLangsPath, _nppPath); + PathAppend(srcLangsPath, TEXT("langs.model.xml")); + + ::CopyFile(srcLangsPath, langs_xml_path, TRUE); + } + + _pXmlDoc = new TiXmlDocument(langs_xml_path); + bool loadOkay = _pXmlDoc->LoadFile(); + if (!loadOkay) + { + ::MessageBox(NULL, TEXT("Load langs.xml failed!"), TEXT("Configurator"),MB_OK); + delete _pXmlDoc; + _pXmlDoc = NULL; + isAllLaoded = false; + } + else + getLangKeywordsFromXmlTree(); + + //---------------------------// + // config.xml : for per user // + //---------------------------// + TCHAR configPath[MAX_PATH]; + lstrcpy(configPath, _userPath); + PathAppend(configPath, TEXT("config.xml")); + + TCHAR srcConfigPath[MAX_PATH]; + lstrcpy(srcConfigPath, _nppPath); + PathAppend(srcConfigPath, TEXT("config.model.xml")); + + if (!::PathFileExists(configPath)) + ::CopyFile(srcConfigPath, configPath, FALSE); + + _pXmlUserDoc = new TiXmlDocument(configPath); + loadOkay = _pXmlUserDoc->LoadFile(); + if (!loadOkay) + { + int res = ::MessageBox(NULL, TEXT("Load config.xml failed!\rDo you want to recover your config.xml?"), TEXT("Configurator"),MB_YESNO); + if (res ==IDYES) + { + ::CopyFile(srcConfigPath, configPath, FALSE); + + loadOkay = _pXmlUserDoc->LoadFile(); + if (!loadOkay) + { + ::MessageBox(NULL, TEXT("Recover config.xml failed!"), TEXT("Configurator"),MB_OK); + delete _pXmlUserDoc; + _pXmlUserDoc = NULL; + isAllLaoded = false; + } + else + getUserParametersFromXmlTree(); + } + else + { + delete _pXmlUserDoc; + _pXmlUserDoc = NULL; + isAllLaoded = false; + } + } + else + getUserParametersFromXmlTree(); + + //----------------------------// + // stylers.xml : for per user // + //----------------------------// + + lstrcpy(_stylerPath, _userPath); + PathAppend(_stylerPath, TEXT("stylers.xml")); + + if (!PathFileExists(_stylerPath)) + { + TCHAR srcStylersPath[MAX_PATH]; + lstrcpy(srcStylersPath, _nppPath); + PathAppend(srcStylersPath, TEXT("stylers.model.xml")); + + ::CopyFile(srcStylersPath, _stylerPath, TRUE); + } + + if ( _nppGUI._themeName.empty() || (!PathFileExists(_nppGUI._themeName.c_str())) ) + { + _nppGUI._themeName.assign(_stylerPath); + } + + _pXmlUserStylerDoc = new TiXmlDocument(_nppGUI._themeName.c_str()); + + loadOkay = _pXmlUserStylerDoc->LoadFile(); + if (!loadOkay) + { + ::MessageBox(NULL, TEXT("Load stylers.xml failed!"), TEXT("Configurator"),MB_OK); + delete _pXmlUserStylerDoc; + _pXmlUserStylerDoc = NULL; + isAllLaoded = false; + } + else + getUserStylersFromXmlTree(); + + _themeSwitcher._stylesXmlPath = _stylerPath; + // Firstly, add the default theme + _themeSwitcher.addDefaultThemeFromXml(_stylerPath); + + //-----------------------------------// + // userDefineLang.xml : for per user // + //-----------------------------------// + lstrcpy(_userDefineLangPath, _userPath); + PathAppend(_userDefineLangPath, TEXT("userDefineLang.xml")); + + _pXmlUserLangDoc = new TiXmlDocument(_userDefineLangPath); + loadOkay = _pXmlUserLangDoc->LoadFile(); + if (!loadOkay) + { + delete _pXmlUserLangDoc; + _pXmlUserLangDoc = NULL; + isAllLaoded = false; + } + else + getUserDefineLangsFromXmlTree(); + + //----------------------------------------------// + // nativeLang.xml : for per user // + // In case of absence of user's nativeLang.xml, // + // We'll look in the Notepad++ Dir. // + //----------------------------------------------// + TCHAR nativeLangPath[MAX_PATH]; + lstrcpy(nativeLangPath, _userPath); + PathAppend(nativeLangPath, TEXT("nativeLang.xml")); + + if (!PathFileExists(nativeLangPath)) + { + lstrcpy(nativeLangPath, _nppPath); + PathAppend(nativeLangPath, TEXT("nativeLang.xml")); + } + + _pXmlNativeLangDocA = new TiXmlDocumentA(); + + loadOkay = _pXmlNativeLangDocA->LoadUnicodeFilePath(nativeLangPath); + if (!loadOkay) + { + delete _pXmlNativeLangDocA; + _pXmlNativeLangDocA = NULL; + isAllLaoded = false; + } +#ifdef UNICODE + _localizationSwitcher._nativeLangPath = nativeLangPath; +#endif + //---------------------------------// + // toolbarIcons.xml : for per user // + //---------------------------------// + TCHAR toolbarIconsPath[MAX_PATH]; + lstrcpy(toolbarIconsPath, _userPath); + PathAppend(toolbarIconsPath, TEXT("toolbarIcons.xml")); + + _pXmlToolIconsDoc = new TiXmlDocument(toolbarIconsPath); + loadOkay = _pXmlToolIconsDoc->LoadFile(); + if (!loadOkay) + { + delete _pXmlToolIconsDoc; + _pXmlToolIconsDoc = NULL; + isAllLaoded = false; + } + + //------------------------------// + // shortcuts.xml : for per user // + //------------------------------// + lstrcpy(_shortcutsPath, _userPath); + PathAppend(_shortcutsPath, TEXT("shortcuts.xml")); + + if (!PathFileExists(_shortcutsPath)) + { + TCHAR srcShortcutsPath[MAX_PATH]; + lstrcpy(srcShortcutsPath, _nppPath); + PathAppend(srcShortcutsPath, TEXT("shortcuts.xml")); + + ::CopyFile(srcShortcutsPath, _shortcutsPath, TRUE); + } + + _pXmlShortcutDoc = new TiXmlDocument(_shortcutsPath); + loadOkay = _pXmlShortcutDoc->LoadFile(); + if (!loadOkay) + { + delete _pXmlShortcutDoc; + _pXmlShortcutDoc = NULL; + isAllLaoded = false; + } + else + { + getShortcutsFromXmlTree(); + getMacrosFromXmlTree(); + getUserCmdsFromXmlTree(); + + // fill out _scintillaModifiedKeys : + // those user defined Scintilla key will be used remap Scintilla Key Array + getScintKeysFromXmlTree(); + } + + //---------------------------------// + // contextMenu.xml : for per user // + //---------------------------------// + lstrcpy(_contextMenuPath, _userPath); + PathAppend(_contextMenuPath, TEXT("contextMenu.xml")); + + if (!PathFileExists(_contextMenuPath)) + { + TCHAR srcContextMenuPath[MAX_PATH]; + lstrcpy(srcContextMenuPath, _nppPath); + PathAppend(srcContextMenuPath, TEXT("contextMenu.xml")); + + ::CopyFile(srcContextMenuPath, _contextMenuPath, TRUE); + } + + _pXmlContextMenuDoc = new TiXmlDocument(_contextMenuPath); + loadOkay = _pXmlContextMenuDoc->LoadFile(); + if (!loadOkay) + { + delete _pXmlContextMenuDoc; + _pXmlContextMenuDoc = NULL; + isAllLaoded = false; + } + //else + //getContextMenuFromXmlTree(); + + //----------------------------// + // session.xml : for per user // + //----------------------------// + lstrcpy(_sessionPath, _userPath); + PathAppend(_sessionPath, TEXT("session.xml")); + + // Don't load session.xml if not required in order to speed up!! + const NppGUI & nppGUI = (NppParameters::getInstance())->getNppGUI(); + if (nppGUI._rememberLastSession) + { + _pXmlSessionDoc = new TiXmlDocument(_sessionPath); + loadOkay = _pXmlSessionDoc->LoadFile(); + if (!loadOkay) + isAllLaoded = false; + else + getSessionFromXmlTree(); + + delete _pXmlSessionDoc; + for (size_t i = 0 ; i < _pXmlExternalLexerDoc.size() ; i++) + if (_pXmlExternalLexerDoc[i]) + delete _pXmlExternalLexerDoc[i]; + + _pXmlSessionDoc = NULL; + } + return isAllLaoded; +} + +void NppParameters::destroyInstance() +{ + if (_pXmlDoc != NULL) + { + delete _pXmlDoc; + } + + if (_pXmlUserDoc != NULL) + { + _pXmlUserDoc->SaveFile(); + delete _pXmlUserDoc; + } + if (_pXmlUserStylerDoc) + delete _pXmlUserStylerDoc; + + if (_pXmlUserLangDoc) + delete _pXmlUserLangDoc; + + if (_pXmlNativeLangDocA) + delete _pXmlNativeLangDocA; + + if (_pXmlToolIconsDoc) + delete _pXmlToolIconsDoc; + + if (_pXmlShortcutDoc) + delete _pXmlShortcutDoc; + + if (_pXmlContextMenuDoc) + delete _pXmlContextMenuDoc; + + if (_pXmlSessionDoc) + delete _pXmlSessionDoc; + + delete _pSelf; +} + +void NppParameters::setFontList(HWND hWnd) +{ + //---------------// + // Sys font list // + //---------------// + + LOGFONT lf; + _fontlist.clear(); + _fontlist.push_back(TEXT("")); + + lf.lfCharSet = DEFAULT_CHARSET; + lf.lfFaceName[0]='\0'; + lf.lfPitchAndFamily = 0; + HDC hDC = ::GetDC(hWnd); + + ::EnumFontFamiliesEx(hDC, + &lf, + (FONTENUMPROC) EnumFontFamExProc, + (LPARAM) &_fontlist, 0); +} + +void NppParameters::getLangKeywordsFromXmlTree() +{ + TiXmlNode *root = _pXmlDoc->FirstChild(TEXT("NotepadPlus")); + if (!root) return; + feedKeyWordsParameters(root); +} + +void NppParameters::getExternalLexerFromXmlTree(TiXmlDocument *doc) +{ + TiXmlNode *root = doc->FirstChild(TEXT("NotepadPlus")); + if (!root) return; + feedKeyWordsParameters(root); + feedStylerArray(root); +} + +int NppParameters::addExternalLangToEnd(ExternalLangContainer * externalLang) +{ + _externalLangArray[_nbExternalLang] = externalLang; + _nbExternalLang++; + L_END++; + return _nbExternalLang-1; +} + +bool NppParameters::getUserStylersFromXmlTree() +{ + TiXmlNode *root = _pXmlUserStylerDoc->FirstChild(TEXT("NotepadPlus")); + if (!root) return false; + return feedStylerArray(root); +} + +bool NppParameters::getUserParametersFromXmlTree() +{ + if (!_pXmlUserDoc) + return false; + + TiXmlNode *root = _pXmlUserDoc->FirstChild(TEXT("NotepadPlus")); + if (!root) return false; + + // GUI + feedGUIParameters(root); + + //History + feedFileListParameters(root); + + // Raser tout + TiXmlNode *node = root->FirstChildElement(TEXT("History")); + root->RemoveChild(node); + + // Repartir de zero + TiXmlElement HistoryNode(TEXT("History")); + + root->InsertEndChild(HistoryNode); + + //Find history + feedFindHistoryParameters(root); + + return true; +} + +bool NppParameters::getUserDefineLangsFromXmlTree() +{ + if (!_pXmlUserLangDoc) + return false; + + TiXmlNode *root = _pXmlUserLangDoc->FirstChild(TEXT("NotepadPlus")); + if (!root) + return false; + + feedUserLang(root); + return true; +} + +bool NppParameters::getShortcutsFromXmlTree() +{ + if (!_pXmlShortcutDoc) + return false; + + TiXmlNode *root = _pXmlShortcutDoc->FirstChild(TEXT("NotepadPlus")); + if (!root) + return false; + + feedShortcut(root); + return true; +} + +bool NppParameters::getMacrosFromXmlTree() +{ + if (!_pXmlShortcutDoc) + return false; + + TiXmlNode *root = _pXmlShortcutDoc->FirstChild(TEXT("NotepadPlus")); + if (!root) + return false; + + feedMacros(root); + return true; +} + +bool NppParameters::getUserCmdsFromXmlTree() +{ + if (!_pXmlShortcutDoc) + return false; + + TiXmlNode *root = _pXmlShortcutDoc->FirstChild(TEXT("NotepadPlus")); + if (!root) + return false; + + feedUserCmds(root); + return true; +} + + +bool NppParameters::getPluginCmdsFromXmlTree() +{ + if (!_pXmlShortcutDoc) + return false; + + TiXmlNode *root = _pXmlShortcutDoc->FirstChild(TEXT("NotepadPlus")); + if (!root) + return false; + + feedPluginCustomizedCmds(root); + return true; +} + + +bool NppParameters::getScintKeysFromXmlTree() +{ + if (!_pXmlShortcutDoc) + return false; + + TiXmlNode *root = _pXmlShortcutDoc->FirstChild(TEXT("NotepadPlus")); + if (!root) + return false; + + feedScintKeys(root); + return true; +} + +void NppParameters::initMenuKeys() +{ + int nrCommands = sizeof(winKeyDefs)/sizeof(WinMenuKeyDefinition); + WinMenuKeyDefinition wkd; + for(int i = 0; i < nrCommands; i++) + { + wkd = winKeyDefs[i]; + Shortcut sc( (wkd.specialName?wkd.specialName:TEXT("")), wkd.isCtrl, wkd.isAlt, wkd.isShift, wkd.vKey); + _shortcuts.push_back( CommandShortcut(sc, wkd.functionId) ); + } +} + +void NppParameters::initScintillaKeys() { + + int nrCommands = sizeof(scintKeyDefs)/sizeof(ScintillaKeyDefinition); + + //Warning! Matching function have to be consecutive + ScintillaKeyDefinition skd; + size_t prevIndex = -1; + int prevID = -1; + for(int i = 0; i < nrCommands; i++) { + skd = scintKeyDefs[i]; + if (skd.functionId == prevID) { + KeyCombo kc; + kc._isCtrl = skd.isCtrl; + kc._isAlt = skd.isAlt; + kc._isShift = skd.isShift; + kc._key = skd.vKey; + _scintillaKeyCommands[prevIndex].addKeyCombo(kc); + } else { + _scintillaKeyCommands.push_back(ScintillaKeyMap(Shortcut(skd.name, skd.isCtrl, skd.isAlt, skd.isShift, skd.vKey), skd.functionId, skd.redirFunctionId)); + prevIndex++; + } + prevID = skd.functionId; + } +} +bool NppParameters::reloadContextMenuFromXmlTree(HMENU mainMenuHadle) +{ + _contextMenuItems.clear(); + return getContextMenuFromXmlTree(mainMenuHadle); +} + +bool NppParameters::getContextMenuFromXmlTree(HMENU mainMenuHadle) +{ + if (!_pXmlContextMenuDoc) + return false; + TiXmlNode *root = _pXmlContextMenuDoc->FirstChild(TEXT("NotepadPlus")); + if (!root) + return false; + TiXmlNode *contextMenuRoot = root->FirstChildElement(TEXT("ScintillaContextMenu")); + if (contextMenuRoot) + { + for (TiXmlNode *childNode = contextMenuRoot->FirstChildElement(TEXT("Item")); + childNode ; + childNode = childNode->NextSibling(TEXT("Item")) ) + { + int id; + const TCHAR *idStr = (childNode->ToElement())->Attribute(TEXT("id"), &id); + if (idStr) + { + _contextMenuItems.push_back(MenuItemUnit(id, TEXT(""))); + } + else + { + const TCHAR *menuEntryName = (childNode->ToElement())->Attribute(TEXT("MenuEntryName")); + const TCHAR *menuItemName = (childNode->ToElement())->Attribute(TEXT("MenuItemName")); + if (menuEntryName && menuItemName) + { + int nbMenuEntry = ::GetMenuItemCount(mainMenuHadle); + for (int i = 0 ; i < nbMenuEntry ; i++) + { + TCHAR menuEntryString[64]; + ::GetMenuString(mainMenuHadle, i, menuEntryString, 64, MF_BYPOSITION); + if (generic_stricmp(menuEntryName, purgeMenuItemString(menuEntryString).c_str()) == 0) + { + HMENU subMenu = ::GetSubMenu(mainMenuHadle, i); + int nbSubMenuCmd = ::GetMenuItemCount(subMenu); + for (int j = 0 ; j < nbSubMenuCmd ; j++) + { + TCHAR cmdStr[256]; + ::GetMenuString(subMenu, j, cmdStr, 256, MF_BYPOSITION); + if (generic_stricmp(menuItemName, purgeMenuItemString(cmdStr).c_str()) == 0) + { + int cmdId = ::GetMenuItemID(subMenu, j); + _contextMenuItems.push_back(MenuItemUnit(cmdId, TEXT(""))); + break; + } + } + break; + } + } + } + else + { + const TCHAR *pluginName = (childNode->ToElement())->Attribute(TEXT("PluginEntryName")); + const TCHAR *pluginCmdName = (childNode->ToElement())->Attribute(TEXT("pluginCommandItemName")); + if (pluginName && pluginCmdName) + { + HMENU pluginsMenu = ::GetSubMenu(mainMenuHadle, MENUINDEX_PLUGINS); + int nbPlugins = ::GetMenuItemCount(pluginsMenu); + for (int i = 0 ; i < nbPlugins ; i++) + { + TCHAR menuItemString[256]; + ::GetMenuString(pluginsMenu, i, menuItemString, 256, MF_BYPOSITION); + if (generic_stricmp(pluginName, purgeMenuItemString(menuItemString).c_str()) == 0) + { + HMENU pluginMenu = ::GetSubMenu(pluginsMenu, i); + int nbPluginCmd = ::GetMenuItemCount(pluginMenu); + for (int j = 0 ; j < nbPluginCmd ; j++) + { + TCHAR pluginCmdStr[256]; + ::GetMenuString(pluginMenu, j, pluginCmdStr, 256, MF_BYPOSITION); + if (generic_stricmp(pluginCmdName, purgeMenuItemString(pluginCmdStr).c_str()) == 0) + { + int pluginCmdId = ::GetMenuItemID(pluginMenu, j); + _contextMenuItems.push_back(MenuItemUnit(pluginCmdId, TEXT(""))); + break; + } + } + break; + } + } + } + } + } + } + } + return true; +} + +void NppParameters::setWorkingDir(const TCHAR * newPath) +{ + if (newPath && newPath[0]) + { + lstrcpyn(_currentDirectory, newPath, MAX_PATH); //dont use sizeof + } + else + { + if (PathFileExists(_nppGUI._defaultDirExp)) + { + lstrcpyn(_currentDirectory, _nppGUI._defaultDirExp, MAX_PATH); + } + else + { + lstrcpyn(_currentDirectory, _nppPath, MAX_PATH); + } + } +} + +bool NppParameters::loadSession(Session & session, const TCHAR *sessionFileName) +{ + TiXmlDocument *pXmlSessionDocument = new TiXmlDocument(sessionFileName); + bool loadOkay = pXmlSessionDocument->LoadFile(); + if (loadOkay) + loadOkay = getSessionFromXmlTree(pXmlSessionDocument, &session); + + delete pXmlSessionDocument; + return loadOkay; +} + +bool NppParameters::getSessionFromXmlTree(TiXmlDocument *pSessionDoc, Session *pSession) +{ + if ((pSessionDoc) && (!pSession)) + return false; + + TiXmlDocument **ppSessionDoc = &_pXmlSessionDoc; + Session *ptrSession = &_session; + + if (pSessionDoc) + { + ppSessionDoc = &pSessionDoc; + ptrSession = pSession; + } + + if (!*ppSessionDoc) + return false; + + TiXmlNode *root = (*ppSessionDoc)->FirstChild(TEXT("NotepadPlus")); + if (!root) + return false; + + TiXmlNode *sessionRoot = root->FirstChildElement(TEXT("Session")); + if (!sessionRoot) + return false; + + + TiXmlElement *actView = sessionRoot->ToElement(); + size_t index; + const TCHAR *str = actView->Attribute(TEXT("activeView"), (int *)&index); + if (str) + { + (*ptrSession)._activeView = index; + } + + + TiXmlNode *mainviewRoot = sessionRoot->FirstChildElement(TEXT("mainView")); + if (mainviewRoot) + { + TiXmlElement *actIndex = mainviewRoot->ToElement(); + str = actIndex->Attribute(TEXT("activeIndex"), (int *)&index); + if (str) + { + (*ptrSession)._activeMainIndex = index; + } + for (TiXmlNode *childNode = mainviewRoot->FirstChildElement(TEXT("File")); + childNode ; + childNode = childNode->NextSibling(TEXT("File")) ) + { + const TCHAR *fileName = (childNode->ToElement())->Attribute(TEXT("filename")); + if (fileName) + { + Position position; + (childNode->ToElement())->Attribute(TEXT("firstVisibleLine"), &position._firstVisibleLine); + (childNode->ToElement())->Attribute(TEXT("xOffset"), &position._xOffset); + (childNode->ToElement())->Attribute(TEXT("startPos"), &position._startPos); + (childNode->ToElement())->Attribute(TEXT("endPos"), &position._endPos); + (childNode->ToElement())->Attribute(TEXT("selMode"), &position._selMode); + (childNode->ToElement())->Attribute(TEXT("scrollWidth"), &position._scrollWidth); + + const TCHAR *langName; + langName = (childNode->ToElement())->Attribute(TEXT("lang")); + sessionFileInfo sfi( fileName, langName, position ); + + for (TiXmlNode *markNode = childNode->FirstChildElement(TEXT("Mark")); + markNode ; + markNode = markNode->NextSibling(TEXT("Mark"))) + { + int lineNumber; + const TCHAR *lineNumberStr = (markNode->ToElement())->Attribute(TEXT("line"), &lineNumber); + if (lineNumberStr) + { + sfi.marks.push_back(lineNumber); + } + } + (*ptrSession)._mainViewFiles.push_back(sfi); + } + } + } + + TiXmlNode *subviewRoot = sessionRoot->FirstChildElement(TEXT("subView")); + if (subviewRoot) + { + TiXmlElement *actIndex = subviewRoot->ToElement(); + str = actIndex->Attribute(TEXT("activeIndex"), (int *)&index); + if (str) + { + (*ptrSession)._activeSubIndex = index; + } + for (TiXmlNode *childNode = subviewRoot->FirstChildElement(TEXT("File")); + childNode ; + childNode = childNode->NextSibling(TEXT("File")) ) + { + const TCHAR *fileName = (childNode->ToElement())->Attribute(TEXT("filename")); + if (fileName) + { + + Position position; + (childNode->ToElement())->Attribute(TEXT("firstVisibleLine"), &position._firstVisibleLine); + (childNode->ToElement())->Attribute(TEXT("xOffset"), &position._xOffset); + (childNode->ToElement())->Attribute(TEXT("startPos"), &position._startPos); + (childNode->ToElement())->Attribute(TEXT("endPos"), &position._endPos); + (childNode->ToElement())->Attribute(TEXT("selMode"), &position._selMode); + (childNode->ToElement())->Attribute(TEXT("scrollWidth"), &position._scrollWidth); + + const TCHAR *langName; + langName = (childNode->ToElement())->Attribute(TEXT("lang")); + sessionFileInfo sfi( fileName, langName, position ); + + for (TiXmlNode *markNode = childNode->FirstChildElement(TEXT("Mark")); + markNode ; + markNode = markNode->NextSibling(TEXT("Mark"))) + { + int lineNumber; + const TCHAR *lineNumberStr = (markNode->ToElement())->Attribute(TEXT("line"), &lineNumber); + if (lineNumberStr) + { + sfi.marks.push_back(lineNumber); + } + } + (*ptrSession)._subViewFiles.push_back(sfi); + } + } + } + + + return true; +} +void NppParameters::feedFileListParameters(TiXmlNode *node) +{ + _nbMaxFile = 10; + + TiXmlNode *historyRoot = node->FirstChildElement(TEXT("History")); + if (!historyRoot) return; + + (historyRoot->ToElement())->Attribute(TEXT("nbMaxFile"), &_nbMaxFile); + if ((_nbMaxFile < 0) || (_nbMaxFile > 30)) + return; + + for (TiXmlNode *childNode = historyRoot->FirstChildElement(TEXT("File")); + childNode && (_nbFile < NB_MAX_LRF_FILE); + childNode = childNode->NextSibling(TEXT("File")) ) + { + const TCHAR *filePath = (childNode->ToElement())->Attribute(TEXT("filename")); + if (filePath) + { + _LRFileList[_nbFile] = new generic_string(filePath); + _nbFile++; + } + } +} + +void NppParameters::feedFindHistoryParameters(TiXmlNode *node) +{ + TiXmlNode *findHistoryRoot = node->FirstChildElement(TEXT("FindHistory")); + if (!findHistoryRoot) return; + + (findHistoryRoot->ToElement())->Attribute(TEXT("nbMaxFindHistoryPath"), &_findHistory._nbMaxFindHistoryPath); + if ((_findHistory._nbMaxFindHistoryPath > 0) && (_findHistory._nbMaxFindHistoryPath <= NB_MAX_FINDHISTORY_PATH)) + { + for (TiXmlNode *childNode = findHistoryRoot->FirstChildElement(TEXT("Path")); + childNode && (_findHistory._nbFindHistoryPath < NB_MAX_FINDHISTORY_PATH); + childNode = childNode->NextSibling(TEXT("Path")) ) + { + const TCHAR *filePath = (childNode->ToElement())->Attribute(TEXT("name")); + if (filePath) + { + _findHistory._pFindHistoryPath[_findHistory._nbFindHistoryPath++] = new generic_string(filePath); + } + } + } + + (findHistoryRoot->ToElement())->Attribute(TEXT("nbMaxFindHistoryFilter"), &_findHistory._nbMaxFindHistoryFilter); + if ((_findHistory._nbMaxFindHistoryFilter > 0) && (_findHistory._nbMaxFindHistoryFilter <= NB_MAX_FINDHISTORY_FILTER)) + { + for (TiXmlNode *childNode = findHistoryRoot->FirstChildElement(TEXT("Filter")); + childNode && (_findHistory._nbFindHistoryFilter < NB_MAX_FINDHISTORY_FILTER); + childNode = childNode->NextSibling(TEXT("Filter"))) + { + const TCHAR *fileFilter = (childNode->ToElement())->Attribute(TEXT("name")); + if (fileFilter) + { + _findHistory._pFindHistoryFilter[_findHistory._nbFindHistoryFilter++] = new generic_string(fileFilter); + } + } + } + + (findHistoryRoot->ToElement())->Attribute(TEXT("nbMaxFindHistoryFind"), &_findHistory._nbMaxFindHistoryFind); + if ((_findHistory._nbMaxFindHistoryFind > 0) && (_findHistory._nbMaxFindHistoryFind <= NB_MAX_FINDHISTORY_FIND)) + { + for (TiXmlNode *childNode = findHistoryRoot->FirstChildElement(TEXT("Find")); + childNode && (_findHistory._nbFindHistoryFind < NB_MAX_FINDHISTORY_FIND); + childNode = childNode->NextSibling(TEXT("Find"))) + { + const TCHAR *fileFind = (childNode->ToElement())->Attribute(TEXT("name")); + if (fileFind) + { + _findHistory._pFindHistoryFind[_findHistory._nbFindHistoryFind++] = new generic_string(fileFind); + } + } + } + + (findHistoryRoot->ToElement())->Attribute(TEXT("nbMaxFindHistoryReplace"), &_findHistory._nbMaxFindHistoryReplace); + if ((_findHistory._nbMaxFindHistoryReplace > 0) && (_findHistory._nbMaxFindHistoryReplace <= NB_MAX_FINDHISTORY_REPLACE)) + { + for (TiXmlNode *childNode = findHistoryRoot->FirstChildElement(TEXT("Replace")); + childNode && (_findHistory._nbFindHistoryReplace < NB_MAX_FINDHISTORY_REPLACE); + childNode = childNode->NextSibling(TEXT("Replace"))) + { + const TCHAR *fileReplace = (childNode->ToElement())->Attribute(TEXT("name")); + if (fileReplace) + { + _findHistory._pFindHistoryReplace[_findHistory._nbFindHistoryReplace++] = new generic_string(fileReplace); + } + } + } + + const TCHAR *boolStr = (findHistoryRoot->ToElement())->Attribute(TEXT("matchWord")); + if (boolStr) + _findHistory._isMatchWord = !lstrcmp(TEXT("yes"), boolStr); + + boolStr = (findHistoryRoot->ToElement())->Attribute(TEXT("matchCase")); + if (boolStr) + _findHistory._isMatchCase = !lstrcmp(TEXT("yes"), boolStr); + + boolStr = (findHistoryRoot->ToElement())->Attribute(TEXT("wrap")); + if (boolStr) + _findHistory._isWrap = !lstrcmp(TEXT("yes"), boolStr); + + boolStr = (findHistoryRoot->ToElement())->Attribute(TEXT("directionDown")); + if (boolStr) + _findHistory._isDirectionDown = !lstrcmp(TEXT("yes"), boolStr); + + boolStr = (findHistoryRoot->ToElement())->Attribute(TEXT("fifRecuisive")); + if (boolStr) + _findHistory._isFifRecuisive = !lstrcmp(TEXT("yes"), boolStr); + + boolStr = (findHistoryRoot->ToElement())->Attribute(TEXT("fifInHiddenFolder")); + if (boolStr) + _findHistory._isFifInHiddenFolder = !lstrcmp(TEXT("yes"), boolStr); + + boolStr = (findHistoryRoot->ToElement())->Attribute(TEXT("dlgAlwaysVisible")); + if (boolStr) + _findHistory._isDlgAlwaysVisible = !lstrcmp(TEXT("yes"), boolStr); + + boolStr = (findHistoryRoot->ToElement())->Attribute(TEXT("fifFilterFollowsDoc")); + if (boolStr) + _findHistory._isFilterFollowDoc = !lstrcmp(TEXT("yes"), boolStr); + + boolStr = (findHistoryRoot->ToElement())->Attribute(TEXT("fifFolderFollowsDoc")); + if (boolStr) + _findHistory._isFolderFollowDoc = !lstrcmp(TEXT("yes"), boolStr); + + int mode = 0; + boolStr = (findHistoryRoot->ToElement())->Attribute(TEXT("searchMode"), &mode); + if (boolStr) + _findHistory._searchMode = (FindHistory::searchMode)mode; + + boolStr = (findHistoryRoot->ToElement())->Attribute(TEXT("transparencyMode"), &mode); + if (boolStr) + _findHistory._transparencyMode = (FindHistory::transparencyMode)mode; + + (findHistoryRoot->ToElement())->Attribute(TEXT("transparency"), &_findHistory._transparency); + if (_findHistory._transparency <= 0 || _findHistory._transparency > 200) + _findHistory._transparency = 150; +} + +void NppParameters::feedShortcut(TiXmlNode *node) +{ + TiXmlNode *shortcutsRoot = node->FirstChildElement(TEXT("InternalCommands")); + if (!shortcutsRoot) return; + + for (TiXmlNode *childNode = shortcutsRoot->FirstChildElement(TEXT("Shortcut")); + childNode ; + childNode = childNode->NextSibling(TEXT("Shortcut")) ) + { + int id; + const TCHAR *idStr = (childNode->ToElement())->Attribute(TEXT("id"), &id); + if (idStr) + { + //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++) + { + if (_shortcuts[i].getID() == id) + { //found our match + getShortcuts(childNode, _shortcuts[i]); + addUserModifiedIndex(i); + } + } + } + } +} + +void NppParameters::feedMacros(TiXmlNode *node) +{ + TiXmlNode *macrosRoot = node->FirstChildElement(TEXT("Macros")); + if (!macrosRoot) return; + + for (TiXmlNode *childNode = macrosRoot->FirstChildElement(TEXT("Macro")); + childNode ; + childNode = childNode->NextSibling(TEXT("Macro")) ) + { + Shortcut sc; + if (getShortcuts(childNode, sc))// && sc.isValid()) + { + Macro macro; + getActions(childNode, macro); + int cmdID = ID_MACRO + _macros.size(); + MacroShortcut ms(sc, macro, cmdID); + //if (ms.isValid()) + _macros.push_back(ms); + } + } +} + + +void NppParameters::getActions(TiXmlNode *node, Macro & macro) +{ + for (TiXmlNode *childNode = node->FirstChildElement(TEXT("Action")); + childNode ; + childNode = childNode->NextSibling(TEXT("Action")) ) + { + int type; + const TCHAR *typeStr = (childNode->ToElement())->Attribute(TEXT("type"), &type); + if ((!typeStr) || (type > 2)) + continue; + + int msg = 0; + const TCHAR *msgStr = (childNode->ToElement())->Attribute(TEXT("message"), &msg); + + int wParam = 0; + const TCHAR *wParamStr = (childNode->ToElement())->Attribute(TEXT("wParam"), &wParam); + + int lParam = 0; + const TCHAR *lParamStr = (childNode->ToElement())->Attribute(TEXT("lParam"), &lParam); + + const TCHAR *sParam = (childNode->ToElement())->Attribute(TEXT("sParam")); + if (!sParam) + sParam = TEXT(""); + recordedMacroStep step(type, msg, wParam, lParam, sParam); + if (step.isValid()) + macro.push_back(step); + + } +} + +void NppParameters::feedUserCmds(TiXmlNode *node) +{ + TiXmlNode *userCmdsRoot = node->FirstChildElement(TEXT("UserDefinedCommands")); + if (!userCmdsRoot) return; + + for (TiXmlNode *childNode = userCmdsRoot->FirstChildElement(TEXT("Command")); + childNode ; + childNode = childNode->NextSibling(TEXT("Command")) ) + { + Shortcut sc; + if (getShortcuts(childNode, sc))// && sc.isValid()) + { + TiXmlNode *aNode = childNode->FirstChild(); + if (aNode) + { + const TCHAR *cmdStr = aNode->Value(); + if (cmdStr) + { + int cmdID = ID_USER_CMD + _userCommands.size(); + UserCommand uc(sc, cmdStr, cmdID); + //if (uc.isValid()) + _userCommands.push_back(uc); + } + } + } + } +} + +void NppParameters::feedPluginCustomizedCmds(TiXmlNode *node) +{ + TiXmlNode *pluginCustomizedCmdsRoot = node->FirstChildElement(TEXT("PluginCommands")); + if (!pluginCustomizedCmdsRoot) return; + + for (TiXmlNode *childNode = pluginCustomizedCmdsRoot->FirstChildElement(TEXT("PluginCommand")); + childNode ; + childNode = childNode->NextSibling(TEXT("PluginCommand")) ) + { + const TCHAR *moduleName = (childNode->ToElement())->Attribute(TEXT("moduleName")); + if (!moduleName) + continue; + + int internalID = -1; + const TCHAR *internalIDStr = (childNode->ToElement())->Attribute(TEXT("internalID"), &internalID); + + if (!internalIDStr) + continue; + + //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++) + { + PluginCmdShortcut & pscOrig = _pluginCommands[i]; + if (!generic_strnicmp(pscOrig.getModuleName(), moduleName, lstrlen(moduleName)) && pscOrig.getInternalID() == internalID) + { + //Found matching command + getShortcuts(childNode, _pluginCommands[i]); + addPluginModifiedIndex(i); + break; + } + } + } +} + +void NppParameters::feedScintKeys(TiXmlNode *node) +{ + TiXmlNode *scintKeysRoot = node->FirstChildElement(TEXT("ScintillaKeys")); + if (!scintKeysRoot) return; + + for (TiXmlNode *childNode = scintKeysRoot->FirstChildElement(TEXT("ScintKey")); + childNode ; + childNode = childNode->NextSibling(TEXT("ScintKey")) ) + { + int scintKey; + const TCHAR *keyStr = (childNode->ToElement())->Attribute(TEXT("ScintID"), &scintKey); + if (!keyStr) + continue; + + int menuID; + 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++) + { + ScintillaKeyMap & skmOrig = _scintillaKeyCommands[i]; + if (skmOrig.getScintillaKeyID() == scintKey &&skmOrig.getMenuCmdID() == menuID) + { + //Found matching command + _scintillaKeyCommands[i].clearDups(); + getShortcuts(childNode, _scintillaKeyCommands[i]); + _scintillaKeyCommands[i].setKeyComboByIndex(0, _scintillaKeyCommands[i].getKeyCombo()); + addScintillaModifiedIndex(i); + KeyCombo kc; + for (TiXmlNode *nextNode = childNode->FirstChildElement(TEXT("NextKey")); + nextNode ; + nextNode = childNode->NextSibling(TEXT("NextKey")) ) + { + const TCHAR *str = (nextNode->ToElement())->Attribute(TEXT("Ctrl")); + if (!str) + continue; + kc._isCtrl = !lstrcmp(TEXT("yes"), str); + + str = (nextNode->ToElement())->Attribute(TEXT("Alt")); + if (!str) + continue; + kc._isAlt = !lstrcmp(TEXT("yes"), str); + + str = (nextNode->ToElement())->Attribute(TEXT("Shift")); + if (!str) + continue; + kc._isShift = !lstrcmp(TEXT("yes"), str); + + int key; + str = (nextNode->ToElement())->Attribute(TEXT("Key"), &key); + if (!str) + continue; + kc._key = key; + _scintillaKeyCommands[i].addKeyCombo(kc); + } + break; + } + } + } +} + +bool NppParameters::getShortcuts(TiXmlNode *node, Shortcut & sc) +{ + if (!node) return false; + + const TCHAR *name = (node->ToElement())->Attribute(TEXT("name")); + if (!name) + name = TEXT(""); + + bool isCtrl = false; + const TCHAR *isCtrlStr = (node->ToElement())->Attribute(TEXT("Ctrl")); + if (isCtrlStr) + isCtrl = !lstrcmp(TEXT("yes"), isCtrlStr); + + bool isAlt = false; + const TCHAR *isAltStr = (node->ToElement())->Attribute(TEXT("Alt")); + if (isAltStr) + isAlt = !lstrcmp(TEXT("yes"), isAltStr); + + bool isShift = false; + const TCHAR *isShiftStr = (node->ToElement())->Attribute(TEXT("Shift")); + if (isShiftStr) + isShift = !lstrcmp(TEXT("yes"), isShiftStr); + + int key; + const TCHAR *keyStr = (node->ToElement())->Attribute(TEXT("Key"), &key); + if (!keyStr) + return false; + + sc = Shortcut(name, isCtrl, isAlt, isShift, key); + return true; +} + + +const int loadFailed = 100; +const int missingName = 101; +void NppParameters::feedUserLang(TiXmlNode *node) +{ + for (TiXmlNode *childNode = node->FirstChildElement(TEXT("UserLang")); + childNode && (_nbUserLang < NB_MAX_USER_LANG); + childNode = childNode->NextSibling(TEXT("UserLang")) ) + { + const TCHAR *name = (childNode->ToElement())->Attribute(TEXT("name")); + const TCHAR *ext = (childNode->ToElement())->Attribute(TEXT("ext")); + try { + if (!name || !name[0] || !ext) throw int(missingName); + + _userLangArray[_nbUserLang] = new UserLangContainer(name, ext); + _nbUserLang++; + + TiXmlNode *settingsRoot = childNode->FirstChildElement(TEXT("Settings")); + if (!settingsRoot) throw int(loadFailed); + feedUserSettings(settingsRoot); + + TiXmlNode *keywordListsRoot = childNode->FirstChildElement(TEXT("KeywordLists")); + if (!keywordListsRoot) throw int(loadFailed); + feedUserKeywordList(keywordListsRoot); + + TiXmlNode *stylesRoot = childNode->FirstChildElement(TEXT("Styles")); + if (!stylesRoot) throw int(loadFailed); + feedUserStyles(stylesRoot); + + } catch (int e) { + if (e == loadFailed) + delete _userLangArray[--_nbUserLang]; + } + } +} + +void NppParameters::writeUserDefinedLang() +{ + if (!_pXmlUserLangDoc) + { + //do the treatment + _pXmlUserLangDoc = new TiXmlDocument(_userDefineLangPath); + } + + //before remove the branch, we allocate and copy the TCHAR * which will be destroyed + stylerStrOp(DUP); + + TiXmlNode *root = _pXmlUserLangDoc->FirstChild(TEXT("NotepadPlus")); + if (root) + { + _pXmlUserLangDoc->RemoveChild(root); + } + + _pXmlUserLangDoc->InsertEndChild(TiXmlElement(TEXT("NotepadPlus"))); + + root = _pXmlUserLangDoc->FirstChild(TEXT("NotepadPlus")); + + for (int i = 0 ; i < _nbUserLang ; i++) + { + insertUserLang2Tree(root, _userLangArray[i]); + } + _pXmlUserLangDoc->SaveFile(); + stylerStrOp(FREE); +} + +void NppParameters::insertCmd(TiXmlNode *shortcutsRoot, const CommandShortcut & cmd) +{ + const KeyCombo & key = cmd.getKeyCombo(); + TiXmlNode *sc = shortcutsRoot->InsertEndChild(TiXmlElement(TEXT("Shortcut"))); + sc->ToElement()->SetAttribute(TEXT("id"), cmd.getID()); + sc->ToElement()->SetAttribute(TEXT("Ctrl"), key._isCtrl?TEXT("yes"):TEXT("no")); + sc->ToElement()->SetAttribute(TEXT("Alt"), key._isAlt?TEXT("yes"):TEXT("no")); + sc->ToElement()->SetAttribute(TEXT("Shift"), key._isShift?TEXT("yes"):TEXT("no")); + sc->ToElement()->SetAttribute(TEXT("Key"), key._key); +} + +void NppParameters::insertMacro(TiXmlNode *macrosRoot, const MacroShortcut & macro) +{ + const KeyCombo & key = macro.getKeyCombo(); + TiXmlNode *macroRoot = macrosRoot->InsertEndChild(TiXmlElement(TEXT("Macro"))); + macroRoot->ToElement()->SetAttribute(TEXT("name"), macro.getMenuName()); + macroRoot->ToElement()->SetAttribute(TEXT("Ctrl"), key._isCtrl?TEXT("yes"):TEXT("no")); + 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 ; i < macro._macro.size() ; i++) + { + TiXmlNode *actionNode = macroRoot->InsertEndChild(TiXmlElement(TEXT("Action"))); + const recordedMacroStep & action = macro._macro[i]; + actionNode->ToElement()->SetAttribute(TEXT("type"), action.MacroType); + actionNode->ToElement()->SetAttribute(TEXT("message"), action.message); + actionNode->ToElement()->SetAttribute(TEXT("wParam"), action.wParameter); + actionNode->ToElement()->SetAttribute(TEXT("lParam"), action.lParameter); + actionNode->ToElement()->SetAttribute(TEXT("sParam"), action.sParameter.c_str()); + } +} + +void NppParameters::insertUserCmd(TiXmlNode *userCmdRoot, const UserCommand & userCmd) +{ + const KeyCombo & key = userCmd.getKeyCombo(); + TiXmlNode *cmdRoot = userCmdRoot->InsertEndChild(TiXmlElement(TEXT("Command"))); + cmdRoot->ToElement()->SetAttribute(TEXT("name"), userCmd.getMenuName()); + cmdRoot->ToElement()->SetAttribute(TEXT("Ctrl"), key._isCtrl?TEXT("yes"):TEXT("no")); + cmdRoot->ToElement()->SetAttribute(TEXT("Alt"), key._isAlt?TEXT("yes"):TEXT("no")); + cmdRoot->ToElement()->SetAttribute(TEXT("Shift"), key._isShift?TEXT("yes"):TEXT("no")); + cmdRoot->ToElement()->SetAttribute(TEXT("Key"), key._key); + cmdRoot->InsertEndChild(TiXmlText(userCmd._cmd.c_str())); +} + +void NppParameters::insertPluginCmd(TiXmlNode *pluginCmdRoot, const PluginCmdShortcut & pluginCmd) +{ + const KeyCombo & key = pluginCmd.getKeyCombo(); + TiXmlNode *pluginCmdNode = pluginCmdRoot->InsertEndChild(TiXmlElement(TEXT("PluginCommand"))); + pluginCmdNode->ToElement()->SetAttribute(TEXT("moduleName"), pluginCmd.getModuleName()); + pluginCmdNode->ToElement()->SetAttribute(TEXT("internalID"), pluginCmd.getInternalID()); + pluginCmdNode->ToElement()->SetAttribute(TEXT("Ctrl"), key._isCtrl?TEXT("yes"):TEXT("no")); + pluginCmdNode->ToElement()->SetAttribute(TEXT("Alt"), key._isAlt?TEXT("yes"):TEXT("no")); + pluginCmdNode->ToElement()->SetAttribute(TEXT("Shift"), key._isShift?TEXT("yes"):TEXT("no")); + pluginCmdNode->ToElement()->SetAttribute(TEXT("Key"), key._key); +} + +void NppParameters::insertScintKey(TiXmlNode *scintKeyRoot, const ScintillaKeyMap & scintKeyMap) +{ + TiXmlNode *keyRoot = scintKeyRoot->InsertEndChild(TiXmlElement(TEXT("ScintKey"))); + keyRoot->ToElement()->SetAttribute(TEXT("ScintID"), scintKeyMap.getScintillaKeyID()); + keyRoot->ToElement()->SetAttribute(TEXT("menuCmdID"), scintKeyMap.getMenuCmdID()); + + //Add main shortcut + KeyCombo key = scintKeyMap.getKeyComboByIndex(0); + keyRoot->ToElement()->SetAttribute(TEXT("Ctrl"), key._isCtrl?TEXT("yes"):TEXT("no")); + keyRoot->ToElement()->SetAttribute(TEXT("Alt"), key._isAlt?TEXT("yes"):TEXT("no")); + keyRoot->ToElement()->SetAttribute(TEXT("Shift"), key._isShift?TEXT("yes"):TEXT("no")); + keyRoot->ToElement()->SetAttribute(TEXT("Key"), key._key); + + //Add additional shortcuts + size_t size = scintKeyMap.getSize(); + if (size > 1) { + TiXmlNode * keyNext; + 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")); + keyNext->ToElement()->SetAttribute(TEXT("Alt"), key._isAlt?TEXT("yes"):TEXT("no")); + keyNext->ToElement()->SetAttribute(TEXT("Shift"), key._isShift?TEXT("yes"):TEXT("no")); + keyNext->ToElement()->SetAttribute(TEXT("Key"), key._key); + } + } +} + +void NppParameters::writeSession(const Session & session, const TCHAR *fileName) +{ + const TCHAR *pathName = fileName?fileName:_sessionPath; + + _pXmlSessionDoc = new TiXmlDocument(pathName); + TiXmlNode *root = _pXmlSessionDoc->InsertEndChild(TiXmlElement(TEXT("NotepadPlus"))); + + if (root) + { + TiXmlNode *sessionNode = root->InsertEndChild(TiXmlElement(TEXT("Session"))); + (sessionNode->ToElement())->SetAttribute(TEXT("activeView"), (int)session._activeView); + + TiXmlNode *mainViewNode = sessionNode->InsertEndChild(TiXmlElement(TEXT("mainView"))); + (mainViewNode->ToElement())->SetAttribute(TEXT("activeIndex"), (int)session._activeMainIndex); + for (size_t i = 0 ; i < session._mainViewFiles.size() ; i++) + { + TiXmlNode *fileNameNode = mainViewNode->InsertEndChild(TiXmlElement(TEXT("File"))); + + (fileNameNode->ToElement())->SetAttribute(TEXT("firstVisibleLine"), session._mainViewFiles[i]._firstVisibleLine); + (fileNameNode->ToElement())->SetAttribute(TEXT("xOffset"), session._mainViewFiles[i]._xOffset); + (fileNameNode->ToElement())->SetAttribute(TEXT("scrollWidth"), session._mainViewFiles[i]._scrollWidth); + (fileNameNode->ToElement())->SetAttribute(TEXT("startPos"), session._mainViewFiles[i]._startPos); + (fileNameNode->ToElement())->SetAttribute(TEXT("endPos"), session._mainViewFiles[i]._endPos); + (fileNameNode->ToElement())->SetAttribute(TEXT("selMode"), session._mainViewFiles[i]._selMode); + (fileNameNode->ToElement())->SetAttribute(TEXT("lang"), session._mainViewFiles[i]._langName.c_str()); + (fileNameNode->ToElement())->SetAttribute(TEXT("filename"), session._mainViewFiles[i]._fileName.c_str()); + + for (size_t j = 0 ; j < session._mainViewFiles[i].marks.size() ; j++) + { + size_t markLine = session._mainViewFiles[i].marks[j]; + TiXmlNode *markNode = fileNameNode->InsertEndChild(TiXmlElement(TEXT("Mark"))); + markNode->ToElement()->SetAttribute(TEXT("line"), markLine); + } + } + + TiXmlNode *subViewNode = sessionNode->InsertEndChild(TiXmlElement(TEXT("subView"))); + (subViewNode->ToElement())->SetAttribute(TEXT("activeIndex"), (int)session._activeSubIndex); + for (size_t i = 0 ; i < session._subViewFiles.size() ; i++) + { + TiXmlNode *fileNameNode = subViewNode->InsertEndChild(TiXmlElement(TEXT("File"))); + + (fileNameNode->ToElement())->SetAttribute(TEXT("firstVisibleLine"), session._subViewFiles[i]._firstVisibleLine); + (fileNameNode->ToElement())->SetAttribute(TEXT("xOffset"), session._subViewFiles[i]._xOffset); + (fileNameNode->ToElement())->SetAttribute(TEXT("scrollWidth"), session._subViewFiles[i]._scrollWidth); + (fileNameNode->ToElement())->SetAttribute(TEXT("startPos"), session._subViewFiles[i]._startPos); + (fileNameNode->ToElement())->SetAttribute(TEXT("endPos"), session._subViewFiles[i]._endPos); + (fileNameNode->ToElement())->SetAttribute(TEXT("selMode"), session._subViewFiles[i]._selMode); + (fileNameNode->ToElement())->SetAttribute(TEXT("lang"), session._subViewFiles[i]._langName.c_str()); + (fileNameNode->ToElement())->SetAttribute(TEXT("filename"), session._subViewFiles[i]._fileName.c_str()); + + for (size_t j = 0 ; j < session._subViewFiles[i].marks.size() ; j++) + { + size_t markLine = session._subViewFiles[i].marks[j]; + TiXmlNode *markNode = fileNameNode->InsertEndChild(TiXmlElement(TEXT("Mark"))); + markNode->ToElement()->SetAttribute(TEXT("line"), markLine); + } + } + } + _pXmlSessionDoc->SaveFile(); + +} + +void NppParameters::writeShortcuts() +{ + if (!_pXmlShortcutDoc) + { + //do the treatment + _pXmlShortcutDoc = new TiXmlDocument(_shortcutsPath); + } + + TiXmlNode *root = _pXmlShortcutDoc->FirstChild(TEXT("NotepadPlus")); + if (!root) + { + root = _pXmlShortcutDoc->InsertEndChild(TiXmlElement(TEXT("NotepadPlus"))); + } + + TiXmlNode *cmdRoot = root->FirstChild(TEXT("InternalCommands")); + if (cmdRoot) + root->RemoveChild(cmdRoot); + + cmdRoot = root->InsertEndChild(TiXmlElement(TEXT("InternalCommands"))); + for (size_t i = 0 ; i < _customizedShortcuts.size() ; i++) + { + int index = _customizedShortcuts[i]; + CommandShortcut csc = _shortcuts[index]; + insertCmd(cmdRoot, csc); + } + + TiXmlNode *macrosRoot = root->FirstChild(TEXT("Macros")); + if (macrosRoot) + root->RemoveChild(macrosRoot); + + macrosRoot = root->InsertEndChild(TiXmlElement(TEXT("Macros"))); + + for (size_t i = 0 ; i < _macros.size() ; i++) + { + insertMacro(macrosRoot, _macros[i]); + } + + TiXmlNode *userCmdRoot = root->FirstChild(TEXT("UserDefinedCommands")); + if (userCmdRoot) + root->RemoveChild(userCmdRoot); + + userCmdRoot = root->InsertEndChild(TiXmlElement(TEXT("UserDefinedCommands"))); + + for (size_t i = 0 ; i < _userCommands.size() ; i++) + { + insertUserCmd(userCmdRoot, _userCommands[i]); + } + + TiXmlNode *pluginCmdRoot = root->FirstChild(TEXT("PluginCommands")); + if (pluginCmdRoot) + root->RemoveChild(pluginCmdRoot); + + pluginCmdRoot = root->InsertEndChild(TiXmlElement(TEXT("PluginCommands"))); + for (size_t i = 0 ; i < _pluginCustomizedCmds.size() ; i++) + { + insertPluginCmd(pluginCmdRoot, _pluginCommands[_pluginCustomizedCmds[i]]); + } + + TiXmlNode *scitillaKeyRoot = root->FirstChild(TEXT("ScintillaKeys")); + if (scitillaKeyRoot) + root->RemoveChild(scitillaKeyRoot); + + scitillaKeyRoot = root->InsertEndChild(TiXmlElement(TEXT("ScintillaKeys"))); + for (size_t i = 0 ; i < _scintillaModifiedKeyIndices.size() ; i++) + { + insertScintKey(scitillaKeyRoot, _scintillaKeyCommands[_scintillaModifiedKeyIndices[i]]); + } + _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; + _nbUserLang++; + return _nbUserLang-1; +} + +void NppParameters::removeUserLang(int index) +{ + if (index >= _nbUserLang ) + return; + delete _userLangArray[index]; + for (int i = index ; i < (_nbUserLang - 1) ; i++) + _userLangArray[i] = _userLangArray[i+1]; + _nbUserLang--; +} + +int NppParameters::getIndexFromKeywordListName(const TCHAR *name) +{ + if (!name) return -1; + if (!lstrcmp(name, TEXT("Folder+"))) return 1; + else if (!lstrcmp(name, TEXT("Folder-"))) return 2; + else if (!lstrcmp(name, TEXT("Operators")))return 3; + else if (!lstrcmp(name, TEXT("Comment"))) return 4; + else if (!lstrcmp(name, TEXT("Words1"))) return 5; + else if (!lstrcmp(name, TEXT("Words2"))) return 6; + else if (!lstrcmp(name, TEXT("Words3"))) return 7; + else if (!lstrcmp(name, TEXT("Words4"))) return 8; + else if (!lstrcmp(name, TEXT("Delimiters"))) return 0; + else return -1; +} +void NppParameters::feedUserSettings(TiXmlNode *settingsRoot) +{ + const TCHAR *boolStr; + TiXmlNode *globalSettingNode = settingsRoot->FirstChildElement(TEXT("Global")); + if (globalSettingNode) + { + boolStr = (globalSettingNode->ToElement())->Attribute(TEXT("caseIgnored")); + if (boolStr) + _userLangArray[_nbUserLang - 1]->_isCaseIgnored = !lstrcmp(TEXT("yes"), boolStr); + } + TiXmlNode *treatAsSymbolNode = settingsRoot->FirstChildElement(TEXT("TreatAsSymbol")); + if (treatAsSymbolNode) + { + boolStr = (treatAsSymbolNode->ToElement())->Attribute(TEXT("comment")); + if (boolStr) + _userLangArray[_nbUserLang - 1]->_isCommentSymbol = !lstrcmp(TEXT("yes"), boolStr); + + boolStr = (treatAsSymbolNode->ToElement())->Attribute(TEXT("commentLine")); + if (boolStr) + _userLangArray[_nbUserLang - 1]->_isCommentLineSymbol = !lstrcmp(TEXT("yes"), boolStr); + } + TiXmlNode *prefixNode = settingsRoot->FirstChildElement(TEXT("Prefix")); + if (prefixNode) + { + TCHAR names[nbPrefixListAllowed][7] = {TEXT("words1"), TEXT("words2"), TEXT("words3"), TEXT("words4")}; + for (int i = 0 ; i < nbPrefixListAllowed ; i++) + { + boolStr = (prefixNode->ToElement())->Attribute(names[i]); + if (boolStr) + _userLangArray[_nbUserLang - 1]->_isPrefix[i] = !lstrcmp(TEXT("yes"), boolStr); + } + } +} + +void NppParameters::feedUserKeywordList(TiXmlNode *node) +{ + for (TiXmlNode *childNode = node->FirstChildElement(TEXT("Keywords")); + childNode ; + childNode = childNode->NextSibling(TEXT("Keywords"))) + { + const TCHAR *keywordsName = (childNode->ToElement())->Attribute(TEXT("name")); + int i = getIndexFromKeywordListName(keywordsName); + if (i != -1) + { + TiXmlNode *valueNode = childNode->FirstChild(); + if (valueNode) + { + const TCHAR *kwl = (valueNode)?valueNode->Value():(lstrcmp(keywordsName, TEXT("Delimiters"))?TEXT(""):TEXT("000000")); + lstrcpy(_userLangArray[_nbUserLang - 1]->_keywordLists[i], kwl); + } + } + } +} + +void NppParameters::feedUserStyles(TiXmlNode *node) +{ + for (TiXmlNode *childNode = node->FirstChildElement(TEXT("WordsStyle")); + childNode ; + childNode = childNode->NextSibling(TEXT("WordsStyle"))) + { + int id; + const TCHAR *styleIDStr = (childNode->ToElement())->Attribute(TEXT("styleID"), &id); + if (styleIDStr) + { + _userLangArray[_nbUserLang - 1]->_styleArray.addStyler(id, childNode); + } + } +} + +bool NppParameters::feedStylerArray(TiXmlNode *node) +{ + TiXmlNode *styleRoot = node->FirstChildElement(TEXT("LexerStyles")); + if (!styleRoot) return false; + + // For each lexer + for (TiXmlNode *childNode = styleRoot->FirstChildElement(TEXT("LexerType")); + childNode ; + childNode = childNode->NextSibling(TEXT("LexerType")) ) + { + if (!_lexerStylerArray.hasEnoughSpace()) return false; + + 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 (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; + + for (TiXmlNode *childNode = globalStyleRoot->FirstChildElement(TEXT("WidgetStyle")); + childNode ; + childNode = childNode->NextSibling(TEXT("WidgetStyle")) ) + { + if (!_widgetStyleArray.hasEnoughSpace()) return false; + + TiXmlElement *element = childNode->ToElement(); + const TCHAR *styleIDStr = element->Attribute(TEXT("styleID")); + + int styleID = -1; + if ((styleID = decStrVal(styleIDStr)) != -1) + { + _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); + if (lexerDesc) + ls.setLexerDesc(lexerDesc); + + if (lexerUserExt) + ls.setLexerUserExt(lexerUserExt); + + for (TiXmlNode *childNode = lexerNode->FirstChildElement(TEXT("WordsStyle")); + childNode ; + childNode = childNode->NextSibling(TEXT("WordsStyle")) ) + { + + if (!ls.hasEnoughSpace()) return; + + TiXmlElement *element = childNode->ToElement(); + const TCHAR *styleIDStr = element->Attribute(TEXT("styleID")); + + if (styleIDStr) + { + int styleID = -1; + if ((styleID = decStrVal(styleIDStr)) != -1) + { + ls.addStyler(styleID, childNode); + } + } + } +} + +void LexerStylerArray::eraseAll() +{ + + for (int i = 0 ; i < _nbLexerStyler ; i++) + { + _lexerStylerArray[i].setNbStyler( 0 ); + } + + _nbLexerStyler = 0; +} + +void StyleArray::addStyler(int styleID, TiXmlNode *styleNode) +{ + _styleArray[_nbStyler]._styleID = styleID; + + if (styleNode) + { + TiXmlElement *element = styleNode->ToElement(); + + // Pour _fgColor, _bgColor : + // RGB() | (result & 0xFF000000) c'est pour le cas de -1 (0xFFFFFFFF) + // retourné par hexStrVal(str) + const TCHAR *str = element->Attribute(TEXT("name")); + if (str) + { + _styleArray[_nbStyler]._styleDesc = str; + } + + str = element->Attribute(TEXT("fgColor")); + if (str) + { + unsigned long result = hexStrVal(str); + _styleArray[_nbStyler]._fgColor = (RGB((result >> 16) & 0xFF, (result >> 8) & 0xFF, result & 0xFF)) | (result & 0xFF000000); + + } + + str = element->Attribute(TEXT("bgColor")); + if (str) + { + unsigned long result = hexStrVal(str); + _styleArray[_nbStyler]._bgColor = (RGB((result >> 16) & 0xFF, (result >> 8) & 0xFF, result & 0xFF)) | (result & 0xFF000000); + } + + str = element->Attribute(TEXT("colorStyle")); + if (str) + { + _styleArray[_nbStyler]._colorStyle = decStrVal(str); + } + + str = element->Attribute(TEXT("fontName")); + _styleArray[_nbStyler]._fontName = str; + + str = element->Attribute(TEXT("fontStyle")); + if (str) + { + _styleArray[_nbStyler]._fontStyle = decStrVal(str); + } + + str = element->Attribute(TEXT("fontSize")); + if (str) + { + _styleArray[_nbStyler]._fontSize = decStrVal(str); + } + + str = element->Attribute(TEXT("keywordClass")); + if (str) + { + _styleArray[_nbStyler]._keywordClass = getKwClassFromName(str); + } + + TiXmlNode *v = styleNode->FirstChild(); + if (v) + { + _styleArray[_nbStyler]._keywords = new generic_string(v->Value()); + } + } + _nbStyler++; +} + +bool NppParameters::writeHistory(const TCHAR *fullpath) +{ + TiXmlNode *nppRoot = _pXmlUserDoc->FirstChild(TEXT("NotepadPlus")); + if (!nppRoot) return false; + + TiXmlNode *historyNode = nppRoot->FirstChildElement(TEXT("History")); + if (!historyNode) return false; + + TiXmlElement recentFileNode(TEXT("File")); + (recentFileNode.ToElement())->SetAttribute(TEXT("filename"), fullpath); + + (historyNode->ToElement())->InsertEndChild(recentFileNode); + return true; +} + +TiXmlNode * NppParameters::getChildElementByAttribut(TiXmlNode *pere, const TCHAR *childName,\ + const TCHAR *attributName, const TCHAR *attributVal) const +{ + for (TiXmlNode *childNode = pere->FirstChildElement(childName); + childNode ; + childNode = childNode->NextSibling(childName)) + { + TiXmlElement *element = childNode->ToElement(); + const TCHAR *val = element->Attribute(attributName); + if (val) + { + if (!lstrcmp(val, attributVal)) + return childNode; + } + } + return NULL; +} + +// 2 restes : L_H, L_USER +LangType NppParameters::getLangIDFromStr(const TCHAR *langName) +{ + int lang = (int)L_TXT; + for(; lang < L_EXTERNAL; lang++) { + const TCHAR * name = ScintillaEditView::langNames[lang].lexerName; + if (!lstrcmp(name, langName)) { //found lang? + return (LangType)lang; + } + } + + //Cannot find language, check if its an external one + + LangType l = (LangType)lang; + if (l == L_EXTERNAL) { //try find external lexer + int id = _pSelf->getExternalLangIndexFromName(langName); + if (id != -1) return (LangType)(id + L_EXTERNAL); + } + + return L_TXT; +} + +void NppParameters::feedKeyWordsParameters(TiXmlNode *node) +{ + + TiXmlNode *langRoot = node->FirstChildElement(TEXT("Languages")); + if (!langRoot) return; + + for (TiXmlNode *langNode = langRoot->FirstChildElement(TEXT("Language")); + langNode ; + langNode = langNode->NextSibling(TEXT("Language")) ) + { + if (_nbLang < NB_LANG) + { + TiXmlElement *element = langNode->ToElement(); + const TCHAR *name = element->Attribute(TEXT("name")); + if (name) + { + _langList[_nbLang] = new Lang(getLangIDFromStr(name), name); + _langList[_nbLang]->setDefaultExtList(element->Attribute(TEXT("ext"))); + _langList[_nbLang]->setCommentLineSymbol(element->Attribute(TEXT("commentLine"))); + _langList[_nbLang]->setCommentStart(element->Attribute(TEXT("commentStart"))); + _langList[_nbLang]->setCommentEnd(element->Attribute(TEXT("commentEnd"))); + + for (TiXmlNode *kwNode = langNode->FirstChildElement(TEXT("Keywords")); + kwNode ; + kwNode = kwNode->NextSibling(TEXT("Keywords")) ) + { + const TCHAR *indexName = (kwNode->ToElement())->Attribute(TEXT("name")); + TiXmlNode *kwVal = kwNode->FirstChild(); + const TCHAR *keyWords = TEXT(""); + if ((indexName) && (kwVal)) + keyWords = kwVal->Value(); + + int i = getKwClassFromName(indexName); + + if (i >= 0 && i <= KEYWORDSET_MAX) + _langList[_nbLang]->setWords(keyWords, i); + } + _nbLang++; + } + } + } +} + +extern "C" { +typedef DWORD (WINAPI * EESFUNC) (LPCTSTR, LPTSTR, DWORD); +} + +void NppParameters::feedGUIParameters(TiXmlNode *node) +{ + TiXmlNode *GUIRoot = node->FirstChildElement(TEXT("GUIConfigs")); + if (!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; + + if (!lstrcmp(nm, TEXT("ToolBar"))) + { + val = element->Attribute(TEXT("visible")); + if (val) + { + if (!lstrcmp(val, TEXT("no"))) + _nppGUI._toolbarShow = false; + else// if (!lstrcmp(val, TEXT("yes"))) + _nppGUI._toolbarShow = true; + } + TiXmlNode *n = childNode->FirstChild(); + if (n) + { + val = n->Value(); + if (val) + { + if (!lstrcmp(val, TEXT("small"))) + _nppGUI._toolBarStatus = TB_SMALL; + else if (!lstrcmp(val, TEXT("large"))) + _nppGUI._toolBarStatus = TB_LARGE; + else// if (!lstrcmp(val, TEXT("standard"))) //assume standard in all other cases + _nppGUI._toolBarStatus = TB_STANDARD; + } + } + } + else if (!lstrcmp(nm, TEXT("StatusBar"))) + { + TiXmlNode *n = childNode->FirstChild(); + if (n) + { + val = n->Value(); + if (val) + { + if (!lstrcmp(val, TEXT("hide"))) + _nppGUI._statusBarShow = false; + else if (!lstrcmp(val, TEXT("show"))) + _nppGUI._statusBarShow = true; + } + } + } + else if (!lstrcmp(nm, TEXT("MenuBar"))) + { + TiXmlNode *n = childNode->FirstChild(); + if (n) + { + val = n->Value(); + if (val) + { + if (!lstrcmp(val, TEXT("hide"))) + _nppGUI._menuBarShow = false; + else if (!lstrcmp(val, TEXT("show"))) + _nppGUI._menuBarShow = true; + } + } + } + else if (!lstrcmp(nm, TEXT("TabBar"))) + { + bool isFailed = false; + int oldValue = _nppGUI._tabStatus; + val = element->Attribute(TEXT("dragAndDrop")); + if (val) + { + if (!lstrcmp(val, TEXT("yes"))) + _nppGUI._tabStatus = TAB_DRAGNDROP; + else if (!lstrcmp(val, TEXT("no"))) + _nppGUI._tabStatus = 0; + else + isFailed = true; + } + + val = element->Attribute(TEXT("drawTopBar")); + if (val) + { + if (!lstrcmp(val, TEXT("yes"))) + _nppGUI._tabStatus |= TAB_DRAWTOPBAR; + else if (!lstrcmp(val, TEXT("no"))) + _nppGUI._tabStatus |= 0; + else + isFailed = true; + } + + val = element->Attribute(TEXT("drawInactiveTab")); + if (val) + { + if (!lstrcmp(val, TEXT("yes"))) + _nppGUI._tabStatus |= TAB_DRAWINACTIVETAB; + else if (!lstrcmp(val, TEXT("no"))) + _nppGUI._tabStatus |= 0; + else + isFailed = true; + } + + val = element->Attribute(TEXT("reduce")); + if (val) + { + if (!lstrcmp(val, TEXT("yes"))) + _nppGUI._tabStatus |= TAB_REDUCE; + else if (!lstrcmp(val, TEXT("no"))) + _nppGUI._tabStatus |= 0; + else + isFailed = true; + } + + val = element->Attribute(TEXT("closeButton")); + if (val) + { + if (!lstrcmp(val, TEXT("yes"))) + _nppGUI._tabStatus |= TAB_CLOSEBUTTON; + else if (!lstrcmp(val, TEXT("no"))) + _nppGUI._tabStatus |= 0; + else + isFailed = true; + } + + val = element->Attribute(TEXT("doubleClick2Close")); + if (val) + { + if (!lstrcmp(val, TEXT("yes"))) + _nppGUI._tabStatus |= TAB_DBCLK2CLOSE; + else if (!lstrcmp(val, TEXT("no"))) + _nppGUI._tabStatus |= 0; + else + isFailed = true; + } + val = element->Attribute(TEXT("vertical")); + if (val) + { + if (!lstrcmp(val, TEXT("yes"))) + _nppGUI._tabStatus |= TAB_VERTICAL; + else if (!lstrcmp(val, TEXT("no"))) + _nppGUI._tabStatus |= 0; + else + isFailed = true; + } + + val = element->Attribute(TEXT("multiLine")); + if (val) + { + if (!lstrcmp(val, TEXT("yes"))) + _nppGUI._tabStatus |= TAB_MULTILINE; + else if (!lstrcmp(val, TEXT("no"))) + _nppGUI._tabStatus |= 0; + else + isFailed = true; + } + val = element->Attribute(TEXT("hide")); + if (val) + { + if (!lstrcmp(val, TEXT("yes"))) + _nppGUI._tabStatus |= TAB_HIDE; + else if (!lstrcmp(val, TEXT("no"))) + _nppGUI._tabStatus |= 0; + else + isFailed = true; + } + if (isFailed) + _nppGUI._tabStatus = oldValue; + + + } + else if (!lstrcmp(nm, TEXT("Auto-detection"))) + { + TiXmlNode *n = childNode->FirstChild(); + if (n) + { + val = n->Value(); + if (val) + { + if (!lstrcmp(val, TEXT("yes"))) + _nppGUI._fileAutoDetection = cdEnabled; + else if (!lstrcmp(val, TEXT("auto"))) + _nppGUI._fileAutoDetection = cdAutoUpdate; + else if (!lstrcmp(val, TEXT("Update2End"))) + _nppGUI._fileAutoDetection = cdGo2end; + else if (!lstrcmp(val, TEXT("autoUpdate2End"))) + _nppGUI._fileAutoDetection = cdAutoUpdateGo2end; + else //(!lstrcmp(val, TEXT("no"))) + _nppGUI._fileAutoDetection = cdDisabled; + + _nppGUI._fileAutoDetectionOriginalValue = _nppGUI._fileAutoDetection; + } + } + } + + else if (!lstrcmp(nm, TEXT("TrayIcon"))) + { + TiXmlNode *n = childNode->FirstChild(); + if (n) + { + val = n->Value(); + if (val) + { + if (!lstrcmp(val, TEXT("yes"))) + _nppGUI._isMinimizedToTray = true; + } + } + } + else if (!lstrcmp(nm, TEXT("RememberLastSession"))) + { + TiXmlNode *n = childNode->FirstChild(); + if (n) + { + val = n->Value(); + if (val) + { + if (!lstrcmp(val, TEXT("yes"))) + _nppGUI._rememberLastSession = true; + else + _nppGUI._rememberLastSession = false; + } + } + } + + else if (!lstrcmp(nm, TEXT("MaitainIndent"))) + { + TiXmlNode *n = childNode->FirstChild(); + if (n) + { + val = n->Value(); + if (val) + { + if (!lstrcmp(val, TEXT("yes"))) + _nppGUI._maitainIndent = true; + else + _nppGUI._maitainIndent = false; + } + } + } + + else if (!lstrcmp(nm, TEXT("SmartHighLight"))) + { + TiXmlNode *n = childNode->FirstChild(); + if (n) + { + val = n->Value(); + if (val) + { + if (!lstrcmp(val, TEXT("yes"))) + _nppGUI._enableSmartHilite = true; + else + _nppGUI._enableSmartHilite = false; + } + } + } + + else if (!lstrcmp(nm, TEXT("TagsMatchHighLight"))) + { + TiXmlNode *n = childNode->FirstChild(); + if (n) + { + val = n->Value(); + if (val) + { + _nppGUI._enableTagsMatchHilite = !lstrcmp(val, TEXT("yes")); + const TCHAR *tahl = element->Attribute(TEXT("TagAttrHighLight")); + if (tahl) + _nppGUI._enableTagAttrsHilite = !lstrcmp(tahl, TEXT("yes")); + + tahl = element->Attribute(TEXT("HighLightNonHtmlZone")); + if (tahl) + _nppGUI._enableHiliteNonHTMLZone = !lstrcmp(tahl, TEXT("yes")); + } + } + } + + else if (!lstrcmp(nm, TEXT("TaskList"))) + { + TiXmlNode *n = childNode->FirstChild(); + if (n) + { + val = n->Value(); + if (val) + { + _nppGUI._doTaskList = (!lstrcmp(val, TEXT("yes")))?true:false; + } + } + } + + else if (!lstrcmp(nm, TEXT("MRU"))) + { + TiXmlNode *n = childNode->FirstChild(); + if (n) + { + val = n->Value(); + if (val) + { + _nppGUI._styleMRU = (!lstrcmp(val, TEXT("yes")))?true:false; + } + } + } + + else if (!lstrcmp(nm, TEXT("URL"))) + { + TiXmlNode *n = childNode->FirstChild(); + if (n) + { + val = n->Value(); + if (val) + { + if (!lstrcmp(val, TEXT("1"))) + _nppGUI._styleURL = 1; + else if (!lstrcmp(val, TEXT("2"))) + _nppGUI._styleURL = 2; + else + _nppGUI._styleURL = 0; + } + } + } + + else if (!lstrcmp(nm, TEXT("CheckHistoryFiles"))) + { + TiXmlNode *n = childNode->FirstChild(); + if (n) + { + val = n->Value(); + if (val) + { + if (!lstrcmp(val, TEXT("no"))) + _nppGUI._checkHistoryFiles = false; + } + } + } + else if (!lstrcmp(nm, TEXT("ScintillaViewsSplitter"))) + { + TiXmlNode *n = childNode->FirstChild(); + if (n) + { + val = n->Value(); + if (val) + { + if (!lstrcmp(val, TEXT("vertical"))) + _nppGUI._splitterPos = POS_VERTICAL; + else if (!lstrcmp(val, TEXT("horizontal"))) + _nppGUI._splitterPos = POS_HORIZOTAL; + } + } + } + else if (!lstrcmp(nm, TEXT("UserDefineDlg"))) + { + bool isFailed = false; + int oldValue = _nppGUI._userDefineDlgStatus; + + TiXmlNode *n = childNode->FirstChild(); + if (n) + { + val = n->Value(); + if (val) + { + if (!lstrcmp(val, TEXT("hide"))) + _nppGUI._userDefineDlgStatus = 0; + else if (!lstrcmp(val, TEXT("show"))) + _nppGUI._userDefineDlgStatus = UDD_SHOW; + else + isFailed = true; + } + } + 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 + isFailed = true; + } + if (isFailed) + _nppGUI._userDefineDlgStatus = oldValue; + } + else if (!lstrcmp(nm, TEXT("TabSetting"))) + { + int i; + val = element->Attribute(TEXT("size"), &i); + if (val) + _nppGUI._tabSize = i; + + if ((_nppGUI._tabSize == -1) || (_nppGUI._tabSize == 0)) + _nppGUI._tabSize = 8; + + val = element->Attribute(TEXT("replaceBySpace")); + if (val) + _nppGUI._tabReplacedBySpace = (!lstrcmp(val, TEXT("yes"))); + } + + else if (!lstrcmp(nm, TEXT("Caret"))) + { + int i; + val = element->Attribute(TEXT("width"), &i); + if (val) + _nppGUI._caretWidth = i; + + val = element->Attribute(TEXT("blinkRate"), &i); + if (val) + _nppGUI._caretBlinkRate = i; + } + + else if (!lstrcmp(nm, TEXT("AppPosition"))) + { + RECT oldRect = _nppGUI._appPos; + bool fuckUp = true; + int i; + + if (element->Attribute(TEXT("x"), &i)) + { + _nppGUI._appPos.left = i; + + if (element->Attribute(TEXT("y"), &i)) + { + _nppGUI._appPos.top = i; + + if (element->Attribute(TEXT("width"), &i)) + { + _nppGUI._appPos.right = i; + + if (element->Attribute(TEXT("height"), &i)) + { + _nppGUI._appPos.bottom = i; + fuckUp = false; + } + } + } + } + if (fuckUp) + _nppGUI._appPos = oldRect; + + + if (val = element->Attribute(TEXT("isMaximized"))) + { + _nppGUI._isMaximized = (lstrcmp(val, TEXT("yes")) == 0); + } + } + else if (!lstrcmp(nm, TEXT("NewDocDefaultSettings"))) + { + int i; + if (element->Attribute(TEXT("format"), &i)) + _nppGUI._newDocDefaultSettings._format = (formatType)i; + + if (element->Attribute(TEXT("encoding"), &i)) + _nppGUI._newDocDefaultSettings._encoding = (UniMode)i; + + if (element->Attribute(TEXT("lang"), &i)) + _nppGUI._newDocDefaultSettings._lang = (LangType)i; + + if (val = element->Attribute(TEXT("openAnsiAsUTF8"))) + _nppGUI._newDocDefaultSettings._openAnsiAsUtf8 = (lstrcmp(val, TEXT("yes")) == 0); + + } + else if (!lstrcmp(nm, TEXT("langsExcluded"))) + { + int g0 = 0; // up to 8 + int g1 = 0; // up to 16 + int g2 = 0; // up to 24 + int g3 = 0; // up to 32 + int g4 = 0; // up to 40 + int g5 = 0; // up to 48 + int g6 = 0; // up to 56 + 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; + + bool langArray[nbMax]; + for (int i = 0 ; i < nbMax ; i++) langArray[i] = false; + + UCHAR mask = 1; + for (int i = 0 ; i < 8 ; i++) + { + if (mask & g0) + _nppGUI._excludedLangList.push_back(LangMenuItem((LangType)i)); + mask <<= 1; + } + + mask = 1; + for (int i = 8 ; i < 16 ; i++) + { + if (mask & g1) + _nppGUI._excludedLangList.push_back(LangMenuItem((LangType)i)); + mask <<= 1; + } + + mask = 1; + for (int i = 16 ; i < 24 ; i++) + { + if (mask & g2) + _nppGUI._excludedLangList.push_back(LangMenuItem((LangType)i)); + mask <<= 1; + } + + mask = 1; + for (int i = 24 ; i < 32 ; i++) + { + if (mask & g3) + _nppGUI._excludedLangList.push_back(LangMenuItem((LangType)i)); + mask <<= 1; + } + + mask = 1; + for (int i = 32 ; i < 40 ; i++) + { + if (mask & g4) + _nppGUI._excludedLangList.push_back(LangMenuItem((LangType)i)); + mask <<= 1; + } + + mask = 1; + for (int i = 40 ; i < 48 ; i++) + { + if (mask & g5) + _nppGUI._excludedLangList.push_back(LangMenuItem((LangType)i)); + mask <<= 1; + } + + mask = 1; + for (int i = 48 ; i < 56 ; i++) + { + if (mask & g6) + _nppGUI._excludedLangList.push_back(LangMenuItem((LangType)i)); + mask <<= 1; + } + + mask = 1; + for (int i = 56 ; i < 64 ; i++) + { + if (mask & g7) + _nppGUI._excludedLangList.push_back(LangMenuItem((LangType)i)); + mask <<= 1; + } + + val = element->Attribute(TEXT("langMenuCompact")); + if (val) + _nppGUI._isLangMenuCompact = (!lstrcmp(val, TEXT("yes"))); + } + + else if (!lstrcmp(nm, TEXT("Print"))) + { + val = element->Attribute(TEXT("lineNumber")); + if (val) + _nppGUI._printSettings._printLineNumber = (!lstrcmp(val, TEXT("yes"))); + + int i; + if (element->Attribute(TEXT("printOption"), &i)) + _nppGUI._printSettings._printOption = i; + + val = element->Attribute(TEXT("headerLeft")); + if (val) + _nppGUI._printSettings._headerLeft = val; + + val = element->Attribute(TEXT("headerMiddle")); + if (val) + _nppGUI._printSettings._headerMiddle = val; + + val = element->Attribute(TEXT("headerRight")); + if (val) + _nppGUI._printSettings._headerRight = val; + + + val = element->Attribute(TEXT("footerLeft")); + if (val) + _nppGUI._printSettings._footerLeft = val; + + val = element->Attribute(TEXT("footerMiddle")); + if (val) + _nppGUI._printSettings._footerMiddle = val; + + val = element->Attribute(TEXT("footerRight")); + if (val) + _nppGUI._printSettings._footerRight = val; + + + val = element->Attribute(TEXT("headerFontName")); + if (val) + _nppGUI._printSettings._headerFontName = val; + + val = element->Attribute(TEXT("footerFontName")); + if (val) + _nppGUI._printSettings._footerFontName = val; + + if (element->Attribute(TEXT("headerFontStyle"), &i)) + _nppGUI._printSettings._headerFontStyle = i; + + if (element->Attribute(TEXT("footerFontStyle"), &i)) + _nppGUI._printSettings._footerFontStyle = i; + + if (element->Attribute(TEXT("headerFontSize"), &i)) + _nppGUI._printSettings._headerFontSize = i; + + if (element->Attribute(TEXT("footerFontSize"), &i)) + _nppGUI._printSettings._footerFontSize = i; + + + if (element->Attribute(TEXT("margeLeft"), &i)) + _nppGUI._printSettings._marge.left = i; + + if (element->Attribute(TEXT("margeTop"), &i)) + _nppGUI._printSettings._marge.top = i; + + if (element->Attribute(TEXT("margeRight"), &i)) + _nppGUI._printSettings._marge.right = i; + + if (element->Attribute(TEXT("margeBottom"), &i)) + _nppGUI._printSettings._marge.bottom = i; + } + + else if (!lstrcmp(nm, TEXT("ScintillaPrimaryView"))) + { + feedScintillaParam(SCIV_PRIMARY, element); + } + else if (!lstrcmp(nm, TEXT("ScintillaSecondaryView"))) + { + feedScintillaParam(SCIV_SECOND, element); + } + else if (!lstrcmp(nm, TEXT("Backup"))) + { + int i; + if (element->Attribute(TEXT("action"), &i)) + _nppGUI._backup = (BackupFeature)i; + + const TCHAR *bDir = element->Attribute(TEXT("useCustumDir")); + if (bDir && !lstrcmp(bDir, TEXT("yes"))) + { + _nppGUI._useDir = true; + } + const TCHAR *pDir = element->Attribute(TEXT("dir")); + if (pDir) + lstrcpy(_nppGUI._backupDir, pDir); + } + else if (!lstrcmp(nm, TEXT("DockingManager"))) + { + feedDockingManager(element); + } + + else if (!lstrcmp(nm, TEXT("globalOverride"))) + { + const TCHAR *bDir = element->Attribute(TEXT("fg")); + if (bDir && !lstrcmp(bDir, TEXT("yes"))) + { + _nppGUI._globalOverride.enableFg = true; + } + + bDir = element->Attribute(TEXT("bg")); + if (bDir && !lstrcmp(bDir, TEXT("yes"))) + { + _nppGUI._globalOverride.enableBg = true; + } + + bDir = element->Attribute(TEXT("font")); + if (bDir && !lstrcmp(bDir, TEXT("yes"))) + { + _nppGUI._globalOverride.enableFont = true; + } + + bDir = element->Attribute(TEXT("fontSize")); + if (bDir && !lstrcmp(bDir, TEXT("yes"))) + { + _nppGUI._globalOverride.enableFontSize = true; + } + + bDir = element->Attribute(TEXT("bold")); + if (bDir && !lstrcmp(bDir, TEXT("yes"))) + { + _nppGUI._globalOverride.enableBold = true; + } + + bDir = element->Attribute(TEXT("italic")); + if (bDir && !lstrcmp(bDir, TEXT("yes"))) + { + _nppGUI._globalOverride.enableItalic = true; + } + + bDir = element->Attribute(TEXT("underline")); + if (bDir && !lstrcmp(bDir, TEXT("yes"))) + { + _nppGUI._globalOverride.enableUnderLine = true; + } + } + else if (!lstrcmp(nm, TEXT("auto-completion"))) + { + int i; + if (element->Attribute(TEXT("autoCAction"), &i)) + _nppGUI._autocStatus = (NppGUI::AutocStatus)i; + + if (element->Attribute(TEXT("triggerFromNbChar"), &i)) + _nppGUI._autocFromLen = i; + + const TCHAR * funcParams = element->Attribute(TEXT("funcParams")); + if (funcParams && !lstrcmp(funcParams, TEXT("yes"))) + { + _nppGUI._funcParams = true; + } + } + else if (!lstrcmp(nm, TEXT("sessionExt"))) + { + TiXmlNode *n = childNode->FirstChild(); + if (n) + { + val = n->Value(); + if (val) + _nppGUI._definedSessionExt = val; + } + } + else if (!lstrcmp(nm, TEXT("noUpdate"))) + { + TiXmlNode *n = childNode->FirstChild(); + if (n) + { + val = n->Value(); + if (val) + { + _nppGUI._neverUpdate = (!lstrcmp(val, TEXT("yes")))?true:false; + } + } + } + else if (!lstrcmp(nm, TEXT("openSaveDir"))) + { + const TCHAR * value = element->Attribute(TEXT("value")); + if (value && value[0]) + { + if (lstrcmp(value, TEXT("1")) == 0) + _nppGUI._openSaveDir = dir_last; + else if (lstrcmp(value, TEXT("2")) == 0) + _nppGUI._openSaveDir = dir_userDef; + else + _nppGUI._openSaveDir = dir_followCurrent; + } + const TCHAR * path = element->Attribute(TEXT("defaultDirPath")); + if (path && path[0]) + { + lstrcpyn(_nppGUI._defaultDir, path, MAX_PATH); + ::ExpandEnvironmentStrings(_nppGUI._defaultDir, _nppGUI._defaultDirExp, 500); + } + } + else if (!lstrcmp(nm, TEXT("titleBar"))) + { + const TCHAR * value = element->Attribute(TEXT("short")); + _nppGUI._shortTitlebar = false; //default state + if (value && value[0]) + { + if (lstrcmp(value, TEXT("yes")) == 0) + _nppGUI._shortTitlebar = true; + else if (lstrcmp(value, TEXT("no")) == 0) + _nppGUI._shortTitlebar = false; + } + } + else if (!lstrcmp(nm, TEXT("stylerTheme"))) + { + const TCHAR *themePath = element->Attribute(TEXT("path")); + if (themePath != NULL && themePath != TEXT("")) + _nppGUI._themeName.assign(themePath); + } + } +} + +void NppParameters::feedScintillaParam(bool whichOne, TiXmlNode *node) +{ + TiXmlElement *element = node->ToElement(); + + // Line Number Margin + const TCHAR *nm = element->Attribute(TEXT("lineNumberMargin")); + if (nm) + { + if (!lstrcmp(nm, TEXT("show"))) + _svp[whichOne]._lineNumberMarginShow = true; + else if (!lstrcmp(nm, TEXT("hide"))) + _svp[whichOne]._lineNumberMarginShow = false; + } + + // Bookmark Margin + nm = element->Attribute(TEXT("bookMarkMargin")); + if (nm) + { + + if (!lstrcmp(nm, TEXT("show"))) + _svp[whichOne]._bookMarkMarginShow = true; + else if (!lstrcmp(nm, TEXT("hide"))) + _svp[whichOne]._bookMarkMarginShow = false; + } +/* + // doc change state Margin + nm = element->Attribute(TEXT("docChangeStateMargin")); + if (nm) + { + + if (!lstrcmp(nm, TEXT("show"))) + _svp[whichOne]._docChangeStateMarginShow = true; + else if (!lstrcmp(nm, TEXT("hide"))) + _svp[whichOne]._docChangeStateMarginShow = false; + } +*/ + // Indent GuideLine + nm = element->Attribute(TEXT("indentGuideLine")); + if (nm) + { + if (!lstrcmp(nm, TEXT("show"))) + _svp[whichOne]._indentGuideLineShow = true; + else if (!lstrcmp(nm, TEXT("hide"))) + _svp[whichOne]._indentGuideLineShow= false; + } + + // Folder Mark Style + nm = element->Attribute(TEXT("folderMarkStyle")); + if (nm) + { + if (!lstrcmp(nm, TEXT("box"))) + _svp[whichOne]._folderStyle = FOLDER_STYLE_BOX; + else if (!lstrcmp(nm, TEXT("circle"))) + _svp[whichOne]._folderStyle = FOLDER_STYLE_CIRCLE; + else if (!lstrcmp(nm, TEXT("arrow"))) + _svp[whichOne]._folderStyle = FOLDER_STYLE_ARROW; + else if (!lstrcmp(nm, TEXT("simple"))) + _svp[whichOne]._folderStyle = FOLDER_STYLE_SIMPLE; + } + + // Current Line Highlighting State + nm = element->Attribute(TEXT("currentLineHilitingShow")); + if (nm) + { + if (!lstrcmp(nm, TEXT("show"))) + _svp[whichOne]._currentLineHilitingShow = true; + else if (!lstrcmp(nm, TEXT("hide"))) + _svp[whichOne]._currentLineHilitingShow = false; + } + + // Current wrap symbol visibility State + nm = element->Attribute(TEXT("wrapSymbolShow")); + if (nm) + { + if (!lstrcmp(nm, TEXT("show"))) + _svp[whichOne]._wrapSymbolShow = true; + else if (!lstrcmp(nm, TEXT("hide"))) + _svp[whichOne]._wrapSymbolShow = false; + } + + // Do Wrap + nm = element->Attribute(TEXT("Wrap")); + if (nm) + { + if (!lstrcmp(nm, TEXT("yes"))) + _svp[whichOne]._doWrap = true; + else if (!lstrcmp(nm, TEXT("no"))) + _svp[whichOne]._doWrap = false; + } + + // Do Edge + nm = element->Attribute(TEXT("edge")); + if (nm) + { + if (!lstrcmp(nm, TEXT("background"))) + _svp[whichOne]._edgeMode = EDGE_BACKGROUND; + else if (!lstrcmp(nm, TEXT("line"))) + _svp[whichOne]._edgeMode = EDGE_LINE; + else + _svp[whichOne]._edgeMode = EDGE_NONE; + } + + int val; + nm = element->Attribute(TEXT("edgeNbColumn"), &val); + if (nm) + { + _svp[whichOne]._edgeNbColumn = val; + } + + nm = element->Attribute(TEXT("zoom"), &val); + if (nm) + { + _svp[whichOne]._zoom = val; + } + + // White Space visibility State + nm = element->Attribute(TEXT("whiteSpaceShow")); + if (nm) + { + if (!lstrcmp(nm, TEXT("show"))) + _svp[whichOne]._whiteSpaceShow = true; + else if (!lstrcmp(nm, TEXT("hide"))) + _svp[whichOne]._whiteSpaceShow = false; + } + + // EOL visibility State + nm = element->Attribute(TEXT("eolShow")); + if (nm) + { + if (!lstrcmp(nm, TEXT("show"))) + _svp[whichOne]._eolShow = true; + else if (!lstrcmp(nm, TEXT("hide"))) + _svp[whichOne]._eolShow = false; + } +} + + +void NppParameters::feedDockingManager(TiXmlNode *node) +{ + TiXmlElement *element = node->ToElement(); + + int i; + if (element->Attribute(TEXT("leftWidth"), &i)) + _nppGUI._dockingData._leftWidth = i; + + if (element->Attribute(TEXT("rightWidth"), &i)) + _nppGUI._dockingData._rightWidth = i; + + if (element->Attribute(TEXT("topHeight"), &i)) + _nppGUI._dockingData._topHeight = i; + + if (element->Attribute(TEXT("bottomHeight"), &i)) + _nppGUI._dockingData._bottomHight = i; + + + + for (TiXmlNode *childNode = node->FirstChildElement(TEXT("FloatingWindow")); + childNode ; + childNode = childNode->NextSibling(TEXT("FloatingWindow")) ) + { + TiXmlElement *floatElement = childNode->ToElement(); + int cont; + if (floatElement->Attribute(TEXT("cont"), &cont)) + { + int x = 0; + int y = 0; + int w = 100; + int h = 100; + + floatElement->Attribute(TEXT("x"), &x); + floatElement->Attribute(TEXT("y"), &y); + floatElement->Attribute(TEXT("width"), &w); + floatElement->Attribute(TEXT("height"), &h); + _nppGUI._dockingData._flaotingWindowInfo.push_back(FloatingWindowInfo(cont, x, y, w, h)); + } + } + + for (TiXmlNode *childNode = node->FirstChildElement(TEXT("PluginDlg")); + childNode ; + childNode = childNode->NextSibling(TEXT("PluginDlg")) ) + { + TiXmlElement *dlgElement = childNode->ToElement(); + const TCHAR *name = dlgElement->Attribute(TEXT("pluginName")); + + int id; + const TCHAR *idStr = dlgElement->Attribute(TEXT("id"), &id); + if (name && idStr) + { + int curr = 0; // on left + int prev = 0; // on left + + dlgElement->Attribute(TEXT("curr"), &curr); + dlgElement->Attribute(TEXT("prev"), &prev); + + bool isVisible = false; + const TCHAR *val = NULL; + if (val = dlgElement->Attribute(TEXT("isVisible"))) + { + isVisible = (lstrcmp(val, TEXT("yes")) == 0); + } + + _nppGUI._dockingData._pluginDockInfo.push_back(PlugingDlgDockingInfo(name, id, curr, prev, isVisible)); + } + } + + for (TiXmlNode *childNode = node->FirstChildElement(TEXT("ActiveTabs")); + childNode ; + childNode = childNode->NextSibling(TEXT("ActiveTabs")) ) + { + TiXmlElement *dlgElement = childNode->ToElement(); + + int cont; + if (dlgElement->Attribute(TEXT("cont"), &cont)) + { + int activeTab = 0; + dlgElement->Attribute(TEXT("activeTab"), &activeTab); + _nppGUI._dockingData._containerTabInfo.push_back(ContainerTabInfo(cont, activeTab)); + } + } +} + +bool NppParameters::writeScintillaParams(const ScintillaViewParams & svp, bool whichOne) +{ + if (!_pXmlUserDoc) return false; + + const TCHAR *pViewName = (whichOne == SCIV_PRIMARY)?TEXT("ScintillaPrimaryView"):TEXT("ScintillaSecondaryView"); + TiXmlNode *nppRoot = _pXmlUserDoc->FirstChild(TEXT("NotepadPlus")); + if (!nppRoot) return false; + + TiXmlNode *configsRoot = nppRoot->FirstChildElement(TEXT("GUIConfigs")); + if (!configsRoot) return false; + + TiXmlNode *scintNode = getChildElementByAttribut(configsRoot, TEXT("GUIConfig"), TEXT("name"), pViewName); + if (!scintNode) return false; + + (scintNode->ToElement())->SetAttribute(TEXT("lineNumberMargin"), svp._lineNumberMarginShow?TEXT("show"):TEXT("hide")); + (scintNode->ToElement())->SetAttribute(TEXT("bookMarkMargin"), svp._bookMarkMarginShow?TEXT("show"):TEXT("hide")); + //(scintNode->ToElement())->SetAttribute(TEXT("docChangeStateMargin"), svp._docChangeStateMarginShow?TEXT("show"):TEXT("hide")); + (scintNode->ToElement())->SetAttribute(TEXT("indentGuideLine"), svp._indentGuideLineShow?TEXT("show"):TEXT("hide")); + const TCHAR *pFolderStyleStr = (svp._folderStyle == FOLDER_STYLE_SIMPLE)?TEXT("simple"): + (svp._folderStyle == FOLDER_STYLE_ARROW)?TEXT("arrow"): + (svp._folderStyle == FOLDER_STYLE_CIRCLE)?TEXT("circle"):TEXT("box"); + (scintNode->ToElement())->SetAttribute(TEXT("folderMarkStyle"), pFolderStyleStr); + (scintNode->ToElement())->SetAttribute(TEXT("currentLineHilitingShow"), svp._currentLineHilitingShow?TEXT("show"):TEXT("hide")); + (scintNode->ToElement())->SetAttribute(TEXT("wrapSymbolShow"), svp._wrapSymbolShow?TEXT("show"):TEXT("hide")); + (scintNode->ToElement())->SetAttribute(TEXT("Wrap"), svp._doWrap?TEXT("yes"):TEXT("no")); + TCHAR *edgeStr = NULL; + if (svp._edgeMode == EDGE_NONE) + edgeStr = TEXT("no"); + else if (svp._edgeMode == EDGE_LINE) + edgeStr = TEXT("line"); + else + edgeStr = TEXT("background"); + (scintNode->ToElement())->SetAttribute(TEXT("edge"), edgeStr); + (scintNode->ToElement())->SetAttribute(TEXT("edgeNbColumn"), svp._edgeNbColumn); + (scintNode->ToElement())->SetAttribute(TEXT("zoom"), svp._zoom); + (scintNode->ToElement())->SetAttribute(TEXT("whiteSpaceShow"), svp._whiteSpaceShow?TEXT("show"):TEXT("hide")); + (scintNode->ToElement())->SetAttribute(TEXT("eolShow"), svp._eolShow?TEXT("show"):TEXT("hide")); + + return true; +} + +bool NppParameters::writeGUIParams() +{ + if (!_pXmlUserDoc) return false; + + TiXmlNode *nppRoot = _pXmlUserDoc->FirstChild(TEXT("NotepadPlus")); + if (!nppRoot) return false; + + TiXmlNode *GUIRoot = nppRoot->FirstChildElement(TEXT("GUIConfigs")); + if (!GUIRoot) return false; + + bool autoDetectionExist = false; + bool checkHistoryFilesExist = false; + bool trayIconExist = false; + bool rememberLastSessionExist = false; + bool newDocDefaultSettingsExist = false; + bool langsExcludedLstExist = false; + bool printSettingExist = false; + bool doTaskListExist = false; + bool maitainIndentExist = false; + bool MRUExist = false; + bool backExist = false; + bool saveOpenFileInSameDirExist = false; + bool URLExist = false; + bool globalOverrideExist = false; + bool autocExist = false; + bool sessionExtExist = false; + bool noUpdateExist = false; + bool menuBarExist = false; + bool smartHighLightExist = false; + bool tagsMatchHighLightExist = false; + bool caretExist = false; + bool openSaveDirExist = false; + bool titleBarExist = false; + bool stylerThemeExist = false; + + TiXmlNode *dockingParamNode = NULL; + + 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; + + if (!lstrcmp(nm, TEXT("ToolBar"))) + { + const TCHAR *pStr = (_nppGUI._toolbarShow)?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("visible"), pStr); + + pStr = _nppGUI._toolBarStatus == TB_SMALL?TEXT("small"):(_nppGUI._toolBarStatus == TB_STANDARD?TEXT("standard"):TEXT("large")); + TiXmlNode *n = childNode->FirstChild(); + if (n) + n->SetValue(pStr); + else + childNode->InsertEndChild(TiXmlText(pStr)); + } + else if (!lstrcmp(nm, TEXT("StatusBar"))) + { + const TCHAR *pStr = _nppGUI._statusBarShow?TEXT("show"):TEXT("hide"); + TiXmlNode *n = childNode->FirstChild(); + if (n) + n->SetValue(pStr); + else + childNode->InsertEndChild(TiXmlText(pStr)); + } + else if (!lstrcmp(nm, TEXT("MenuBar"))) + { + const TCHAR *pStr = _nppGUI._menuBarShow?TEXT("show"):TEXT("hide"); + TiXmlNode *n = childNode->FirstChild(); + if (n) + n->SetValue(pStr); + else + childNode->InsertEndChild(TiXmlText(pStr)); + + menuBarExist = true; + } + else if (!lstrcmp(nm, TEXT("TabBar"))) + { + const TCHAR *pStr = (_nppGUI._tabStatus & TAB_DRAWTOPBAR)?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("dragAndDrop"), pStr); + + pStr = (_nppGUI._tabStatus & TAB_DRAGNDROP)?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("drawTopBar"), pStr); + + pStr = (_nppGUI._tabStatus & TAB_DRAWINACTIVETAB)?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("drawInactiveTab"), pStr); + + pStr = (_nppGUI._tabStatus & TAB_REDUCE)?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("reduce"), pStr); + + pStr = (_nppGUI._tabStatus & TAB_CLOSEBUTTON)?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("closeButton"), pStr); + + pStr = (_nppGUI._tabStatus & TAB_DBCLK2CLOSE)?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("doubleClick2Close"), pStr); + + pStr = (_nppGUI._tabStatus & TAB_VERTICAL)?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("vertical"), pStr); + + pStr = (_nppGUI._tabStatus & TAB_MULTILINE)?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("multiLine"), pStr); + + pStr = (_nppGUI._tabStatus & TAB_HIDE)?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("hide"), pStr); + + } + else if (!lstrcmp(nm, TEXT("ScintillaViewsSplitter"))) + { + const TCHAR *pStr = _nppGUI._splitterPos == POS_VERTICAL?TEXT("vertical"):TEXT("horizontal"); + TiXmlNode *n = childNode->FirstChild(); + if (n) + n->SetValue(pStr); + else + childNode->InsertEndChild(TiXmlText(pStr)); + } + else if (!lstrcmp(nm, TEXT("UserDefineDlg"))) + { + const TCHAR *pStr = _nppGUI._userDefineDlgStatus & UDD_SHOW?TEXT("show"):TEXT("hide"); + TiXmlNode *n = childNode->FirstChild(); + if (n) + n->SetValue(pStr); + else + childNode->InsertEndChild(TiXmlText(pStr)); + + pStr = (_nppGUI._userDefineDlgStatus & UDD_DOCKED)?TEXT("docked"):TEXT("undocked"); + element->SetAttribute(TEXT("position"), pStr); + } + else if (!lstrcmp(nm, TEXT("TabSetting"))) + { + const TCHAR *pStr = _nppGUI._tabReplacedBySpace?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("replaceBySpace"), pStr); + element->SetAttribute(TEXT("size"), _nppGUI._tabSize); + } + else if (!lstrcmp(nm, TEXT("Caret"))) + { + caretExist = true; + element->SetAttribute(TEXT("width"), _nppGUI._caretWidth); + element->SetAttribute(TEXT("blinkRate"), _nppGUI._caretBlinkRate); + } + else if (!lstrcmp(nm, TEXT("Auto-detection"))) + { + autoDetectionExist = true; + const TCHAR *pStr = TEXT("no"); + switch (_nppGUI._fileAutoDetection) + { + case cdEnabled: + pStr = TEXT("yes"); + break; + case cdAutoUpdate: + pStr = TEXT("auto"); + break; + case cdGo2end: + pStr = TEXT("Update2End"); + break; + case cdAutoUpdateGo2end: + pStr = TEXT("autoUpdate2End"); + break; + } + TiXmlNode *n = childNode->FirstChild(); + if (n) + n->SetValue(pStr); + else + childNode->InsertEndChild(TiXmlText(pStr)); + } + else if (!lstrcmp(nm, TEXT("TrayIcon"))) + { + trayIconExist = true; + const TCHAR *pStr = _nppGUI._isMinimizedToTray?TEXT("yes"):TEXT("no"); + TiXmlNode *n = childNode->FirstChild(); + if (n) + n->SetValue(pStr); + else + childNode->InsertEndChild(TiXmlText(pStr)); + } + else if (!lstrcmp(nm, TEXT("RememberLastSession"))) + { + rememberLastSessionExist = true; + const TCHAR *pStr = _nppGUI._rememberLastSession?TEXT("yes"):TEXT("no"); + TiXmlNode *n = childNode->FirstChild(); + if (n) + n->SetValue(pStr); + else + childNode->InsertEndChild(TiXmlText(pStr)); + } + + else if (!lstrcmp(nm, TEXT("MaitainIndent"))) + { + maitainIndentExist = true; + const TCHAR *pStr = _nppGUI._maitainIndent?TEXT("yes"):TEXT("no"); + TiXmlNode *n = childNode->FirstChild(); + if (n) + n->SetValue(pStr); + else + childNode->InsertEndChild(TiXmlText(pStr)); + } + else if (!lstrcmp(nm, TEXT("SmartHighLight"))) + { + smartHighLightExist = true; + const TCHAR *pStr = _nppGUI._enableSmartHilite?TEXT("yes"):TEXT("no"); + TiXmlNode *n = childNode->FirstChild(); + if (n) + n->SetValue(pStr); + else + childNode->InsertEndChild(TiXmlText(pStr)); + } + + else if (!lstrcmp(nm, TEXT("TagsMatchHighLight"))) + { + tagsMatchHighLightExist = true; + const TCHAR *pStr = _nppGUI._enableTagsMatchHilite?TEXT("yes"):TEXT("no"); + TiXmlNode *n = childNode->FirstChild(); + if (n) + n->SetValue(pStr); + else + childNode->InsertEndChild(TiXmlText(pStr)); + + (childNode->ToElement())->SetAttribute(TEXT("TagAttrHighLight"), _nppGUI._enableTagAttrsHilite?TEXT("yes"):TEXT("no")); + (childNode->ToElement())->SetAttribute(TEXT("HighLightNonHtmlZone"), _nppGUI._enableHiliteNonHTMLZone?TEXT("yes"):TEXT("no")); + } + + else if (!lstrcmp(nm, TEXT("TaskList"))) + { + doTaskListExist = true; + const TCHAR *pStr = _nppGUI._doTaskList?TEXT("yes"):TEXT("no"); + + TiXmlNode *n = childNode->FirstChild(); + if (n) + n->SetValue(pStr); + else + childNode->InsertEndChild(TiXmlText(pStr)); + } + else if (!lstrcmp(nm, TEXT("CheckHistoryFiles"))) + { + checkHistoryFilesExist = true; + const TCHAR *pStr = _nppGUI._checkHistoryFiles?TEXT("yes"):TEXT("no"); + + TiXmlNode *n = childNode->FirstChild(); + if (n) + n->SetValue(pStr); + else + childNode->InsertEndChild(TiXmlText(pStr)); + } + else if (!lstrcmp(nm, TEXT("AppPosition"))) + { + element->SetAttribute(TEXT("x"), _nppGUI._appPos.left); + element->SetAttribute(TEXT("y"), _nppGUI._appPos.top); + element->SetAttribute(TEXT("width"), _nppGUI._appPos.right); + element->SetAttribute(TEXT("height"), _nppGUI._appPos.bottom); + element->SetAttribute(TEXT("isMaximized"), _nppGUI._isMaximized?TEXT("yes"):TEXT("no")); + } + else if (!lstrcmp(nm, TEXT("NewDocDefaultSettings"))) + { + element->SetAttribute(TEXT("format"), _nppGUI._newDocDefaultSettings._format); + element->SetAttribute(TEXT("encoding"), _nppGUI._newDocDefaultSettings._encoding); + element->SetAttribute(TEXT("lang"), _nppGUI._newDocDefaultSettings._lang); + element->SetAttribute(TEXT("openAnsiAsUTF8"), _nppGUI._newDocDefaultSettings._openAnsiAsUtf8?TEXT("yes"):TEXT("no")); + newDocDefaultSettingsExist = true; + } + else if (!lstrcmp(nm, TEXT("langsExcluded"))) + { + writeExcludedLangList(element); + element->SetAttribute(TEXT("langMenuCompact"), _nppGUI._isLangMenuCompact?TEXT("yes"):TEXT("no")); + langsExcludedLstExist = true; + } + else if (!lstrcmp(nm, TEXT("Print"))) + { + writePrintSetting(element); + printSettingExist = true; + } + else if (!lstrcmp(nm, TEXT("Backup"))) + { + element->SetAttribute(TEXT("action"), _nppGUI._backup); + element->SetAttribute(TEXT("useCustumDir"), _nppGUI._useDir?TEXT("yes"):TEXT("no")); + element->SetAttribute(TEXT("dir"), _nppGUI._backupDir); + backExist = true; + } + else if (!lstrcmp(nm, TEXT("MRU"))) + { + MRUExist = true; + const TCHAR *pStr = _nppGUI._styleMRU?TEXT("yes"):TEXT("no"); + + TiXmlNode *n = childNode->FirstChild(); + if (n) + n->SetValue(pStr); + else + childNode->InsertEndChild(TiXmlText(pStr)); + } + else if (!lstrcmp(nm, TEXT("URL"))) + { + URLExist = true; + const TCHAR *pStr = TEXT("0"); + if (_nppGUI._styleURL == 1) + pStr = TEXT("1"); + else if (_nppGUI._styleURL == 2) + pStr = TEXT("2"); + + TiXmlNode *n = childNode->FirstChild(); + if (n) + n->SetValue(pStr); + else + childNode->InsertEndChild(TiXmlText(pStr)); + } + else if (!lstrcmp(nm, TEXT("DockingManager"))) + { + dockingParamNode = childNode; + } + else if (!lstrcmp(nm, TEXT("globalOverride"))) + { + globalOverrideExist = true; + const TCHAR *pStr = _nppGUI._globalOverride.enableFg?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("fg"), pStr); + + pStr = (_nppGUI._globalOverride.enableBg)?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("bg"), pStr); + + pStr = _nppGUI._globalOverride.enableFont?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("font"), pStr); + + pStr = _nppGUI._globalOverride.enableFontSize?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("fontSize"), pStr); + + pStr = _nppGUI._globalOverride.enableBold?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("bold"), pStr); + + pStr = _nppGUI._globalOverride.enableItalic?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("italic"), pStr); + + pStr = _nppGUI._globalOverride.enableUnderLine?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("underline"), pStr); + } + else if (!lstrcmp(nm, TEXT("auto-completion"))) + { + autocExist = true; + element->SetAttribute(TEXT("autoCAction"), _nppGUI._autocStatus); + element->SetAttribute(TEXT("triggerFromNbChar"), _nppGUI._autocFromLen); + const TCHAR * pStr = _nppGUI._funcParams?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("funcParams"), pStr); + } + else if (!lstrcmp(nm, TEXT("sessionExt"))) + { + sessionExtExist = true; + TiXmlNode *n = childNode->FirstChild(); + if (n) + n->SetValue(_nppGUI._definedSessionExt.c_str()); + else + childNode->InsertEndChild(TiXmlText(_nppGUI._definedSessionExt.c_str())); + } + else if (!lstrcmp(nm, TEXT("noUpdate"))) + { + noUpdateExist = true; + const TCHAR *pStr = _nppGUI._neverUpdate?TEXT("yes"):TEXT("no"); + + TiXmlNode *n = childNode->FirstChild(); + if (n) + n->SetValue(pStr); + else + childNode->InsertEndChild(TiXmlText(pStr)); + } + else if (!lstrcmp(nm, TEXT("openSaveDir"))) + { + openSaveDirExist = true; + element->SetAttribute(TEXT("value"), _nppGUI._openSaveDir); + element->SetAttribute(TEXT("defaultDirPath"), _nppGUI._defaultDir); + } + else if (!lstrcmp(nm, TEXT("titleBar"))) + { + titleBarExist = true; + const TCHAR *pStr = (_nppGUI._shortTitlebar)?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("short"), pStr); + + //pStr = (_nppGUI._showDirty)?TEXT("yes"):TEXT("no"); + //element->SetAttribute(TEXT("showDirty"), pStr); + } + else if (!lstrcmp(nm, TEXT("stylerTheme"))) + { + stylerThemeExist = true; + element->SetAttribute(TEXT("path"), _nppGUI._themeName.c_str()); + } + } + + if (!noUpdateExist) + { + insertGUIConfigBoolNode(GUIRoot, TEXT("noUpdate"), _nppGUI._neverUpdate); + } + + if (!autoDetectionExist) + { + const TCHAR *pStr = TEXT("no"); + switch (_nppGUI._fileAutoDetection) + { + case cdEnabled: + pStr = TEXT("yes"); + break; + case cdAutoUpdate: + pStr = TEXT("auto"); + break; + case cdGo2end: + pStr = TEXT("Update2End"); + break; + case cdAutoUpdateGo2end: + pStr = TEXT("autoUpdate2End"); + break; + } + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); + GUIConfigElement->SetAttribute(TEXT("name"), TEXT("Auto-detection")); + GUIConfigElement->InsertEndChild(TiXmlText(pStr)); + } + if (!checkHistoryFilesExist) + { + insertGUIConfigBoolNode(GUIRoot, TEXT("CheckHistoryFiles"), _nppGUI._checkHistoryFiles); + } + if (!trayIconExist) + { + insertGUIConfigBoolNode(GUIRoot, TEXT("TrayIcon"), _nppGUI._isMinimizedToTray); + } + + if (!maitainIndentExist) + { + insertGUIConfigBoolNode(GUIRoot, TEXT("MaitainIndent"), _nppGUI._maitainIndent); + } + + if (!smartHighLightExist) + { + insertGUIConfigBoolNode(GUIRoot, TEXT("SmartHighLight"), _nppGUI._enableSmartHilite); + } + if (!tagsMatchHighLightExist) + { + TiXmlElement * ele = insertGUIConfigBoolNode(GUIRoot, TEXT("TagsMatchHighLight"), _nppGUI._enableTagsMatchHilite); + ele->SetAttribute(TEXT("TagAttrHighLight"), _nppGUI._enableTagAttrsHilite?TEXT("yes"):TEXT("no")); + ele->SetAttribute(TEXT("HighLightNonHtmlZone"), _nppGUI._enableHiliteNonHTMLZone?TEXT("yes"):TEXT("no")); + } + if (!rememberLastSessionExist) + { + insertGUIConfigBoolNode(GUIRoot, TEXT("RememberLastSession"), _nppGUI._rememberLastSession); + } + + if (!newDocDefaultSettingsExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); + GUIConfigElement->SetAttribute(TEXT("name"), TEXT("NewDocDefaultSettings")); + GUIConfigElement->SetAttribute(TEXT("format"), _nppGUI._newDocDefaultSettings._format); + GUIConfigElement->SetAttribute(TEXT("encoding"), _nppGUI._newDocDefaultSettings._encoding); + GUIConfigElement->SetAttribute(TEXT("lang"), _nppGUI._newDocDefaultSettings._lang); + GUIConfigElement->SetAttribute(TEXT("openAnsiAsUTF8"), _nppGUI._newDocDefaultSettings._openAnsiAsUtf8?TEXT("yes"):TEXT("no")); + } + + if (!langsExcludedLstExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); + GUIConfigElement->SetAttribute(TEXT("name"), TEXT("langsExcluded")); + writeExcludedLangList(GUIConfigElement); + GUIConfigElement->SetAttribute(TEXT("langMenuCompact"), _nppGUI._isLangMenuCompact?TEXT("yes"):TEXT("no")); + } + + if (!printSettingExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); + GUIConfigElement->SetAttribute(TEXT("name"), TEXT("Print")); + writePrintSetting(GUIConfigElement); + } + if (!backExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); + GUIConfigElement->SetAttribute(TEXT("name"), TEXT("Backup")); + GUIConfigElement->SetAttribute(TEXT("action"), _nppGUI._backup); + GUIConfigElement->SetAttribute(TEXT("useCustumDir"), _nppGUI._useDir?TEXT("yes"):TEXT("no")); + GUIConfigElement->SetAttribute(TEXT("dir"), _nppGUI._backupDir); + } + + if (!doTaskListExist) + { + insertGUIConfigBoolNode(GUIRoot, TEXT("TaskList"), _nppGUI._doTaskList); + } + + if (!MRUExist) + { + insertGUIConfigBoolNode(GUIRoot, TEXT("MRU"), _nppGUI._styleMRU); + } + + if (!URLExist) + { + const TCHAR *pStr = TEXT("0"); + if (_nppGUI._styleURL == 1) + pStr = TEXT("1"); + else if (_nppGUI._styleURL == 2) + pStr = TEXT("2"); + + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); + GUIConfigElement->SetAttribute(TEXT("name"), TEXT("URL")); + GUIConfigElement->InsertEndChild(TiXmlText(pStr)); + } + + if (!globalOverrideExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); + GUIConfigElement->SetAttribute(TEXT("name"), TEXT("globalOverride")); + GUIConfigElement->SetAttribute(TEXT("fg"), _nppGUI._globalOverride.enableFg?TEXT("yes"):TEXT("no")); + GUIConfigElement->SetAttribute(TEXT("bg"), _nppGUI._globalOverride.enableBg?TEXT("yes"):TEXT("no")); + GUIConfigElement->SetAttribute(TEXT("font"), _nppGUI._globalOverride.enableFont?TEXT("yes"):TEXT("no")); + GUIConfigElement->SetAttribute(TEXT("fontSize"), _nppGUI._globalOverride.enableFontSize?TEXT("yes"):TEXT("no")); + GUIConfigElement->SetAttribute(TEXT("bold"), _nppGUI._globalOverride.enableBold?TEXT("yes"):TEXT("no")); + 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(); + GUIConfigElement->SetAttribute(TEXT("name"), TEXT("auto-completion")); + GUIConfigElement->SetAttribute(TEXT("autoCAction"), _nppGUI._autocStatus); + GUIConfigElement->SetAttribute(TEXT("triggerFromNbChar"), _nppGUI._autocFromLen); + const TCHAR * pStr = _nppGUI._funcParams?TEXT("yes"):TEXT("no"); + GUIConfigElement->SetAttribute(TEXT("funcParams"), pStr); + autocExist = true; + } + + if (dockingParamNode) + { + // Rase tout + GUIRoot->RemoveChild(dockingParamNode); + } + + if (!sessionExtExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); + GUIConfigElement->SetAttribute(TEXT("name"), TEXT("sessionExt")); + GUIConfigElement->InsertEndChild(TiXmlText(_nppGUI._definedSessionExt.c_str())); + } + + if (!menuBarExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); + GUIConfigElement->SetAttribute(TEXT("name"), TEXT("MenuBar")); + GUIConfigElement->InsertEndChild(TiXmlText(_nppGUI._menuBarShow?TEXT("show"):TEXT("hide"))); + } + + if (!caretExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); + GUIConfigElement->SetAttribute(TEXT("name"), TEXT("Caret")); + GUIConfigElement->SetAttribute(TEXT("width"), _nppGUI._caretWidth); + GUIConfigElement->SetAttribute(TEXT("blinkRate"), _nppGUI._caretBlinkRate); + } + + if (!openSaveDirExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); + GUIConfigElement->SetAttribute(TEXT("name"), TEXT("openSaveDir")); + GUIConfigElement->SetAttribute(TEXT("value"), _nppGUI._openSaveDir); + GUIConfigElement->SetAttribute(TEXT("defaultDirPath"), _nppGUI._defaultDir); + } + + if (!titleBarExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); + GUIConfigElement->SetAttribute(TEXT("name"), TEXT("titleBar")); + const TCHAR *pStr = (_nppGUI._shortTitlebar)?TEXT("yes"):TEXT("no"); + GUIConfigElement->SetAttribute(TEXT("short"), pStr); + } + if (!stylerThemeExist) + { + TiXmlElement *GUIConfigElement = (GUIRoot->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); + GUIConfigElement->SetAttribute(TEXT("name"), TEXT("stylerTheme")); + GUIConfigElement->SetAttribute(TEXT("path"), _nppGUI._themeName.c_str()); + } + + insertDockingParamNode(GUIRoot); + return true; +} + +bool NppParameters::writeFindHistory() +{ + if (!_pXmlUserDoc) return false; + + TiXmlNode *nppRoot = _pXmlUserDoc->FirstChild(TEXT("NotepadPlus")); + if (!nppRoot) return false; + + TiXmlNode *findHistoryRoot = nppRoot->FirstChildElement(TEXT("FindHistory")); + if (!findHistoryRoot) + { + TiXmlElement element(TEXT("FindHistory")); + findHistoryRoot = nppRoot->InsertEndChild(element); + } + + int i; + + findHistoryRoot->Clear(); + + (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("nbMaxFindHistoryReplace"), _findHistory._nbMaxFindHistoryReplace); + + (findHistoryRoot->ToElement())->SetAttribute(TEXT("matchWord"), _findHistory._isMatchWord?TEXT("yes"):TEXT("no")); + (findHistoryRoot->ToElement())->SetAttribute(TEXT("matchCase"), _findHistory._isMatchCase?TEXT("yes"):TEXT("no")); + (findHistoryRoot->ToElement())->SetAttribute(TEXT("wrap"), _findHistory._isWrap?TEXT("yes"):TEXT("no")); + (findHistoryRoot->ToElement())->SetAttribute(TEXT("directionDown"), _findHistory._isDirectionDown?TEXT("yes"):TEXT("no")); + + (findHistoryRoot->ToElement())->SetAttribute(TEXT("fifRecuisive"), _findHistory._isFifRecuisive?TEXT("yes"):TEXT("no")); + (findHistoryRoot->ToElement())->SetAttribute(TEXT("fifInHiddenFolder"), _findHistory._isFifInHiddenFolder?TEXT("yes"):TEXT("no")); + (findHistoryRoot->ToElement())->SetAttribute(TEXT("dlgAlwaysVisible"), _findHistory._isDlgAlwaysVisible?TEXT("yes"):TEXT("no")); + (findHistoryRoot->ToElement())->SetAttribute(TEXT("fifFilterFollowsDoc"), _findHistory._isFilterFollowDoc?TEXT("yes"):TEXT("no")); + (findHistoryRoot->ToElement())->SetAttribute(TEXT("fifFolderFollowsDoc"), _findHistory._isFolderFollowDoc?TEXT("yes"):TEXT("no")); + + (findHistoryRoot->ToElement())->SetAttribute(TEXT("searchMode"), _findHistory._searchMode); + (findHistoryRoot->ToElement())->SetAttribute(TEXT("transparencyMode"), _findHistory._transparencyMode); + (findHistoryRoot->ToElement())->SetAttribute(TEXT("transparency"), _findHistory._transparency); + + TiXmlElement hist_element(TEXT("")); + + hist_element.SetValue(TEXT("Path")); + for (i = 0; i < _findHistory._nbFindHistoryPath; i++) + { + (hist_element.ToElement())->SetAttribute(TEXT("name"), _findHistory._pFindHistoryPath[i]->c_str()); + findHistoryRoot->InsertEndChild(hist_element); + } + + hist_element.SetValue(TEXT("Filter")); + for (i = 0; i < _findHistory._nbFindHistoryFilter; i++) + { + (hist_element.ToElement())->SetAttribute(TEXT("name"), _findHistory._pFindHistoryFilter[i]->c_str()); + findHistoryRoot->InsertEndChild(hist_element); + } + + hist_element.SetValue(TEXT("Find")); + for (i = 0; i < _findHistory._nbFindHistoryFind; i++) + { + (hist_element.ToElement())->SetAttribute(TEXT("name"), _findHistory._pFindHistoryFind[i]->c_str()); + findHistoryRoot->InsertEndChild(hist_element); + } + + hist_element.SetValue(TEXT("Replace")); + for (i = 0; i < _findHistory._nbFindHistoryReplace; i++) + { + (hist_element.ToElement())->SetAttribute(TEXT("name"), _findHistory._pFindHistoryReplace[i]->c_str()); + findHistoryRoot->InsertEndChild(hist_element); + } + + return true; +} + +void NppParameters::insertDockingParamNode(TiXmlNode *GUIRoot) +{ + TiXmlElement DMNode(TEXT("GUIConfig")); + DMNode.SetAttribute(TEXT("name"), TEXT("DockingManager")); + DMNode.SetAttribute(TEXT("leftWidth"), _nppGUI._dockingData._leftWidth); + 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 ; i < _nppGUI._dockingData._flaotingWindowInfo.size() ; i++) + { + FloatingWindowInfo & fwi = _nppGUI._dockingData._flaotingWindowInfo[i]; + TiXmlElement FWNode(TEXT("FloatingWindow")); + FWNode.SetAttribute(TEXT("cont"), fwi._cont); + FWNode.SetAttribute(TEXT("x"), fwi._pos.left); + FWNode.SetAttribute(TEXT("y"), fwi._pos.top); + FWNode.SetAttribute(TEXT("width"), fwi._pos.right); + FWNode.SetAttribute(TEXT("height"), fwi._pos.bottom); + + DMNode.InsertEndChild(FWNode); + } + + for (size_t i = 0 ; i < _nppGUI._dockingData._pluginDockInfo.size() ; i++) + { + PlugingDlgDockingInfo & pdi = _nppGUI._dockingData._pluginDockInfo[i]; + TiXmlElement PDNode(TEXT("PluginDlg")); + PDNode.SetAttribute(TEXT("pluginName"), pdi._name); + PDNode.SetAttribute(TEXT("id"), pdi._internalID); + PDNode.SetAttribute(TEXT("curr"), pdi._currContainer); + PDNode.SetAttribute(TEXT("prev"), pdi._prevContainer); + PDNode.SetAttribute(TEXT("isVisible"), pdi._isVisible?TEXT("yes"):TEXT("no")); + + DMNode.InsertEndChild(PDNode); + } + + for (size_t i = 0 ; i < _nppGUI._dockingData._containerTabInfo.size() ; i++) + { + ContainerTabInfo & cti = _nppGUI._dockingData._containerTabInfo[i]; + TiXmlElement CTNode(TEXT("ActiveTabs")); + CTNode.SetAttribute(TEXT("cont"), cti._cont); + CTNode.SetAttribute(TEXT("activeTab"), cti._activeTab); + DMNode.InsertEndChild(CTNode); + } + + GUIRoot->InsertEndChild(DMNode); +} + +void NppParameters::writePrintSetting(TiXmlElement *element) +{ + const TCHAR *pStr = _nppGUI._printSettings._printLineNumber?TEXT("yes"):TEXT("no"); + element->SetAttribute(TEXT("lineNumber"), pStr); + + element->SetAttribute(TEXT("printOption"), _nppGUI._printSettings._printOption); + + element->SetAttribute(TEXT("headerLeft"), _nppGUI._printSettings._headerLeft.c_str()); + element->SetAttribute(TEXT("headerMiddle"), _nppGUI._printSettings._headerMiddle.c_str()); + element->SetAttribute(TEXT("headerRight"), _nppGUI._printSettings._headerRight.c_str()); + element->SetAttribute(TEXT("footerLeft"), _nppGUI._printSettings._footerLeft.c_str()); + element->SetAttribute(TEXT("footerMiddle"), _nppGUI._printSettings._footerMiddle.c_str()); + element->SetAttribute(TEXT("footerRight"), _nppGUI._printSettings._footerRight.c_str()); + + element->SetAttribute(TEXT("headerFontName"), _nppGUI._printSettings._headerFontName.c_str()); + element->SetAttribute(TEXT("headerFontStyle"), _nppGUI._printSettings._headerFontStyle); + element->SetAttribute(TEXT("headerFontSize"), _nppGUI._printSettings._headerFontSize); + element->SetAttribute(TEXT("footerFontName"), _nppGUI._printSettings._footerFontName.c_str()); + element->SetAttribute(TEXT("footerFontStyle"), _nppGUI._printSettings._footerFontStyle); + element->SetAttribute(TEXT("footerFontSize"), _nppGUI._printSettings._footerFontSize); + + element->SetAttribute(TEXT("margeLeft"), _nppGUI._printSettings._marge.left); + element->SetAttribute(TEXT("margeRight"), _nppGUI._printSettings._marge.right); + element->SetAttribute(TEXT("margeTop"), _nppGUI._printSettings._marge.top); + element->SetAttribute(TEXT("margeBottom"), _nppGUI._printSettings._marge.bottom); +} + +void NppParameters::writeExcludedLangList(TiXmlElement *element) +{ + int g0 = 0; // up to 8 + int g1 = 0; // up to 16 + int g2 = 0; // up to 24 + int g3 = 0; // up to 32 + int g4 = 0; // up to 40 + int g5 = 0; // up to 48 + int g6 = 0; // up to 56 + int g7 = 0; // up to 64 + + for (size_t i = 0 ; i < _nppGUI._excludedLangList.size() ; i++) + { + LangType langType = _nppGUI._excludedLangList[i]._langType; + if (langType >= L_EXTERNAL && langType < L_END) + continue; + + int nGrp = langType / 8; + int nMask = 1 << langType % 8; + + + switch (nGrp) + { + case 0 : + g0 |= nMask; + break; + case 1 : + g1 |= nMask; + break; + case 2 : + g2 |= nMask; + break; + case 3 : + g3 |= nMask; + break; + case 4 : + g4 |= nMask; + break; + case 5 : + g5 |= nMask; + break; + case 6 : + g6 |= nMask; + break; + case 7 : + g7 |= nMask; + break; + } + } + + element->SetAttribute(TEXT("gr0"), g0); + element->SetAttribute(TEXT("gr1"), g1); + element->SetAttribute(TEXT("gr2"), g2); + element->SetAttribute(TEXT("gr3"), g3); + element->SetAttribute(TEXT("gr4"), g4); + element->SetAttribute(TEXT("gr5"), g5); + element->SetAttribute(TEXT("gr6"), g6); + element->SetAttribute(TEXT("gr7"), g7); +} + +TiXmlElement * NppParameters::insertGUIConfigBoolNode(TiXmlNode *r2w, const TCHAR *name, bool bVal) +{ + const TCHAR *pStr = bVal?TEXT("yes"):TEXT("no"); + TiXmlElement *GUIConfigElement = (r2w->InsertEndChild(TiXmlElement(TEXT("GUIConfig"))))->ToElement(); + GUIConfigElement->SetAttribute(TEXT("name"), name); + GUIConfigElement->InsertEndChild(TiXmlText(pStr)); + return GUIConfigElement; +} + +int RGB2int(COLORREF color) { + return (((((DWORD)color) & 0x0000FF) << 16) | ((((DWORD)color) & 0x00FF00)) | ((((DWORD)color) & 0xFF0000) >> 16)); +} + +int NppParameters::langTypeToCommandID(LangType lt) const +{ + int id; + switch (lt) + { + case L_C : + id = IDM_LANG_C; break; + case L_CPP : + id = IDM_LANG_CPP; break; + case L_JAVA : + id = IDM_LANG_JAVA; break; + case L_CS : + id = IDM_LANG_CS; break; + case L_OBJC : + id = IDM_LANG_OBJC; break; + case L_HTML : + id = IDM_LANG_HTML; break; + case L_XML : + id = IDM_LANG_XML; break; + case L_JS : + id = IDM_LANG_JS; break; + case L_PHP : + id = IDM_LANG_PHP; break; + case L_ASP : + id = IDM_LANG_ASP; break; + case L_CSS : + id = IDM_LANG_CSS; break; + case L_LUA : + id = IDM_LANG_LUA; break; + case L_PERL : + id = IDM_LANG_PERL; break; + case L_PYTHON : + id = IDM_LANG_PYTHON; break; + case L_BATCH : + id = IDM_LANG_BATCH; break; + case L_PASCAL : + id = IDM_LANG_PASCAL; break; + case L_MAKEFILE : + id = IDM_LANG_MAKEFILE; break; + case L_INI : + id = IDM_LANG_INI; break; + case L_NFO : + id = IDM_LANG_ASCII; break; + case L_RC : + id = IDM_LANG_RC; break; + case L_TEX : + id = IDM_LANG_TEX; break; + case L_FORTRAN : + id = IDM_LANG_FORTRAN; break; + case L_BASH : + id = IDM_LANG_SH; break; + case L_FLASH : + id = IDM_LANG_FLASH; break; + case L_NSIS : + 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_TCL : + id = IDM_LANG_TCL; break; + + case L_LISP : + id = IDM_LANG_LISP; break; + case L_SCHEME : + id = IDM_LANG_SCHEME; break; + case L_ASM : + id = IDM_LANG_ASM; break; + case L_DIFF : + id = IDM_LANG_DIFF; break; + case L_PROPS : + id = IDM_LANG_PROPS; break; + case L_PS : + id = IDM_LANG_PS; break; + case L_RUBY : + id = IDM_LANG_RUBY; break; + case L_SMALLTALK : + id = IDM_LANG_SMALLTALK; break; + case L_VHDL : + id = IDM_LANG_VHDL; break; + + case L_ADA : + id = IDM_LANG_ADA; break; + case L_MATLAB : + id = IDM_LANG_MATLAB; break; + + case L_HASKELL : + id = IDM_LANG_HASKELL; break; + + case L_KIX : + id = IDM_LANG_KIX; break; + case L_AU3 : + id = IDM_LANG_AU3; break; + case L_VERILOG : + id = IDM_LANG_VERILOG; break; + case L_CAML : + id = IDM_LANG_CAML; break; + + case L_INNO : + id = IDM_LANG_INNO; break; + + case L_CMAKE : + id = IDM_LANG_CMAKE; break; + + case L_YAML : + id = IDM_LANG_YAML; break; + + case L_SEARCHRESULT : + id = -1; break; + + case L_TXT : + id = IDM_LANG_TEXT; break; + + default : + if(lt >= L_EXTERNAL && lt < L_END) + id = lt - L_EXTERNAL + IDM_LANG_EXTERNAL; + else + id = IDM_LANG_TEXT; + } + return id; +} + +void NppParameters::writeStyles(LexerStylerArray & lexersStylers, StyleArray & globalStylers) +{ + TiXmlNode *lexersRoot = (_pXmlUserStylerDoc->FirstChild(TEXT("NotepadPlus")))->FirstChildElement(TEXT("LexerStyles")); + for (TiXmlNode *childNode = lexersRoot->FirstChildElement(TEXT("LexerType")); + childNode ; + childNode = childNode->NextSibling(TEXT("LexerType"))) + { + TiXmlElement *element = childNode->ToElement(); + const TCHAR *nm = element->Attribute(TEXT("name")); + + LexerStyler *pLs = _lexerStylerArray.getLexerStylerByName(nm); + LexerStyler *pLs2 = lexersStylers.getLexerStylerByName(nm); + + if (pLs) + { + const TCHAR *extStr = pLs->getLexerUserExt(); + element->SetAttribute(TEXT("ext"), extStr); + for (TiXmlNode *grChildNode = childNode->FirstChildElement(TEXT("WordsStyle")); + grChildNode ; + grChildNode = grChildNode->NextSibling(TEXT("WordsStyle"))) + { + TiXmlElement *grElement = grChildNode->ToElement(); + const TCHAR *styleName = grElement->Attribute(TEXT("name")); + + int i = pLs->getStylerIndexByName(styleName); + if (i != -1) + { + Style & style = pLs->getStyler(i); + Style & style2Sync = pLs2->getStyler(i); + + writeStyle2Element(style, style2Sync, grElement); + } + } + } + } + + for(size_t x = 0; x < _pXmlExternalLexerDoc.size(); x++) + { + TiXmlNode *lexersRoot = ( _pXmlExternalLexerDoc[x]->FirstChild(TEXT("NotepadPlus")))->FirstChildElement(TEXT("LexerStyles")); + for (TiXmlNode *childNode = lexersRoot->FirstChildElement(TEXT("LexerType")); + childNode ; + childNode = childNode->NextSibling(TEXT("LexerType"))) + { + TiXmlElement *element = childNode->ToElement(); + const TCHAR *nm = element->Attribute(TEXT("name")); + + LexerStyler *pLs = _lexerStylerArray.getLexerStylerByName(nm); + LexerStyler *pLs2 = lexersStylers.getLexerStylerByName(nm); + + if (pLs) + { + const TCHAR *extStr = pLs->getLexerUserExt(); + element->SetAttribute(TEXT("ext"), extStr); + + for (TiXmlNode *grChildNode = childNode->FirstChildElement(TEXT("WordsStyle")); + grChildNode ; + grChildNode = grChildNode->NextSibling(TEXT("WordsStyle"))) + { + TiXmlElement *grElement = grChildNode->ToElement(); + const TCHAR *styleName = grElement->Attribute(TEXT("name")); + + int i = pLs->getStylerIndexByName(styleName); + if (i != -1) + { + Style & style = pLs->getStyler(i); + Style & style2Sync = pLs2->getStyler(i); + + writeStyle2Element(style, style2Sync, grElement); + } + } + } + } + _pXmlExternalLexerDoc[x]->SaveFile(); + } + + TiXmlNode *globalStylesRoot = (_pXmlUserStylerDoc->FirstChild(TEXT("NotepadPlus")))->FirstChildElement(TEXT("GlobalStyles")); + + 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); + + if (i != -1) + { + Style & style = _widgetStyleArray.getStyler(i); + Style & style2Sync = globalStylers.getStyler(i); + + writeStyle2Element(style, style2Sync, pElement); + } + } + + _pXmlUserStylerDoc->SaveFile(); +} + +void NppParameters::writeStyle2Element(Style & style2Wite, Style & style2Sync, TiXmlElement *element) +{ + const TCHAR *styleName = element->Attribute(TEXT("name")); + + if (HIBYTE(HIWORD(style2Wite._fgColor)) != 0xFF) + { + int rgbVal = RGB2int(style2Wite._fgColor); + TCHAR fgStr[7]; + wsprintf(fgStr, TEXT("%.6X"), rgbVal); + element->SetAttribute(TEXT("fgColor"), fgStr); + } + + if (HIBYTE(HIWORD(style2Wite._bgColor)) != 0xFF) + { + int rgbVal = RGB2int(style2Wite._bgColor); + TCHAR bgStr[7]; + wsprintf(bgStr, TEXT("%.6X"), rgbVal); + element->SetAttribute(TEXT("bgColor"), bgStr); + } + + if (style2Wite._colorStyle != COLORSTYLE_ALL) + { + element->SetAttribute(TEXT("colorStyle"), style2Wite._colorStyle); + } + + if (style2Wite._fontName) + { + const TCHAR *oldFontName = element->Attribute(TEXT("fontName")); + if (lstrcmp(oldFontName, style2Wite._fontName)) + { + element->SetAttribute(TEXT("fontName"), style2Wite._fontName); + style2Sync._fontName = style2Wite._fontName = element->Attribute(TEXT("fontName")); + } + } + + if (style2Wite._fontSize != -1) + { + if (!style2Wite._fontSize) + element->SetAttribute(TEXT("fontSize"), TEXT("")); + else + element->SetAttribute(TEXT("fontSize"), style2Wite._fontSize); + } + + if (style2Wite._fontStyle != -1) + { + element->SetAttribute(TEXT("fontStyle"), style2Wite._fontStyle); + } + + + if (style2Wite._keywords) + { + TiXmlNode *teteDeNoeud = element->LastChild(); + + if (teteDeNoeud) + teteDeNoeud->SetValue(style2Wite._keywords->c_str()); + else + element->InsertEndChild(TiXmlText(style2Wite._keywords->c_str())); + } +} + +void NppParameters::insertUserLang2Tree(TiXmlNode *node, UserLangContainer *userLang) +{ + TiXmlElement *rootElement = (node->InsertEndChild(TiXmlElement(TEXT("UserLang"))))->ToElement(); + + rootElement->SetAttribute(TEXT("name"), userLang->_name); + rootElement->SetAttribute(TEXT("ext"), userLang->_ext); + TiXmlElement *settingsElement = (rootElement->InsertEndChild(TiXmlElement(TEXT("Settings"))))->ToElement(); + { + TiXmlElement *globalElement = (settingsElement->InsertEndChild(TiXmlElement(TEXT("Global"))))->ToElement(); + globalElement->SetAttribute(TEXT("caseIgnored"), userLang->_isCaseIgnored?TEXT("yes"):TEXT("no")); + + TiXmlElement *treatAsSymbolElement = (settingsElement->InsertEndChild(TiXmlElement(TEXT("TreatAsSymbol"))))->ToElement(); + treatAsSymbolElement->SetAttribute(TEXT("comment"), userLang->_isCommentSymbol?TEXT("yes"):TEXT("no")); + treatAsSymbolElement->SetAttribute(TEXT("commentLine"), userLang->_isCommentLineSymbol?TEXT("yes"):TEXT("no")); + + TiXmlElement *prefixElement = (settingsElement->InsertEndChild(TiXmlElement(TEXT("Prefix"))))->ToElement(); + TCHAR names[nbPrefixListAllowed][7] = {TEXT("words1"), TEXT("words2"), TEXT("words3"), TEXT("words4")}; + for (int i = 0 ; i < nbPrefixListAllowed ; i++) + prefixElement->SetAttribute(names[i], userLang->_isPrefix[i]?TEXT("yes"):TEXT("no")); + } + + TiXmlElement *kwlElement = (rootElement->InsertEndChild(TiXmlElement(TEXT("KeywordLists"))))->ToElement(); + + const int nbKWL = 9; + TCHAR kwn[nbKWL][16] = {TEXT("Delimiters"), TEXT("Folder+"), TEXT("Folder-"), TEXT("Operators"), TEXT("Comment"), TEXT("Words1"), TEXT("Words2"), TEXT("Words3"), TEXT("Words4")}; + for (int i = 0 ; i < nbKWL ; i++) + { + TiXmlElement *kwElement = (kwlElement->InsertEndChild(TiXmlElement(TEXT("Keywords"))))->ToElement(); + kwElement->SetAttribute(TEXT("name"), kwn[i]); + kwElement->InsertEndChild(TiXmlText(userLang->_keywordLists[i])); + } + + TiXmlElement *styleRootElement = (rootElement->InsertEndChild(TiXmlElement(TEXT("Styles"))))->ToElement(); + + for (int i = 0 ; i < userLang->_styleArray.getNbStyler() ; i++) + { + TiXmlElement *styleElement = (styleRootElement->InsertEndChild(TiXmlElement(TEXT("WordsStyle"))))->ToElement(); + Style style2Wite = userLang->_styleArray.getStyler(i); + + styleElement->SetAttribute(TEXT("name"), style2Wite._styleDesc); + + styleElement->SetAttribute(TEXT("styleID"), style2Wite._styleID); + + //if (HIBYTE(HIWORD(style2Wite._fgColor)) != 0xFF) + { + int rgbVal = RGB2int(style2Wite._fgColor); + TCHAR fgStr[7]; + wsprintf(fgStr, TEXT("%.6X"), rgbVal); + styleElement->SetAttribute(TEXT("fgColor"), fgStr); + } + + //if (HIBYTE(HIWORD(style2Wite._bgColor)) != 0xFF) + { + int rgbVal = RGB2int(style2Wite._bgColor); + TCHAR bgStr[7]; + wsprintf(bgStr, TEXT("%.6X"), rgbVal); + styleElement->SetAttribute(TEXT("bgColor"), bgStr); + } + + if (style2Wite._colorStyle != COLORSTYLE_ALL) + { + styleElement->SetAttribute(TEXT("colorStyle"), style2Wite._colorStyle); + } + + if (style2Wite._fontName) + { + styleElement->SetAttribute(TEXT("fontName"), style2Wite._fontName); + } + + if (style2Wite._fontStyle == -1) + { + styleElement->SetAttribute(TEXT("fontStyle"), TEXT("0")); + } + else + { + styleElement->SetAttribute(TEXT("fontStyle"), style2Wite._fontStyle); + } + + if (style2Wite._fontSize != -1) + { + if (!style2Wite._fontSize) + styleElement->SetAttribute(TEXT("fontSize"), TEXT("")); + else + styleElement->SetAttribute(TEXT("fontSize"), style2Wite._fontSize); + } + } +} + +void NppParameters::stylerStrOp(bool op) +{ + for (int i = 0 ; i < _nbUserLang ; i++) + { + int nbStyler = _userLangArray[i]->_styleArray.getNbStyler(); + for (int j = 0 ; j < nbStyler ; j++) + { + Style & style = _userLangArray[i]->_styleArray.getStyler(j); + + if (op == DUP) + { + TCHAR *str = new TCHAR[lstrlen(style._styleDesc) + 1]; + style._styleDesc = lstrcpy(str, style._styleDesc); + if (style._fontName) + { + str = new TCHAR[lstrlen(style._fontName) + 1]; + style._fontName = lstrcpy(str, style._fontName); + } + else + { + str = new TCHAR[2]; + str[0] = str[1] = '\0'; + style._fontName = str; + } + } + else + { + delete [] style._styleDesc; + delete [] style._fontName; + } + } + } +} + +void NppParameters::addUserModifiedIndex(int index) +{ + size_t len = _customizedShortcuts.size(); + bool found = false; + for(size_t i = 0; i < len; i++) + { + if (_customizedShortcuts[i] == index) + { + found = true; + break; + } + } + if (!found) + { + _customizedShortcuts.push_back(index); + } +} + +void NppParameters::addPluginModifiedIndex(int index) +{ + size_t len = _pluginCustomizedCmds.size(); + bool found = false; + for(size_t i = 0; i < len; i++) + { + if (_pluginCustomizedCmds[i] == index) + { + found = true; + break; + } + } + if (!found) + { + _pluginCustomizedCmds.push_back(index); + } +} + +void NppParameters::addScintillaModifiedIndex(int index) +{ + size_t len = _scintillaModifiedKeyIndices.size(); + bool found = false; + for(size_t i = 0; i < len; i++) + { + if (_scintillaModifiedKeyIndices[i] == index) + { + found = true; + break; + } + } + if (!found) + { + _scintillaModifiedKeyIndices.push_back(index); + } +} diff --git a/PowerEditor/src/Parameters.h b/PowerEditor/src/Parameters.h new file mode 100644 index 00000000..76f4414c --- /dev/null +++ b/PowerEditor/src/Parameters.h @@ -0,0 +1,1418 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef PARAMETERS_H +#define PARAMETERS_H + +#include +#include +#include "tinyxmlA.h" +#include "tinyxml.h" + +//#include "ScintillaEditView.h" +#include "Scintilla.h" +#include "ScintillaRef.h" +#include "ToolBar.h" +#include "UserDefineLangReference.h" +#include "colors.h" +#include "shortcut.h" +#include "ContextMenu.h" + +using namespace std; + +const bool POS_VERTICAL = true; +const bool POS_HORIZOTAL = false; + +const int UDD_SHOW = 1; // 0000 0001 +const int UDD_DOCKED = 2; // 0000 0010 + +// 0 : 0000 0000 hide & undocked +// 1 : 0000 0001 show & undocked +// 2 : 0000 0010 hide & docked +// 3 : 0000 0011 show & docked + +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 + +enum formatType {WIN_FORMAT, MAC_FORMAT, UNIX_FORMAT}; +enum UniMode {uni8Bit=0, uniUTF8=1, uni16BE=2, uni16LE=3, uniCookie=4, uni7Bit=5, uniEnd}; +enum ChangeDetect {cdDisabled=0, cdEnabled=1, cdAutoUpdate=2, cdGo2end=3, cdAutoUpdateGo2end=4}; +enum BackupFeature {bak_none = 0, bak_simple = 1, bak_verbose = 2}; +enum OpenSaveDirSetting {dir_followCurrent = 0, dir_last = 1, dir_userDef = 2}; + +const int LANG_INDEX_INSTR = 0; +const int LANG_INDEX_INSTR2 = 1; +const int LANG_INDEX_TYPE = 2; +const int LANG_INDEX_TYPE2 = 3; +const int LANG_INDEX_TYPE3 = 4; +const int LANG_INDEX_TYPE4 = 5; +const int LANG_INDEX_TYPE5 = 6; + +const int COPYDATA_PARAMS = 0; +const int COPYDATA_FILENAMESA = 1; +const int COPYDATA_FILENAMESW = 2; + + +const bool SCIV_PRIMARY = false; +const bool SCIV_SECOND = true; + +const TCHAR fontSizeStrs[][3] = {TEXT(""), TEXT("8"), TEXT("9"), TEXT("10"), TEXT("11"), TEXT("12"), TEXT("14"), TEXT("16"), TEXT("18"), TEXT("20"), TEXT("22"), TEXT("24"), TEXT("26"), TEXT("28")}; + +const TCHAR LINEDRAW_FONT[] = TEXT("LINEDRAW.TTF"); +const TCHAR localConfFile[] = TEXT("doLocalConf.xml"); +const TCHAR notepadStyleFile[] = TEXT("asNotepad.xml"); + +void cutString(const TCHAR *str2cut, vector & patternVect); +/* +struct HeaderLineState { + HeaderLineState() : _headerLineNumber(0), _isCollapsed(false){}; + HeaderLineState(int lineNumber, bool isFoldUp) : _headerLineNumber(lineNumber), _isCollapsed(isFoldUp){}; + int _headerLineNumber; + bool _isCollapsed; +}; +*/ +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) {}; +}; + +struct sessionFileInfo : public Position { + sessionFileInfo(const TCHAR *fn) { + if (fn) _fileName = fn; + }; + sessionFileInfo(const TCHAR *fn, const TCHAR *ln, Position pos) : Position(pos) { + if (fn) _fileName = fn; + if (ln) _langName = ln; + }; + + sessionFileInfo(generic_string fn) : _fileName(fn){}; + sessionFileInfo(generic_string fn, Position pos) : Position(pos), _fileName(fn){}; + + generic_string _fileName; + generic_string _langName; + vector marks; +}; + +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; + vector _mainViewFiles; + vector _subViewFiles; +}; + +struct CmdLineParams { + bool _isNoPlugin; + bool _isReadOnly; + bool _isNoSession; + bool _isNoTab; + + int _line2go; + int _column2go; + + POINT _point; + bool _isPointXValid; + bool _isPointYValid; + bool isPointValid() { + return _isPointXValid && _isPointXValid; + }; + + LangType _langType; + CmdLineParams() : _isNoPlugin(false), _isReadOnly(false), _isNoSession(false), _isNoTab(false),\ + _line2go(-1), _column2go(-1), _langType(L_EXTERNAL), _isPointXValid(false), _isPointYValid(false) + { + _point.x = 0; + _point.y = 0; + } +}; + +struct FloatingWindowInfo { + int _cont; + RECT _pos; + 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 PlugingDlgDockingInfo { + TCHAR _name[MAX_PATH]; + int _internalID; + + int _currContainer; + int _prevContainer; + bool _isVisible; + + PlugingDlgDockingInfo(const TCHAR *pluginName, int id, int curr, int prev, bool isVis) : _internalID(id), _currContainer(curr), _prevContainer(prev), _isVisible(isVis){ + lstrcpy(_name, pluginName); + }; + + friend inline const bool operator==(const PlugingDlgDockingInfo & a, const PlugingDlgDockingInfo & b) { + if ((lstrcmp(a._name, b._name) == 0) && (a._internalID == b._internalID)) + return true; + else + return false; + }; +}; + +struct ContainerTabInfo { + int _cont; + int _activeTab; + + 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) {}; + + vector _flaotingWindowInfo; + vector _pluginDockInfo; + vector _containerTabInfo; + + RECT * getFloatingRCFrom(int floatCont) { + for (size_t i = 0 ; i < _flaotingWindowInfo.size() ; i++) + { + if (_flaotingWindowInfo[i]._cont == floatCont) + return &(_flaotingWindowInfo[i]._pos); + } + return NULL; + } +}; + +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; +}; + +const int FONTSTYLE_BOLD = 1; +const int FONTSTYLE_ITALIC = 2; +const int FONTSTYLE_UNDERLINE = 4; + +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; + + COLORREF _fgColor; + COLORREF _bgColor; + int _colorStyle; + const TCHAR *_fontName; + int _fontStyle; + int _fontSize; + + int _keywordClass; + generic_string *_keywords; + + Style():_styleID(-1), _fgColor(COLORREF(-1)), _bgColor(COLORREF(-1)), _colorStyle(COLORSTYLE_ALL), _fontName(NULL), _fontStyle(-1), _fontSize(-1), _keywordClass(-1), _keywords(NULL){}; + + ~Style(){ + if (_keywords) + delete _keywords; + }; + + 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; + _keywordClass = style._keywordClass; + if (style._keywords) + _keywords = new generic_string(*(style._keywords)); + else + _keywords = NULL; + }; + + 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; + + 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)) + { + delete (this->_keywords); + this->_keywords = NULL; + } + } + return *this; + }; + + void setKeywords(const TCHAR *str) { + if (!_keywords) + _keywords = new generic_string(str); + else + *_keywords = str; + }; +}; + +struct GlobalOverride +{ + 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) {}; +}; + +const int MAX_STYLE = 30; + +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; + } + + int getNbStyler() const {return _nbStyler;}; + void setNbStyler(int nb) {_nbStyler = nb;}; + + Style & getStyler(int index) {return _styleArray[index];}; + + bool hasEnoughSpace() {return (_nbStyler < MAX_STYLE);}; + void addStyler(int styleID, TiXmlNode *styleNode); + + void addStyler(int styleID, TCHAR *styleName) { + //ZeroMemory(&_styleArray[_nbStyler], sizeof(Style));; + _styleArray[_nbStyler]._styleID = styleID; + _styleArray[_nbStyler]._styleDesc = styleName; + _styleArray[_nbStyler]._fgColor = black; + _styleArray[_nbStyler]._bgColor = white; + _nbStyler++; + }; + + 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 { + if (!name) + return -1; + for (int i = 0 ; i < _nbStyler ; i++) + if (!lstrcmp(_styleArray[i]._styleDesc, name)) + return i; + return -1; + }; + +protected: + Style _styleArray[MAX_STYLE]; + int _nbStyler; +}; + +struct LexerStyler : public StyleArray +{ +public : + LexerStyler():StyleArray(){}; + + LexerStyler & operator=(const LexerStyler & ls) + { + if (this != &ls) + { + *((StyleArray *)this) = ls; + lstrcpy(this->_lexerName, ls._lexerName); + lstrcpy(this->_lexerDesc, ls._lexerDesc); + lstrcpy(this->_lexerUserExt, ls._lexerUserExt); + } + return *this; + } + + void setLexerName(const TCHAR *lexerName) { + lstrcpy(_lexerName, lexerName); + }; + + void setLexerDesc(const TCHAR *lexerDesc) { + lstrcpy(_lexerDesc, lexerDesc); + }; + + void setLexerUserExt(const TCHAR *lexerUserExt) { + lstrcpy(_lexerUserExt, lexerUserExt); + }; + + const TCHAR * getLexerName() const {return _lexerName;}; + const TCHAR * getLexerDesc() const {return _lexerDesc;}; + const TCHAR * getLexerUserExt() const {return _lexerUserExt;}; + +private : + TCHAR _lexerName[16]; + TCHAR _lexerDesc[32]; + TCHAR _lexerUserExt[256]; +}; + +const int MAX_LEXER_STYLE = 80; + +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; + } + + int getNbLexer() const {return _nbLexerStyler;}; + + LexerStyler & getLexerFromIndex(int index) + { + return _lexerStylerArray[index]; + }; + + 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) { + 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); + void eraseAll(); +private : + LexerStyler _lexerStylerArray[MAX_LEXER_STYLE]; + int _nbLexerStyler; +}; + +struct NewDocDefaultSettings +{ + formatType _format; + UniMode _encoding; + bool _openAnsiAsUtf8; + LangType _lang; + NewDocDefaultSettings():_format(WIN_FORMAT), _encoding(uni8Bit), _openAnsiAsUtf8(false), _lang(L_TXT){}; +}; + +struct LangMenuItem { + LangType _langType; + int _cmdID; + generic_string _langName; + + LangMenuItem(LangType lt, int cmdID = 0, generic_string langName = TEXT("")): + _langType(lt), _cmdID(cmdID), _langName(langName){}; +}; + +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; + generic_string _footerFontName; + int _footerFontStyle; + int _footerFontSize; + + RECT _marge; + + PrintSettings() : _printLineNumber(true), _printOption(SC_PRINT_NORMAL), _headerLeft(TEXT("")), _headerMiddle(TEXT("")), _headerRight(TEXT("")),\ + _headerFontName(TEXT("")), _headerFontStyle(0), _headerFontSize(0), _footerLeft(TEXT("")), _footerMiddle(TEXT("")), _footerRight(TEXT("")),\ + _footerFontName(TEXT("")), _footerFontStyle(0), _footerFontSize(0) { + _marge.left = 0; _marge.top = 0; _marge.right = 0; _marge.bottom = 0; + }; + + bool isHeaderPresent() const { + return ((_headerLeft != TEXT("")) || (_headerMiddle != TEXT("")) || (_headerRight != TEXT(""))); + }; + + bool isFooterPresent() const { + return ((_footerLeft != TEXT("")) || (_footerMiddle != TEXT("")) || (_footerRight != TEXT(""))); + }; + + bool isUserMargePresent() const { + return ((_marge.left != 0) || (_marge.top != 0) || (_marge.right != 0) || (_marge.bottom != 0)); + }; +}; + +struct NppGUI +{ + 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), _enableTagsMatchHilite(true), _enableTagAttrsHilite(true), _enableHiliteNonHTMLZone(false),\ + _isMaximized(false), _isMinimizedToTray(false), _rememberLastSession(true), _backup(bak_none), _useDir(false),\ + _doTaskList(true), _maitainIndent(true), _openSaveDir(dir_followCurrent), _styleMRU(true), _styleURL(0),\ + _autocStatus(autoc_none), _autocFromLen(1), _funcParams(false), _definedSessionExt(TEXT("")), _neverUpdate(false),\ + _doesExistUpdater(false), _caretBlinkRate(250), _caretWidth(1), _shortTitlebar(false), _themeName(TEXT("")), _isLangMenuCompact(false) { + _appPos.left = 0; + _appPos.top = 0; + _appPos.right = 700; + _appPos.bottom = 500; + + _backupDir[0] = '\0'; + _defaultDir[0] = 0; + _defaultDirExp[0] = 0; + }; + toolBarStatusType _toolBarStatus; // small, large ou standard + bool _toolbarShow; + bool _statusBarShow; // show ou hide + bool _menuBarShow; + + // 1st bit : draw top bar; + // 2nd bit : draw inactive tabs + // 3rd bit : enable drag & drop + // 4th bit : reduce the height + // 5th bit : enable vertical + // 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; + + bool _splitterPos; // horizontal ou vertical + int _userDefineDlgStatus; // (hide||show) && (docked||undocked) + + int _tabSize; + bool _tabReplacedBySpace; + + ChangeDetect _fileAutoDetection; + ChangeDetect _fileAutoDetectionOriginalValue; + bool _checkHistoryFiles; + + RECT _appPos; + + bool _isMaximized; + bool _isMinimizedToTray; + bool _rememberLastSession; + bool _doTaskList; + bool _maitainIndent; + bool _enableSmartHilite; + bool _enableTagsMatchHilite; + bool _enableTagAttrsHilite; + bool _enableHiliteNonHTMLZone; + bool _styleMRU; + + // 0 : do nothing + // 1 : don't draw underline + // 2 : draw underline + int _styleURL; + + NewDocDefaultSettings _newDocDefaultSettings; + void setTabReplacedBySpace(bool b) {_tabReplacedBySpace = b;}; + const NewDocDefaultSettings & getNewDocDefaultSettings() const {return _newDocDefaultSettings;}; + vector _excludedLangList; + bool _isLangMenuCompact; + + PrintSettings _printSettings; + BackupFeature _backup; + bool _useDir; + TCHAR _backupDir[MAX_PATH]; + DockingManagerData _dockingData; + GlobalOverride _globalOverride; + enum AutocStatus{autoc_none, autoc_func, autoc_word}; + AutocStatus _autocStatus; + size_t _autocFromLen; + bool _funcParams; + + generic_string _definedSessionExt; + bool _neverUpdate; + bool _doesExistUpdater; + int _caretBlinkRate; + int _caretWidth; + + bool _shortTitlebar; + + OpenSaveDirSetting _openSaveDir; + TCHAR _defaultDir[MAX_PATH]; + TCHAR _defaultDirExp[MAX_PATH]; //expanded environment variables + generic_string _themeName; +}; + +struct ScintillaViewParams +{ + ScintillaViewParams() : _lineNumberMarginShow(true), _bookMarkMarginShow(true),\ + _folderStyle(FOLDER_STYLE_BOX), _indentGuideLineShow(true),\ + _currentLineHilitingShow(true), _wrapSymbolShow(false), _doWrap(false),\ + _zoom(0), _whiteSpaceShow(false), _eolShow(false){}; + bool _lineNumberMarginShow; + bool _bookMarkMarginShow; + //bool _docChangeStateMarginShow; + folderStyle _folderStyle; //"simple", TEXT("arrow"), TEXT("circle") and "box" + bool _indentGuideLineShow; + bool _currentLineHilitingShow; + bool _wrapSymbolShow; + bool _doWrap; + int _edgeMode; + int _edgeNbColumn; + int _zoom; + bool _whiteSpaceShow; + bool _eolShow; + +}; + +const int NB_LIST = 20; +const int NB_MAX_LRF_FILE = 30; +const int NB_MAX_USER_LANG = 30; +const int NB_MAX_EXTERNAL_LANG = 30; +const int LANG_NAME_LEN = 32; + +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_FILTER = 20; + +struct Lang +{ + LangType _langID; + TCHAR _langName[LANG_NAME_LEN]; + const TCHAR *_defaultExtList; + const TCHAR *_langKeyWordList[NB_LIST]; + const TCHAR *_pCommentLineSymbol; + const TCHAR *_pCommentStart; + const TCHAR *_pCommentEnd; + + Lang() {for (int i = 0 ; i < NB_LIST ; _langKeyWordList[i] = NULL ,i++);}; + Lang(LangType langID, const TCHAR *name) : _langID(langID){ + _langName[0] = '\0'; + if (name) + lstrcpy(_langName, name); + for (int i = 0 ; i < NB_LIST ; _langKeyWordList[i] = NULL ,i++); + }; + ~Lang() {}; + 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; + }; + + 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;}; +}; + +class UserLangContainer +{ +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; + +public : + UserLangContainer(){ + _name = TEXT("new user define"); + _ext = TEXT(""); + + // Keywords list of Delimiters (index 0) + lstrcpy(_keywordLists[0], TEXT("000000")); + for (int i = 1 ; i < nbKeywodList ; i++) + *_keywordLists[i] = '\0'; + }; + UserLangContainer(const TCHAR *name, const TCHAR *ext) : _name(name), _ext(ext) { + // Keywords list of Delimiters (index 0) + lstrcpy(_keywordLists[0], TEXT("000000")); + for (int j = 1 ; j < nbKeywodList ; j++) + *_keywordLists[j] = '\0'; + }; + + UserLangContainer & operator=(const UserLangContainer & ulc) { + if (this != &ulc) + { + this->_name = ulc._name; + this->_ext = ulc._ext; + this->_isCaseIgnored = ulc._isCaseIgnored; + this->_styleArray = ulc._styleArray; + int nbStyler = this->_styleArray.getNbStyler(); + for (int i = 0 ; i < nbStyler ; i++) + { + Style & st = this->_styleArray.getStyler(i); + if (st._bgColor == COLORREF(-1)) + st._bgColor = white; + if (st._fgColor == COLORREF(-1)) + st._fgColor = black; + } + for (int i = 0 ; i < nbKeywodList ; i++) + lstrcpy(this->_keywordLists[i], ulc._keywordLists[i]); + } + return *this; + }; + + int getNbKeywordList() {return nbKeywodList;}; + const TCHAR * getName() {return _name.c_str();}; + const TCHAR * getExtention() {return _ext.c_str();}; + +private: + generic_string _name; + generic_string _ext; + + StyleArray _styleArray; + TCHAR _keywordLists[nbKeywodList][max_char]; + + bool _isCaseIgnored; + bool _isCommentLineSymbol; + bool _isCommentSymbol; + bool _isPrefix[nbPrefixListAllowed]; +}; + +#define MAX_EXTERNAL_LEXER_NAME_LEN 16 +#define MAX_EXTERNAL_LEXER_DESC_LEN 32 + +class ExternalLangContainer +{ +public: + TCHAR _name[MAX_EXTERNAL_LEXER_NAME_LEN]; + TCHAR _desc[MAX_EXTERNAL_LEXER_DESC_LEN]; + + 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 { + enum searchMode{normal, extended, regExpr}; + enum transparencyMode{none, onLossingFocus, persistant}; + + FindHistory() : _nbMaxFindHistoryPath(10), _nbMaxFindHistoryFilter(10), _nbMaxFindHistoryFind(10), _nbMaxFindHistoryReplace(10),\ + _nbFindHistoryPath(0), _nbFindHistoryFilter(0),_nbFindHistoryFind(0), _nbFindHistoryReplace(0),\ + _isMatchWord(false), _isMatchCase(false),_isWrap(true),_isDirectionDown(true),\ + _isFifRecuisive(true), _isFifInHiddenFolder(false), _isDlgAlwaysVisible(false),\ + _isFilterFollowDoc(false), _isFolderFollowDoc(false),\ + _searchMode(normal), _transparencyMode(onLossingFocus), _transparency(150) + + {}; + int _nbMaxFindHistoryPath; + int _nbMaxFindHistoryFilter; + int _nbMaxFindHistoryFind; + int _nbMaxFindHistoryReplace; + + int _nbFindHistoryPath; + int _nbFindHistoryFilter; + int _nbFindHistoryFind; + int _nbFindHistoryReplace; + + generic_string *_pFindHistoryPath[NB_MAX_FINDHISTORY_PATH]; + generic_string *_pFindHistoryFilter[NB_MAX_FINDHISTORY_FILTER]; + generic_string *_pFindHistoryFind[NB_MAX_FINDHISTORY_FIND]; + generic_string *_pFindHistoryReplace[NB_MAX_FINDHISTORY_REPLACE]; + + bool _isMatchWord; + bool _isMatchCase; + bool _isWrap; + bool _isDirectionDown; + + bool _isFifRecuisive; + bool _isFifInHiddenFolder; + + searchMode _searchMode; + transparencyMode _transparencyMode; + int _transparency; + + bool _isDlgAlwaysVisible; + bool _isFilterFollowDoc; + bool _isFolderFollowDoc; +}; + + +#ifdef UNICODE + +class LocalizationSwitcher { +friend class NppParameters; +public : + LocalizationSwitcher() {}; + + struct LocalizationDefinition { + wchar_t *_langName; + wchar_t *_xmlFileName; + }; + + bool addLanguageFromXml(wstring xmlFullPath); + wstring getLangFromXmlFileName(wchar_t *fn) const; + + wstring getXmlFilePathFromLangName(wchar_t *langName) const; + bool switchToLang(wchar_t *lang2switch) const; + + size_t size() const { + return _localizationList.size(); + }; + + pair getElementFromIndex(size_t index) { + if (index >= _localizationList.size()) + return pair(TEXT(""), TEXT("")); + return _localizationList[index]; + }; + +private : + vector< pair< wstring, wstring > > _localizationList; + wstring _nativeLangPath; +}; +#endif + +class ThemeSwitcher { +friend class NppParameters; + +public : + ThemeSwitcher(){}; + + struct ThemeDefinition { + TCHAR *_themeName; + TCHAR *_xmlFileName; + }; + + void addThemeFromXml(generic_string xmlFullPath) { + _themeList.push_back(pair(getThemeFromXmlFileName(xmlFullPath.c_str()), xmlFullPath)); + }; + + void addDefaultThemeFromXml(generic_string xmlFullPath) { + _themeList.push_back(pair(TEXT("Default"), xmlFullPath)); + }; + + generic_string getThemeFromXmlFileName(const TCHAR *fn) const; + + generic_string getXmlFilePathFromThemeName(const TCHAR *themeName) const { + if (!themeName || themeName[0]) + return TEXT(""); + generic_string themePath = _stylesXmlPath; + return themePath; + }; + + bool themeNameExists(const TCHAR *themeName) { + for (size_t i = 0; i < _themeList.size(); i++ ) + { + if (! (getElementFromIndex(i)).first.compare(themeName) ) return true; + } + return false; + } + + size_t size() const { + return _themeList.size(); + }; + + + pair & getElementFromIndex(size_t index) { + //if (index >= _themeList.size()) + //return pair(TEXT(""), TEXT("")); + return _themeList[index]; + }; + +private : + vector< pair< generic_string, generic_string > > _themeList; + generic_string _stylesXmlPath; +}; + +const int NB_LANG = 80; + +const bool DUP = true; +const bool FREE = false; + +class NppParameters +{ +public: + static NppParameters * getInstance() {return _pSelf;}; + static LangType getLangIDFromStr(const TCHAR *langName); + bool load(); + bool reloadLang(); + bool reloadStylers(TCHAR *stylePath = NULL); + void destroyInstance(); + + bool _isTaskListRBUTTONUP_Active; + int L_END; + + const NppGUI & getNppGUI() const { + return _nppGUI; + }; + + const TCHAR * getWordList(LangType langID, int typeIndex) const { + Lang *pLang = getLangFromID(langID); + if (!pLang) return NULL; + + return pLang->getWords(typeIndex); + }; + + Lang * getLangFromID(LangType langID) const { + for (int i = 0 ; i < _nbLang ; i++) + { + if ((_langList[i]->_langID == langID) || (!_langList[i])) + return _langList[i]; + } + return NULL; + }; + + Lang * getLangFromIndex(int i) const { + if (i >= _nbLang) return NULL; + return _langList[i]; + }; + + int getNbLang() const {return _nbLang;}; + + const TCHAR * getLangExtFromName(const TCHAR *langName) const { + for (int i = 0 ; i < _nbLang ; i++) + { + if (!lstrcmp(_langList[i]->_langName, langName)) + return _langList[i]->_defaultExtList; + } + return NULL; + }; + + const TCHAR * getLangExtFromLangType(LangType langType) const { + for (int i = 0 ; i < _nbLang ; i++) + { + if (_langList[i]->_langID == langType) + return _langList[i]->_defaultExtList; + } + return NULL; + }; + + int getNbLRFile() const {return _nbFile;}; + + generic_string *getLRFile(int index) const { + return _LRFileList[index]; + }; + + void setNbMaxFile(int nb) { + _nbMaxFile = nb; + }; + + int getNbMaxFile() const {return _nbMaxFile;}; + + const ScintillaViewParams & getSVP(bool whichOne) const { + return _svp[whichOne]; + }; + + bool writeNbHistoryFile(int nb) { + 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"), nb); + return true; + }; + + bool writeHistory(const TCHAR *fullpath); + + TiXmlNode * getChildElementByAttribut(TiXmlNode *pere, const TCHAR *childName,\ + const TCHAR *attributName, const TCHAR *attributVal) const; + + bool writeScintillaParams(const ScintillaViewParams & svp, bool whichOne); + + bool writeGUIParams(); + + void writeStyles(LexerStylerArray & lexersStylers, StyleArray & globalStylers); + + LexerStylerArray & getLStylerArray() {return _lexerStylerArray;}; + StyleArray & getGlobalStylers() {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; + }; + + void setFontList(HWND hWnd); + const 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; + }; + + 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; + }; + ExternalLangContainer & getELCFromIndex(int i) {return *_externalLangArray[i];}; + + bool ExternalLangHasRoom() const {return _nbExternalLang < NB_MAX_EXTERNAL_LANG;}; + + void getExternalLexerFromXmlTree(TiXmlDocument *doc); + vector * getExternalLexerDoc() { return &_pXmlExternalLexerDoc;}; + + void writeUserDefinedLang(); + void writeShortcuts(); + void writeSession(const Session & session, const TCHAR *fileName = NULL); + bool writeFindHistory(); + + + bool isExistingUserLangName(const TCHAR *newName) const { + if ((!newName) || (!newName[0])) + return true; + + for (int i = 0 ; i < _nbUserLang ; i++) + { + if (!lstrcmp(_userLangArray[i]->_name.c_str(), newName)) + return true; + } + return false; + }; + + const TCHAR * getUserDefinedLangNameFromExt(TCHAR *ext) { + if ((!ext) || (!ext[0])) + return NULL; + + for (int i = 0 ; i < _nbUserLang ; i++) + { + vector extVect; + cutString(_userLangArray[i]->_ext.c_str(), extVect); + for (size_t j = 0 ; j < extVect.size() ; j++) + if (!generic_stricmp(extVect[j].c_str(), ext)) + return _userLangArray[i]->_name.c_str(); + } + return NULL; + }; + + 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; + }; + + int addExternalLangToEnd(ExternalLangContainer * externalLang); + + //TiXmlDocument * getNativeLang() const {return _pXmlNativeLangDoc;}; + + TiXmlDocumentA * getNativeLangA() const {return _pXmlNativeLangDocA;}; + + TiXmlDocument * getToolIcons() const {return _pXmlToolIconsDoc;}; + + bool isTransparentAvailable() const { + return (_transparentFuncAddr != NULL); + }; + + void SetTransparent(HWND hwnd, int percent) { + if (!_transparentFuncAddr) return; + ::SetWindowLongPtr(hwnd, GWL_EXSTYLE, ::GetWindowLongPtr(hwnd, GWL_EXSTYLE) | 0x00080000); + _transparentFuncAddr(hwnd, 0, percent, 0x00000002); + }; + + void removeTransparent(HWND hwnd) { + ::SetWindowLongPtr(hwnd, GWL_EXSTYLE, ::GetWindowLongPtr(hwnd, GWL_EXSTYLE) & ~0x00080000); + }; + + void setCmdlineParam(const CmdLineParams & cmdLineParams) { + _cmdLineParams = cmdLineParams; + }; + CmdLineParams & getCmdLineParams() {return _cmdLineParams;}; + + void setFileSaveDlgFilterIndex(int ln) {_fileSaveDlgFilterIndex = ln;}; + int getFileSaveDlgFilterIndex() const {return _fileSaveDlgFilterIndex;}; + + bool isRemappingShortcut() const {return _shortcuts.size() != 0;}; + + vector & getUserShortcuts() {return _shortcuts;}; + vector & getUserModifiedShortcuts() {return _customizedShortcuts;}; + void addUserModifiedIndex(int index); + + vector & getMacroList() {return _macros;}; + vector & getUserCommandList() {return _userCommands;}; + vector & getPluginCommandList() {return _pluginCommands;}; + vector & getPluginModifiedKeyIndices() {return _pluginCustomizedCmds;}; + void addPluginModifiedIndex(int index); + + vector & getScintillaKeyList() {return _scintillaKeyCommands;}; + vector & getScintillaModifiedKeyIndices() {return _scintillaModifiedKeyIndices;}; + void addScintillaModifiedIndex(int index); + + vector & getContextMenuItems() {return _contextMenuItems;}; + const Session & getSession() const {return _session;}; + bool hasCustomContextMenu() const {return !_contextMenuItems.empty();}; + + void setAccelerator(Accelerator *pAccel) {_pAccelerator = pAccel;}; + Accelerator * getAccelerator() {return _pAccelerator;}; + void setScintillaAccelerator(ScintillaAccelerator *pScintAccel) {_pScintAccelerator = pScintAccel;}; + ScintillaAccelerator * getScintillaAccelerator() {return _pScintAccelerator;}; + + const TCHAR * getNppPath() const {return _nppPath;}; + const TCHAR * getAppDataNppDir() const {return _appdataNppDir;}; + const TCHAR * getWorkingDir() const {return _currentDirectory;}; + void setWorkingDir(const TCHAR * newPath); + + bool loadSession(Session & session, const TCHAR *sessionFileName); + int langTypeToCommandID(LangType lt) const; + WNDPROC getEnableThemeDlgTexture() const {return _enableThemeDialogTextureFuncAddr;}; + + struct FindDlgTabTitiles { + generic_string _find; + generic_string _replace; + generic_string _findInFiles; + FindDlgTabTitiles() : _find(TEXT("")), _replace(TEXT("")), _findInFiles(TEXT("")) {}; + bool isWellFilled() { + return (lstrcmp(_find.c_str(), TEXT("")) != 0 && lstrcmp(_replace.c_str(), TEXT("")) && lstrcmp(_findInFiles.c_str(), TEXT(""))); + }; + }; + + FindDlgTabTitiles & getFindDlgTabTitiles() { return _findDlgTabTitiles;}; + + const char * getNativeLangMenuStringA(int itemID) { + if (!_pXmlNativeLangDocA) + return NULL; + + TiXmlNodeA * node = _pXmlNativeLangDocA->FirstChild("NotepadPlus"); + if (!node) return NULL; + + node = node->FirstChild("Native-Langue"); + if (!node) return NULL; + + node = node->FirstChild("Menu"); + if (!node) return NULL; + + node = node->FirstChild("Main"); + if (!node) return NULL; + + node = node->FirstChild("Commands"); + if (!node) return NULL; + + for (TiXmlNodeA *childNode = node->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElementA *element = childNode->ToElement(); + int id; + if (element->Attribute("id", &id) && (id == itemID)) + { + return element->Attribute("name"); + } + } + return NULL; + }; + + bool asNotepadStyle() const {return _asNotepadStyle;}; + + bool reloadPluginCmds() { + return getPluginCmdsFromXmlTree(); + } + + bool getContextMenuFromXmlTree(HMENU mainMenuHadle); + bool reloadContextMenuFromXmlTree(HMENU mainMenuHadle); + winVer getWinVersion() { return _winVersion;}; + FindHistory & getFindHistory() {return _findHistory;}; + bool _isFindReplacing; // an on the fly variable for find/replace functions + +#ifdef UNICODE + LocalizationSwitcher & getLocalizationSwitcher() { + return _localizationSwitcher; + }; +#endif + ThemeSwitcher & getThemeSwitcher() { + return _themeSwitcher; + }; + +private: + NppParameters(); + ~NppParameters(); + + static NppParameters *_pSelf; + + TiXmlDocument *_pXmlDoc, *_pXmlUserDoc, *_pXmlUserStylerDoc, *_pXmlUserLangDoc,\ + *_pXmlToolIconsDoc, *_pXmlShortcutDoc, *_pXmlContextMenuDoc, *_pXmlSessionDoc; + + TiXmlDocumentA *_pXmlNativeLangDocA; + //TiXmlDocumentA *_pXmlEnglishDocA; + + vector _pXmlExternalLexerDoc; + + NppGUI _nppGUI; + ScintillaViewParams _svp[2]; + Lang *_langList[NB_LANG]; + int _nbLang; + + generic_string *_LRFileList[NB_MAX_LRF_FILE]; + int _nbFile; + int _nbMaxFile; + + FindHistory _findHistory; + + UserLangContainer *_userLangArray[NB_MAX_USER_LANG]; + int _nbUserLang; + TCHAR _userDefineLangPath[MAX_PATH]; + ExternalLangContainer *_externalLangArray[NB_MAX_EXTERNAL_LANG]; + int _nbExternalLang; + + CmdLineParams _cmdLineParams; + + int _fileSaveDlgFilterIndex; + + // All Styles (colours & fonts) + LexerStylerArray _lexerStylerArray; + StyleArray _widgetStyleArray; + + vector _fontlist; + + HMODULE _hUser32; + HMODULE _hUXTheme; + + WNDPROC _transparentFuncAddr; + WNDPROC _enableThemeDialogTextureFuncAddr; + + + vector _shortcuts; //main menu shortuts. Static size + vector _customizedShortcuts; //altered main menu shortcuts. Indices static. Needed when saving alterations + vector _macros; //macro shortcuts, dynamic size, defined on loading macros and adding/deleting them + vector _userCommands; //run shortcuts, dynamic size, defined on loading run commands and adding/deleting them + vector _pluginCommands; //plugin commands, dynamic size, defined on loading plugins + vector _pluginCustomizedCmds; //plugincommands that have been altered. Indices determined after loading ALL plugins. Needed when saving alterations + + vector _scintillaKeyCommands; //scintilla keycommands. Static size + vector _scintillaModifiedKeyIndices; //modified scintilla keys. Indices static, determined by searching for commandId. Needed when saving alterations +#ifdef UNICODE + LocalizationSwitcher _localizationSwitcher; +#endif + ThemeSwitcher _themeSwitcher; + + //vector _noMenuCmdNames; + vector _contextMenuItems; + Session _session; + + TCHAR _shortcutsPath[MAX_PATH]; + TCHAR _contextMenuPath[MAX_PATH]; + TCHAR _sessionPath[MAX_PATH]; + TCHAR _nppPath[MAX_PATH]; + TCHAR _userPath[MAX_PATH]; + TCHAR _stylerPath[MAX_PATH]; + TCHAR _appdataNppDir[MAX_PATH]; // sentinel of the absence of "doLocalConf.xml" : (_appdataNppDir == TEXT(""))?"doLocalConf.xml present":"doLocalConf.xml absent" + TCHAR _currentDirectory[MAX_PATH]; + + Accelerator *_pAccelerator; + ScintillaAccelerator * _pScintAccelerator; + + FindDlgTabTitiles _findDlgTabTitiles; + bool _asNotepadStyle; + + winVer _winVersion; + + static int CALLBACK EnumFontFamExProc(ENUMLOGFONTEX *lpelfe, NEWTEXTMETRICEX *lpntme, int FontType, LPARAM lParam) { + vector *pStrVect = (vector *)lParam; + size_t vectSize = pStrVect->size(); + + //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((*pStrVect)[i].c_str(), (const TCHAR *)lpelfe->elfLogFont.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 + pStrVect->push_back((TCHAR *)lpelfe->elfLogFont.lfFaceName); + return 1; // I want to get all fonts + }; + + void getLangKeywordsFromXmlTree(); + bool getUserParametersFromXmlTree(); + bool getUserStylersFromXmlTree(); + bool getUserDefineLangsFromXmlTree(); + bool getShortcutsFromXmlTree(); + + bool getMacrosFromXmlTree(); + bool getUserCmdsFromXmlTree(); + bool getPluginCmdsFromXmlTree(); + bool getScintKeysFromXmlTree(); + bool getSessionFromXmlTree(TiXmlDocument *pSessionDoc = NULL, Session *session = NULL); + + void feedGUIParameters(TiXmlNode *node); + void feedKeyWordsParameters(TiXmlNode *node); + void feedFileListParameters(TiXmlNode *node); + void feedScintillaParam(bool whichOne, TiXmlNode *node); + void feedDockingManager(TiXmlNode *node); + void feedFindHistoryParameters(TiXmlNode *node); + + bool feedStylerArray(TiXmlNode *node); + void getAllWordStyles(TCHAR *lexerName, TiXmlNode *lexerNode); + + void feedUserLang(TiXmlNode *node); + int getIndexFromKeywordListName(const TCHAR *name); + void feedUserStyles(TiXmlNode *node); + void feedUserKeywordList(TiXmlNode *node); + void feedUserSettings(TiXmlNode *node); + + void feedShortcut(TiXmlNode *node); + void feedMacros(TiXmlNode *node); + void feedUserCmds(TiXmlNode *node); + void feedPluginCustomizedCmds(TiXmlNode *node); + void feedScintKeys(TiXmlNode *node); + + void getActions(TiXmlNode *node, Macro & macro); + bool getShortcuts(TiXmlNode *node, Shortcut & sc); + + void writeStyle2Element(Style & style2Wite, Style & style2Sync, TiXmlElement *element); + void insertUserLang2Tree(TiXmlNode *node, UserLangContainer *userLang); + void insertCmd(TiXmlNode *cmdRoot, const CommandShortcut & cmd); + void insertMacro(TiXmlNode *macrosRoot, const MacroShortcut & macro); + void insertUserCmd(TiXmlNode *userCmdRoot, const UserCommand & userCmd); + void insertScintKey(TiXmlNode *scintKeyRoot, const ScintillaKeyMap & scintKeyMap); + void insertPluginCmd(TiXmlNode *pluginCmdRoot, const PluginCmdShortcut & pluginCmd); + void stylerStrOp(bool op); + TiXmlElement * insertGUIConfigBoolNode(TiXmlNode *r2w, const TCHAR *name, bool bVal); + void insertDockingParamNode(TiXmlNode *GUIRoot); + void writeExcludedLangList(TiXmlElement *element); + void writePrintSetting(TiXmlElement *element); + void initMenuKeys(); //initialise menu keys and scintilla keys. Other keys are initialized on their own + void initScintillaKeys(); //these functions have to be called first before any modifications are loaded +}; + +#endif //PARAMETERS_H diff --git a/PowerEditor/src/ScitillaComponent/AutoCompletion.cpp b/PowerEditor/src/ScitillaComponent/AutoCompletion.cpp new file mode 100644 index 00000000..ad14a07a --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/AutoCompletion.cpp @@ -0,0 +1,306 @@ +//this file is part of Notepad++ +//Copyright (C)2008 Harry Bruin +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "AutoCompletion.h" +#include "Notepad_plus_msgs.h" +#include + +static bool isInList(generic_string word, const vector & wordArray) +{ + for (size_t i = 0 ; i < wordArray.size() ; i++) + if (wordArray[i] == word) + return true; + return false; +}; + +AutoCompletion::AutoCompletion(ScintillaEditView * pEditView) : _funcCompletionActive(false), _pEditView(pEditView), _funcCalltip(pEditView), + _curLang(L_TXT), _XmlFile(TEXT("")), _activeCompletion(CompletionNone), + _pXmlKeyword(NULL), _ignoreCase(true), _keyWords(TEXT("")) +{ + //Do not load any language yet +} + +bool AutoCompletion::showAutoComplete() { + if (!_funcCompletionActive) + return false; + + int curPos = int(_pEditView->execute(SCI_GETCURRENTPOS)); + int line = _pEditView->getCurrentLineNumber(); + int startLinePos = int(_pEditView->execute(SCI_POSITIONFROMLINE, line )); + int startWordPos = startLinePos; + + int len = curPos-startLinePos; + char * lineBuffer = new char[len+1]; + _pEditView->getText(lineBuffer, startLinePos, curPos); + + int offset = len-1; + int nrChars = 0; + char c; + while (offset>=0) + { + c = lineBuffer[offset]; + if (isalnum(c) || c == '_') { + nrChars++; + } else { + break; + } + offset--; + + } + startWordPos = curPos-nrChars; + + _pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM('\n')); + _pEditView->execute(SCI_AUTOCSETIGNORECASE, _ignoreCase); + _pEditView->showAutoComletion(curPos - startWordPos, _keyWords.c_str()); + + _activeCompletion = CompletionAuto; + return true; +} + +bool AutoCompletion::showWordComplete(bool autoInsert) +{ + int curPos = int(_pEditView->execute(SCI_GETCURRENTPOS)); + int startPos = int(_pEditView->execute(SCI_WORDSTARTPOSITION, curPos, true)); + + if (curPos == startPos) + return false; + + const size_t bufSize = 256; + size_t len = (curPos > startPos)?(curPos - startPos):(startPos - curPos); + if (len >= bufSize) + return false; + + TCHAR beginChars[bufSize]; + + _pEditView->getGenericText(beginChars, startPos, curPos); + + generic_string expr(TEXT("\\<")); + expr += beginChars; + expr += TEXT("[^ \\t.,;:\"()=<>'+!\\[\\]]*"); + + int docLength = int(_pEditView->execute(SCI_GETLENGTH)); + + int flags = SCFIND_WORDSTART | SCFIND_MATCHCASE | SCFIND_REGEXP | SCFIND_POSIX; + + _pEditView->execute(SCI_SETSEARCHFLAGS, flags); + vector wordArray; + int posFind = _pEditView->searchInTarget(expr.c_str(), 0, docLength); + + while (posFind != -1) + { + int wordStart = int(_pEditView->execute(SCI_GETTARGETSTART)); + int wordEnd = int(_pEditView->execute(SCI_GETTARGETEND)); + + size_t foundTextLen = wordEnd - wordStart; + + if (foundTextLen < bufSize) + { + TCHAR w[bufSize]; + _pEditView->getGenericText(w, wordStart, wordEnd); + + if (lstrcmp(w, beginChars)) + if (!isInList(w, wordArray)) + wordArray.push_back(w); + } + posFind = _pEditView->searchInTarget(expr.c_str(), wordEnd, docLength); + } + if (wordArray.size() == 0) return false; + + if (wordArray.size() == 1 && autoInsert) + { + _pEditView->replaceTargetRegExMode(wordArray[0].c_str(), startPos, curPos); + _pEditView->execute(SCI_GOTOPOS, startPos + wordArray[0].length()); + return true; + } + + sort(wordArray.begin(), wordArray.end()); + generic_string words(TEXT("")); + + for (size_t i = 0 ; i < wordArray.size() ; i++) + { + words += wordArray[i]; + if (i != wordArray.size()-1) + words += TEXT(" "); + } + + // UNICODE TO DO + _pEditView->execute(SCI_AUTOCSETSEPARATOR, WPARAM(' ')); + _pEditView->execute(SCI_AUTOCSETIGNORECASE, _ignoreCase); + _pEditView->showAutoComletion(curPos - startPos, words.c_str()); + + _activeCompletion = CompletionWord; + return true; +} + +bool AutoCompletion::showFunctionComplete() { + if (!_funcCompletionActive) + return false; + + if (_funcCalltip.updateCalltip(0, true)) { + _activeCompletion = CompletionFunc; + return true; + } + return false; +} + +void AutoCompletion::update(int character) +{ + const NppGUI & nppGUI = NppParameters::getInstance()->getNppGUI(); + if (!_funcCompletionActive && nppGUI._autocStatus == nppGUI.autoc_func) + return; + + if (nppGUI._funcParams || _funcCalltip.isVisible()) { + if (_funcCalltip.updateCalltip(character)) { //calltip visible because triggered by autocomplete, set mode + _activeCompletion = CompletionFunc; + return; //only return in case of success, else autocomplete + } + } + + if (!character) + return; + + //If autocomplete already active, let Scintilla handle it + if (_pEditView->execute(SCI_AUTOCACTIVE) != 0) + return; + + const int wordSize = 64; + TCHAR s[wordSize]; + _pEditView->getWordToCurrentPos(s, wordSize); + + if (lstrlen(s) >= int(nppGUI._autocFromLen)) + { + if (nppGUI._autocStatus == nppGUI.autoc_word) + showWordComplete(false); + else if (nppGUI._autocStatus == nppGUI.autoc_func) + showAutoComplete(); + } +} + +void AutoCompletion::callTipClick(int direction) { + if (!_funcCompletionActive) + return; + + if (direction == 1) { + _funcCalltip.showPrevOverload(); + } else if (direction == 2) { + _funcCalltip.showNextOverload(); + } +} + +bool AutoCompletion::setLanguage(LangType language) { + if (_curLang == language) + return true; + _curLang = language; + + TCHAR path[MAX_PATH]; + ::GetModuleFileName(NULL, path, MAX_PATH); + PathRemoveFileSpec(path); + lstrcat(path, TEXT("\\plugins\\APIs\\")); + lstrcat(path, getApiFileName()); + lstrcat(path, TEXT(".xml")); + + _XmlFile = TiXmlDocument(path); + _funcCompletionActive = _XmlFile.LoadFile(); + + TiXmlNode * pAutoNode = NULL; + if (_funcCompletionActive) { + _funcCompletionActive = false; //safety + TiXmlNode * pNode = _XmlFile.FirstChild(TEXT("NotepadPlus")); + if (!pNode) + return false; + pAutoNode = pNode = pNode->FirstChildElement(TEXT("AutoComplete")); + if (!pNode) + return false; + pNode = pNode->FirstChildElement(TEXT("KeyWord")); + if (!pNode) + return false; + _pXmlKeyword = reinterpret_cast(pNode); + if (!_pXmlKeyword) + return false; + _funcCompletionActive = true; + } + + if(_funcCompletionActive) { //try setting up environment + //setup defaults + _ignoreCase = true; + _funcCalltip._start = '('; + _funcCalltip._stop = ')'; + _funcCalltip._param = ','; + _funcCalltip._terminal = ';'; + _funcCalltip._ignoreCase = true; + + TiXmlElement * pElem = pAutoNode->FirstChildElement(TEXT("Environment")); + if (pElem) { + const TCHAR * val = 0; + val = pElem->Attribute(TEXT("ignoreCase")); + if (val && !lstrcmp(val, TEXT("no"))) { + _ignoreCase = false; + _funcCalltip._ignoreCase = false; + } + val = pElem->Attribute(TEXT("startFunc")); + if (val && val[0]) + _funcCalltip._start = val[0]; + val = pElem->Attribute(TEXT("stopFunc")); + if (val && val[0]) + _funcCalltip._stop = val[0]; + val = pElem->Attribute(TEXT("paramSeparator")); + if (val && val[0]) + _funcCalltip._param = val[0]; + val = pElem->Attribute(TEXT("terminal")); + if (val && val[0]) + _funcCalltip._terminal = val[0]; + } + } + + if (_funcCompletionActive) { + _funcCalltip.setLanguageXML(_pXmlKeyword); + } else { + _funcCalltip.setLanguageXML(NULL); + } + + _keyWords = TEXT(""); + if (_funcCompletionActive) { //Cache the keywords + //Iterate through all keywords + TiXmlElement *funcNode = _pXmlKeyword; + const TCHAR * name = NULL; + for (; funcNode; funcNode = funcNode->NextSiblingElement(TEXT("KeyWord")) ) { + name = funcNode->Attribute(TEXT("name")); + if (!name) //malformed node + continue; + _keyWords.append(name); + _keyWords.append(TEXT("\n")); + } + } + return _funcCompletionActive; +} + +const TCHAR * AutoCompletion::getApiFileName() { + if (_curLang == L_USER) + { + Buffer * currentBuf = _pEditView->getCurrentBuffer(); + if (currentBuf->isUserDefineLangExt()) + { + return currentBuf->getUserDefineLangName(); + } + } + + if (_curLang >= L_EXTERNAL && _curLang < NppParameters::getInstance()->L_END) + return NppParameters::getInstance()->getELCFromIndex(_curLang - L_EXTERNAL)._name; + + return ScintillaEditView::langNames[_curLang].lexerName; + +} diff --git a/PowerEditor/src/ScitillaComponent/AutoCompletion.h b/PowerEditor/src/ScitillaComponent/AutoCompletion.h new file mode 100644 index 00000000..86b32d6c --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/AutoCompletion.h @@ -0,0 +1,57 @@ +//this file is part of Notepad++ +//Copyright (C)2008 Harry Bruin +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef AUTOCOMPLETION_H +#define AUTOCOMPLETION_H + +#include "ScintillaEditView.h" +#include "FunctionCallTip.h" +#include "tinyxml.h" + +class AutoCompletion { +public: + enum ActiveCompletion {CompletionNone = 0, CompletionAuto, CompletionWord, CompletionFunc}; + AutoCompletion(ScintillaEditView * pEditView); + bool setLanguage(LangType language); + + //AutoComplete from the list + bool showAutoComplete(); + //WordCompletion from the current file + bool showWordComplete(bool autoInsert); //autoInsert true if completion should fill in the word on a single match + //Parameter display from the list + bool showFunctionComplete(); + + void update(int character); + void callTipClick(int direction); + +private: + bool _funcCompletionActive; + ScintillaEditView * _pEditView; + LangType _curLang; + TiXmlDocument _XmlFile; + TiXmlElement * _pXmlKeyword; + ActiveCompletion _activeCompletion; + + bool _ignoreCase; + + std::generic_string _keyWords; + + FunctionCallTip _funcCalltip; + const TCHAR * getApiFileName(); +}; + +#endif //AUTOCOMPLETION_H diff --git a/PowerEditor/src/ScitillaComponent/Buffer.cpp b/PowerEditor/src/ScitillaComponent/Buffer.cpp new file mode 100644 index 00000000..a83b4855 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/Buffer.cpp @@ -0,0 +1,723 @@ +#include "Buffer.h" + +#include +#include +#include +#include "Scintilla.h" +#include "Parameters.h" + + +#include "Notepad_plus.h" +#include "ScintillaEditView.h" + +FileManager * FileManager::_pSelf = new FileManager(); + +const int blockSize = 128 * 1024 + 4; + +// Ordre important!! Ne le changes pas! +//SC_EOL_CRLF (0), SC_EOL_CR (1), or SC_EOL_LF (2). + +const int CR = 0x0D; +const int LF = 0x0A; + +static bool isInList(const TCHAR *token, const TCHAR *list) { + if ((!token) || (!list)) + return false; + TCHAR word[64]; + int i = 0; + int j = 0; + for (; i <= int(lstrlen(list)) ; i++) + { + if ((list[i] == ' ')||(list[i] == '\0')) + { + if (j != 0) + { + word[j] = '\0'; + j = 0; + + if (!generic_stricmp(token, word)) + return true; + } + } + else + { + word[j] = list[i]; + j++; + } + } + return false; +}; + +void Buffer::determinateFormat(const char *data) { + _format = WIN_FORMAT; + size_t len = strlen(data); + for (size_t i = 0 ; i < len ; i++) + { + if (data[i] == CR) + { + if (data[i+1] == LF) + { + _format = WIN_FORMAT; + break; + } + else + { + _format = MAC_FORMAT; + break; + } + } + if (data[i] == LF) + { + _format = UNIX_FORMAT; + break; + } + } + + doNotify(BufferChangeFormat); + return; +}; + +long Buffer::_recentTagCtr = 0; + +void Buffer::updateTimeStamp() { + struct _stat buf; + time_t timeStamp = (generic_stat(_fullPathName, &buf)==0)?buf.st_mtime:0; + + 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) +{ + NppParameters *pNppParamInst = NppParameters::getInstance(); + if (!lstrcmpi(fn, _fullPathName)) { + updateTimeStamp(); + doNotify(BufferChangeTimestamp); + return; + } + lstrcpy(_fullPathName, fn); + _fileName = PathFindFileName(_fullPathName); + + // for _lang + LangType newLang = defaultLang; + TCHAR *ext = PathFindExtension(_fullPathName); + if (*ext == '.') { //extension found + ext += 1; + + // Define User Lang firstly + const TCHAR *langName = NULL; + if ((langName = pNppParamInst->getUserDefinedLangNameFromExt(ext))) + { + newLang = L_USER; + lstrcpy(_userLangExt, langName); + } + else // if it's not user lang, then check if it's supported lang + { + _userLangExt[0] = '\0'; + newLang = getLangFromExt(ext); + } + } + + if (newLang == defaultLang || newLang == L_TXT) //language can probably be refined + { + if ((!generic_stricmp(_fileName, TEXT("makefile"))) || (!generic_stricmp(_fileName, TEXT("GNUmakefile")))) + newLang = L_MAKEFILE; + else if (!generic_stricmp(_fileName, TEXT("CmakeLists.txt"))) + newLang = L_CMAKE; + else if ((!generic_stricmp(_fileName, TEXT("SConstruct"))) || (!generic_stricmp(_fileName, TEXT("SConscript")))) + newLang = L_PYTHON; + + } + + updateTimeStamp(); + if (newLang != _lang || _lang == L_USER) { + _lang = newLang; + doNotify(BufferChangeFilename | BufferChangeLanguage | BufferChangeTimestamp); + return; + } + + 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; + + if (_currentStatus == DOC_UNNAMED) //unsaved document cannot change by environment + return false; + + if (_currentStatus != DOC_DELETED && !PathFileExists(_fullPathName)) //document has been deleted + { + _currentStatus = DOC_DELETED; + _isFileReadOnly = false; + _isDirty = true; //dirty sicne no match with filesystem + _timeStamp = 0; + doNotify(BufferChangeStatus | BufferChangeReadonly | BufferChangeTimestamp); + return true; + } + + if (_currentStatus == DOC_DELETED && PathFileExists(_fullPathName)) + { //document has returned from its grave + + if (!generic_stat(_fullPathName, &buf)) + { + _isFileReadOnly = (bool)(!(buf.st_mode & _S_IWRITE)); + + _currentStatus = DOC_MODIFIED; + _timeStamp = buf.st_mtime; + doNotify(BufferChangeStatus | BufferChangeReadonly | BufferChangeTimestamp); + return true; + } + } + + if (!generic_stat(_fullPathName, &buf)) + { + int mask = 0; //status always 'changes', even if from modified to modified + bool isFileReadOnly = (bool)(!(buf.st_mode & _S_IWRITE)); + if (isFileReadOnly != _isFileReadOnly) { + _isFileReadOnly = isFileReadOnly; + mask |= BufferChangeReadonly; + } + + if (_timeStamp != buf.st_mtime) { + _timeStamp = buf.st_mtime; + mask |= BufferChangeTimestamp; + _currentStatus = DOC_MODIFIED; + mask |= BufferChangeStatus; //status always 'changes', even if from modified to modified + } + + if (mask != 0) { + doNotify(mask); + return true; + } + + return false; + } + + return false; +} + +void Buffer::setPosition(const Position & pos, ScintillaEditView * identifier) { + int index = indexOfReference(identifier); + if (index == -1) + return; + _positions[index] = pos; +} + +Position & Buffer::getPosition(ScintillaEditView * identifier) { + int index = indexOfReference(identifier); + return _positions.at(index); +} + +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++) { + local.push_back(folds[i]); + } +} + +std::vector & Buffer::getHeaderLineState(ScintillaEditView * identifier) { + int index = indexOfReference(identifier); + return _foldStates.at(index); +} + +LangType Buffer::getLangFromExt(const TCHAR *ext) +{ + NppParameters *pNppParam = NppParameters::getInstance(); + int i = pNppParam->getNbLang(); + i--; + while (i >= 0) + { + Lang *l = pNppParam->getLangFromIndex(i--); + + const TCHAR *defList = l->getDefaultExtList(); + const TCHAR *userList = NULL; + + LexerStylerArray &lsa = pNppParam->getLStylerArray(); + const TCHAR *lName = l->getLangName(); + LexerStyler *pLS = lsa.getLexerStylerByName(lName); + + if (pLS) + userList = pLS->getLexerUserExt(); + + std::generic_string list(TEXT("")); + if (defList) + list += defList; + if (userList) + { + list += TEXT(" "); + list += userList; + } + if (isInList(ext, list.c_str())) + return l->getLangID(); + } + return L_TXT; +} + +Lang * Buffer::getCurrentLang() const { + NppParameters *pNppParam = NppParameters::getInstance(); + int i = 0; + Lang *l = pNppParam->getLangFromIndex(i++); + while (l) + { + if (l->_langID == _lang) + return l; + + l = pNppParam->getLangFromIndex(i++); + } + return NULL; +}; + +int Buffer::indexOfReference(ScintillaEditView * identifier) const { + int size = (int)_referees.size(); + for(int i = 0; i < size; i++) { + if (_referees[i] == identifier) + return i; + } + return -1; //not found +} + +int Buffer::addReference(ScintillaEditView * identifier) { + if (indexOfReference(identifier) != -1) + return _references; + _referees.push_back(identifier); + _positions.push_back(Position()); + _foldStates.push_back(std::vector()); + _references++; + return _references; +} + +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); + _references--; + 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 + //Then all docs to remove markers. + 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 + _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 +{ + for (size_t i = 0 ; i < _linesUndoState.size() ; i++) + { + if (_linesUndoState[i].first == currentLine) + return _linesUndoState[i].second; + } + return pair(0, false); +} + +void Buffer::setLineUndoState(size_t currentLine, size_t undoLevel, bool isSaved) +{ + bool found = false; + for (size_t i = 0 ; i < _linesUndoState.size() ; i++) + { + if (_linesUndoState[i].first == currentLine) + { + _linesUndoState[i].second.first = undoLevel; + _linesUndoState[i].second.second = isSaved; + } + } + if (!found) + { + _linesUndoState.push_back(pair >(currentLine, pair(undoLevel, false))); + } +} +*/ + +//filemanager + + +void FileManager::init(Notepad_plus * pNotepadPlus, ScintillaEditView * pscratchTilla) +{ + _pNotepadPlus = pNotepadPlus; + _pscratchTilla = pscratchTilla; + _pscratchTilla->execute(SCI_SETUNDOCOLLECTION, false); //dont store any undo information + _scratchDocDefault = (Document)_pscratchTilla->execute(SCI_GETDOCPOINTER); + _pscratchTilla->execute(SCI_ADDREFDOCUMENT, 0, _scratchDocDefault); +} + +void FileManager::checkFilesystemChanges() { + for(size_t i = 0; i < _nrBufs; i++) { + if (_buffers[i]->checkFileState()){} //something has changed. Triggers update automatically + } +} + +int FileManager::getBufferIndexByID(BufferID id) { + for(size_t i = 0; i < _nrBufs; i++) { + if (_buffers[i]->_id == id) + return (int)i; + } + return -1; +} + +Buffer * FileManager::getBufferByIndex(int index) { + return _buffers.at(index); +} + +void FileManager::beNotifiedOfBufferChange(Buffer * theBuf, int mask) { + _pNotepadPlus->notifyBufferChanged(theBuf, mask); +}; + +void FileManager::addBufferReference(BufferID buffer, ScintillaEditView * identifier) { + Buffer * buf = getBufferByID(buffer); + buf->addReference(identifier); +} + +void FileManager::closeBuffer(BufferID id, ScintillaEditView * identifier) { + int index = getBufferIndexByID(id); + Buffer * buf = getBufferByIndex(index); + + int oldRefs = buf->_references; + int refs = buf->removeReference(identifier); + + 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; + _nrBufs--; + } +} + +BufferID FileManager::loadFile(const TCHAR * filename, Document doc) { + bool ownDoc = false; + if (doc == NULL) + { + doc = (Document)_pscratchTilla->execute(SCI_CREATEDOCUMENT); + ownDoc = true; + } + + TCHAR fullpath[MAX_PATH]; + ::GetFullPathName(filename, MAX_PATH, fullpath, NULL); + ::GetLongPathName(fullpath, fullpath, MAX_PATH); + Utf8_16_Read UnicodeConvertor; //declare here so we can get information after loading is done + bool res = loadFileData(doc, fullpath, &UnicodeConvertor, L_TXT); + if (res) + { + Buffer * newBuf = new Buffer(this, _nextBufferID, doc, DOC_REGULAR, fullpath); + BufferID id = (BufferID) newBuf; + newBuf->_id = id; + _buffers.push_back(newBuf); + _nrBufs++; + Buffer * buf = _buffers.at(_nrBufs - 1); + + // 3 formats : WIN_FORMAT, UNIX_FORMAT and MAC_FORMAT + if (UnicodeConvertor.getNewBuf()) + { + buf->determinateFormat(UnicodeConvertor.getNewBuf()); + } + else + { + buf->determinateFormat(""); + } + + UniMode encoding = UnicodeConvertor.getEncoding(); + if (encoding == uni7Bit) + { + NppParameters *pNppParamInst = NppParameters::getInstance(); + const NewDocDefaultSettings & ndds = (pNppParamInst->getNppGUI()).getNewDocDefaultSettings(); + if (ndds._openAnsiAsUtf8) + { + encoding = uniCookie; + } + else + { + encoding = uni8Bit; + } + } + buf->setUnicodeMode(encoding); + + //determine buffer properties + BufferID retval = _nextBufferID++; + 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); + Document doc = buf->getDocument(); + Utf8_16_Read UnicodeConvertor; + buf->_canNotify = false; //disable notify during file load, we dont want dirty to be triggered + bool res = loadFileData(doc, buf->getFullPathName(), &UnicodeConvertor, buf->getLangType()); + buf->_canNotify = true; + if (res) { + if (UnicodeConvertor.getNewBuf()) { + buf->determinateFormat(UnicodeConvertor.getNewBuf()); + } else { + buf->determinateFormat(""); + } + buf->setUnicodeMode(UnicodeConvertor.getEncoding()); + // buf->setNeedsLexing(true); + } + return res; +} + +bool FileManager::reloadBufferDeferred(BufferID id) { + Buffer * buf = getBufferByID(id); + buf->setDeferredReload(); + return true; +} + +bool FileManager::deleteFile(BufferID id) +{ + Buffer * buf = getBufferByID(id); + const TCHAR *fileNamePath = buf->getFullPathName(); + if (!PathFileExists(fileNamePath)) + return false; + return ::DeleteFile(fileNamePath) != 0; +} + +bool FileManager::moveFile(BufferID id, const TCHAR * newFileName) +{ + Buffer * buf = getBufferByID(id); + const TCHAR *fileNamePath = buf->getFullPathName(); + if (!PathFileExists(fileNamePath)) + return false; + + if (::MoveFile(fileNamePath, newFileName) == 0) + return false; + + buf->setFileName(newFileName); + return true; +} + +bool FileManager::saveBuffer(BufferID id, const TCHAR * filename, bool isCopy) { + Buffer * buffer = getBufferByID(id); + bool isHidden = false; + bool isSys = false; + DWORD attrib; + + TCHAR fullpath[MAX_PATH]; + ::GetFullPathName(filename, MAX_PATH, fullpath, NULL); + ::GetLongPathName(fullpath, fullpath, MAX_PATH); + if (PathFileExists(fullpath)) + { + attrib = ::GetFileAttributes(fullpath); + + if (attrib != INVALID_FILE_ATTRIBUTES) + { + isHidden = (attrib & FILE_ATTRIBUTE_HIDDEN) != 0; + if (isHidden) + ::SetFileAttributes(filename, attrib & ~FILE_ATTRIBUTE_HIDDEN); + + isSys = (attrib & FILE_ATTRIBUTE_SYSTEM) != 0; + if (isSys) + ::SetFileAttributes(filename, attrib & ~FILE_ATTRIBUTE_SYSTEM); + } + } + + UniMode mode = buffer->getUnicodeMode(); + if (mode == uniCookie) + mode = uni8Bit; //set the mode to ANSI to prevent converter from adding BOM and performing conversions, Scintilla's data can be copied directly + + Utf8_16_Write UnicodeConvertor; + UnicodeConvertor.setEncoding(mode); + + FILE *fp = UnicodeConvertor.fopen(fullpath, TEXT("wb")); + if (fp) + { + _pscratchTilla->execute(SCI_SETDOCPOINTER, 0, buffer->_doc); //generate new document + + char data[blockSize + 1]; + int lengthDoc = _pscratchTilla->getCurrentDocLen(); + for (int i = 0; i < lengthDoc; i += blockSize) + { + int grabSize = lengthDoc - i; + if (grabSize > blockSize) + grabSize = blockSize; + + _pscratchTilla->getText(data, i, i + grabSize); + UnicodeConvertor.fwrite(data, grabSize); + } + UnicodeConvertor.fclose(); + + if (isHidden) + ::SetFileAttributes(fullpath, attrib | FILE_ATTRIBUTE_HIDDEN); + + if (isSys) + ::SetFileAttributes(fullpath, attrib | FILE_ATTRIBUTE_SYSTEM); + + if (isCopy) { + _pscratchTilla->execute(SCI_SETDOCPOINTER, 0, _scratchDocDefault); + return true; //all done + } + + buffer->setFileName(fullpath); + buffer->setDirty(false); + buffer->setStatus(DOC_REGULAR); + buffer->checkFileState(); + _pscratchTilla->execute(SCI_SETSAVEPOINT); + //_pscratchTilla->markSavedLines(); + _pscratchTilla->execute(SCI_SETDOCPOINTER, 0, _scratchDocDefault); + + return true; + } + return false; +} + +BufferID FileManager::newEmptyDocument() +{ + TCHAR newTitle[10]; + lstrcpy(newTitle, UNTITLED_STR); + wsprintf(newTitle+4, TEXT("%d"), _nextNewNumber); + _nextNewNumber++; + Document doc = (Document)_pscratchTilla->execute(SCI_CREATEDOCUMENT); //this already sets a reference for filemanager + Buffer * newBuf = new Buffer(this, _nextBufferID, doc, DOC_UNNAMED, newTitle); + BufferID id = (BufferID)newBuf; + newBuf->_id = id; + _buffers.push_back(newBuf); + _nrBufs++; + BufferID retval = _nextBufferID++; + return id; +} + +BufferID FileManager::bufferFromDocument(Document doc, bool dontIncrease, bool dontRef) +{ + TCHAR newTitle[10]; + lstrcpy(newTitle, UNTITLED_STR); + wsprintf(newTitle+4, TEXT("%d"), _nextNewNumber); + if (!dontRef) + _pscratchTilla->execute(SCI_ADDREFDOCUMENT, 0, doc); //set reference for FileManager + Buffer * newBuf = new Buffer(this, _nextBufferID, doc, DOC_UNNAMED, newTitle); + BufferID id = (BufferID)newBuf; + newBuf->_id = id; + _buffers.push_back(newBuf); + _nrBufs++; + BufferID retval = _nextBufferID; + if (!dontIncrease) + _nextBufferID++; + return id; +} + +bool FileManager::loadFileData(Document doc, const TCHAR * filename, Utf8_16_Read * UnicodeConvertor, LangType language) +{ + const int blockSize = 128 * 1024; //128 kB + char data[blockSize]; + FILE *fp = generic_fopen(filename, TEXT("rb")); + if (!fp) + return false; + + //Setup scratchtilla for new filedata + _pscratchTilla->execute(SCI_SETDOCPOINTER, 0, doc); + bool ro = _pscratchTilla->execute(SCI_GETREADONLY) != 0; + if (ro) { + _pscratchTilla->execute(SCI_SETREADONLY, false); + } + _pscratchTilla->execute(SCI_CLEARALL); + if (language < L_EXTERNAL) { + _pscratchTilla->execute(SCI_SETLEXER, ScintillaEditView::langNames[language].lexerID); + } else { + int id = language - L_EXTERNAL; + TCHAR * name = NppParameters::getInstance()->getELCFromIndex(id)._name; +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + const char *pName = wmc->wchar2char(name, CP_ACP); +#else + const char *pName = name; +#endif + _pscratchTilla->execute(SCI_SETLEXERLANGUAGE, 0, (LPARAM)pName); + } + + bool success = true; + __try { + size_t lenFile = 0; + size_t lenConvert = 0; //just in case conversion results in 0, but file not empty + do { + lenFile = fread(data, 1, blockSize, fp); + lenConvert = UnicodeConvertor->convert(data, lenFile); + _pscratchTilla->execute(SCI_APPENDTEXT, lenConvert, (LPARAM)(UnicodeConvertor->getNewBuf())); + } while (lenFile > 0); + } __except(filter(GetExceptionCode(), GetExceptionInformation())) { + printStr(TEXT("File is too big to be opened by Notepad++")); + success = false; + } + + fclose(fp); + + _pscratchTilla->execute(SCI_EMPTYUNDOBUFFER); + _pscratchTilla->execute(SCI_SETSAVEPOINT); + if (ro) { + _pscratchTilla->execute(SCI_SETREADONLY, true); + } + _pscratchTilla->execute(SCI_SETDOCPOINTER, 0, _scratchDocDefault); + return success; +} + +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())) + return _buffers.at(i)->getID(); + } + return BUFFER_INVALID; +} + +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) { + FILE * file = generic_fopen(path, TEXT("wb")); + if (!file) + return false; + fclose(file); + return true; +} + +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); + int docLen = _pscratchTilla->getCurrentDocLen(); + _pscratchTilla->execute(SCI_SETDOCPOINTER, 0, _scratchDocDefault); + return docLen; +} diff --git a/PowerEditor/src/ScitillaComponent/Buffer.h b/PowerEditor/src/ScitillaComponent/Buffer.h new file mode 100644 index 00000000..8a19a355 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/Buffer.h @@ -0,0 +1,386 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO < donho@altern.org > +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef BUFFER_H +#define BUFFER_H + +#include "Utf8_16.h" + +class Buffer; +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, //doesnt 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 +}; + +struct HeaderLineState { + HeaderLineState() : _headerLineNumber(0), _isExpanded(true){}; + HeaderLineState(int lineNumber, bool isExpanded) : _headerLineNumber(lineNumber), _isExpanded(isExpanded){}; + int _headerLineNumber; + bool _isExpanded; +}; + +const int userLangNameMax = 16; +const TCHAR UNTITLED_STR[] = TEXT("new "); + +//File manager class maintains all buffers +class Buffer; +class FileManager { +public: + void init(Notepad_plus * pNotepadPlus, ScintillaEditView * pscratchTilla); + + //void activateBuffer(int index); + void checkFilesystemChanges(); + + int getNrBuffers() { return _nrBufs; }; + int getBufferIndexByID(BufferID id); + Buffer * getBufferByIndex(int index); //generates exception if index is invalid + Buffer * getBufferByID(BufferID id) {return (Buffer*)id;} + + void beNotifiedOfBufferChange(Buffer * theBuf, int mask); + + void closeBuffer(BufferID, ScintillaEditView * identifer); //called by Notepad++ + + void addBufferReference(BufferID id, ScintillaEditView * identifer); //called by Scintilla etc indirectly + + BufferID loadFile(const TCHAR * filename, Document doc = NULL); //ID == BUFFER_INVALID on failure. If Doc == NULL, a new file is created, otherwise data is loaded in given document + BufferID newEmptyDocument(); + //create Buffer from existing Scintilla, used from new Scintillas. If dontIncrease = true, then the new document number isnt increased afterwards. + //usefull for temporary but neccesary docs + //If dontRef = false, then no extra reference is added for the doc. Its the responsibility of the caller to do so + BufferID bufferFromDocument(Document doc, bool dontIncrease = false, bool dontRef = false); + + BufferID getBufferFromName(const TCHAR * name); + BufferID getBufferFromDocument(Document doc); + + bool reloadBuffer(BufferID id); + bool reloadBufferDeferred(BufferID id); + bool saveBuffer(BufferID id, const TCHAR * filename, bool isCopy = false); + bool deleteFile(BufferID id); + bool moveFile(BufferID id, const TCHAR * newFilename); + + bool createEmptyFile(const TCHAR * path); + + static FileManager * getInstance() {return _pSelf;}; + void destroyInstance() { delete _pSelf; }; + + void increaseDocNr() {_nextNewNumber++;}; + + int getFileNameFromBuffer(BufferID id, TCHAR * fn2copy); + + int docLength(Buffer * buffer) const; + +private: + FileManager() : _nextNewNumber(1), _nextBufferID(0), _pNotepadPlus(NULL), _nrBufs(0), _pscratchTilla(NULL){}; + ~FileManager(){}; + static FileManager *_pSelf; + + Notepad_plus * _pNotepadPlus; + ScintillaEditView * _pscratchTilla; + Document _scratchDocDefault; + + int _nextNewNumber; + + std::vector _buffers; + BufferID _nextBufferID; + size_t _nrBufs; + + bool loadFileData(Document doc, const TCHAR * filename, Utf8_16_Read * UnicodeConvertor, LangType language); +}; + +#define MainFileManager FileManager::getInstance() + +class Buffer +{ +friend class FileManager; +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 + //Load the document into Scintilla/add to TabBar + //The entire lifetime if the buffer, the Document has reference count of _atleast_ one + //Destructor makes sure its purged + 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) + { + NppParameters *pNppParamInst = NppParameters::getInstance(); + const NewDocDefaultSettings & ndds = (pNppParamInst->getNppGUI()).getNewDocDefaultSettings(); + _format = ndds._format; + _unicodeMode = ndds._encoding; + + _userLangExt[0] = 0; + _fullPathName[0] = 0; + _fileName = NULL; + setFileName(fileName, ndds._lang); + updateTimeStamp(); + checkFileState(); + _currentStatus = type; + _isDirty = false; + + _needLexer = false; //new buffers do not need lexing, Scintilla takes care of that + _canNotify = true; + }; + + LangType getLangFromExt(const TCHAR *ext); + + // this method 1. copies the file name + // 2. determinates the language from the ext of file name + // 3. gets the last modified time + void setFileName(const TCHAR *fn, LangType defaultLang = L_TXT); + + const TCHAR * getFullPathName() const { + return _fullPathName; + }; + + const TCHAR * getFileName() const { return _fileName; }; + + BufferID getID() const { + return _id; + }; + + void increaseRecentTag() { + _recentTag = ++_recentTagCtr; + doNotify(BufferChangeRecentTag); + }; + + long getRecentTag() const { + return _recentTag; + }; + + bool checkFileState(); + + bool isDirty() const { + return _isDirty; + }; + + bool isReadOnly() const { + return (_isUserReadOnly || _isFileReadOnly); + }; + + 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("")) { + if (lang == _lang && lang != L_USER) + return; + _lang = lang; + if (_lang == L_USER) { + lstrcpy(_userLangExt, userLangName); + } + _needLexer = true; //change of lang means lexern eeds updating + doNotify(BufferChangeLanguage|BufferChangeLexing); + }; + + UniMode getUnicodeMode() const { + return _unicodeMode; + }; + + void setUnicodeMode(UniMode mode) { + _unicodeMode = mode; + //_isDirty = true; //set to dirty if change unicode mode + doNotify(BufferChangeUnicode | BufferChangeDirty); + }; + DocFileStatus getStatus() const { + return _currentStatus; + }; + + Document getDocument() { + return _doc; + }; + + void setDirty(bool dirty) { + _isDirty = dirty; + doNotify(BufferChangeDirty); + }; + + void setPosition(const Position & pos, ScintillaEditView * identifier); + Position & getPosition(ScintillaEditView * identifier); + + void setHeaderLineState(const std::vector & folds, ScintillaEditView * identifier); + std::vector & getHeaderLineState(ScintillaEditView * identifier); + + void determinateFormat(const char *data); + + bool isUserDefineLangExt() const { + return (_userLangExt[0] != '\0'); + }; + + const TCHAR * getUserDefineLangName() const { + return _userLangExt; + }; + + const TCHAR * getCommentLineSymbol() const { + Lang *l = getCurrentLang(); + if (!l) + return NULL; + return l->_pCommentLineSymbol; + + }; + + const TCHAR * getCommentStart() const { + Lang *l = getCurrentLang(); + if (!l) + return NULL; + return l->_pCommentStart; + }; + + const TCHAR * getCommentEnd() const { + Lang *l = getCurrentLang(); + if (!l) + return NULL; + return l->_pCommentEnd; + }; + + bool getNeedsLexing() const { + return _needLexer; + }; + + 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 + int removeReference(ScintillaEditView * identifier); //reduces reference. If zero, Document is purged + + void setHideLineChanged(bool isHide, int location); + + void setDeferredReload(); + + bool getNeedReload() { + return _needReloading; + } + + void setNeedReload(bool reload) { + _needReloading = reload; + } + + /* + pair getLineUndoState(size_t currentLine) const; + void setLineUndoState(size_t currentLine, size_t undoLevel, bool isSaved = false); + */ + + int docLength() const { + return _pManager->docLength(_id); + }; + +private : + FileManager * _pManager; + bool _canNotify; + int _references; //if no references file inaccessible, can be closed + BufferID _id; + + //document properties + Document _doc; //invariable + LangType _lang; + TCHAR _userLangExt[userLangNameMax]; // it's useful if only (_lang == L_USER) + bool _isDirty; + formatType _format; + UniMode _unicodeMode; + bool _isUserReadOnly; + 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 + vector< ScintillaEditView * > _referees; + vector< Position > _positions; + vector< vector > _foldStates; + + //vector< pair > > _linesUndoState; + + //Environment properties + DocFileStatus _currentStatus; + time_t _timeStamp; // 0 if it's a new doc + bool _isFileReadOnly; + TCHAR _fullPathName[MAX_PATH]; + TCHAR * _fileName; //points to filename part in _fullPathName + bool _needReloading; //True if Buffer needs to be reloaded on activation + + long _recentTag; + static long _recentTagCtr; + + void updateTimeStamp(); + Lang * getCurrentLang() const; + + int indexOfReference(ScintillaEditView * identifier) const; + + void setStatus(DocFileStatus status) { + _currentStatus = status; + doNotify(BufferChangeStatus); + } + + void doNotify(int mask) { + if (_canNotify) + _pManager->beNotifiedOfBufferChange(this, mask); + }; +}; + +#endif //BUFFER_H diff --git a/PowerEditor/src/ScitillaComponent/DocTabView.cpp b/PowerEditor/src/ScitillaComponent/DocTabView.cpp new file mode 100644 index 00000000..c97cca42 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/DocTabView.cpp @@ -0,0 +1,146 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "DocTabView.h" + +#ifndef _WIN32_IE +#define _WIN32_IE 0x0600 +#endif //_WIN32_IE + +#include +#include + +bool DocTabView::_hideTabBarStatus = false; + +void DocTabView::addBuffer(BufferID buffer) { + if (buffer == BUFFER_INVALID) //valid only + return; + if (this->getIndexByBuffer(buffer) != -1) //no duplicates + return; + Buffer * buf = MainFileManager->getBufferByID(buffer); + TCITEM tie; + tie.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM; + + int index = -1; + if (_hasImgLst) + index = 0; + tie.iImage = index; + tie.pszText = (TCHAR *)buf->getFileName(); + tie.lParam = (LPARAM)buffer; + ::SendMessage(_hSelf, TCM_INSERTITEM, _nbItem++, reinterpret_cast(&tie)); + bufferUpdated(buf, BufferChangeMask); + + ::SendMessage(_hParent, WM_SIZE, 0, 0); +} + +void DocTabView::closeBuffer(BufferID buffer) { + int indexToClose = getIndexByBuffer(buffer); + deletItemAt(indexToClose); + + ::SendMessage(_hParent, WM_SIZE, 0, 0); +} + +bool DocTabView::activateBuffer(BufferID buffer) { + int indexToActivate = getIndexByBuffer(buffer); + if (indexToActivate == -1) + return false; //cannot activate + activateAt(indexToActivate); + return true; +} + +BufferID DocTabView::activeBuffer() { + int index = getCurrentTabIndex(); + return (BufferID)getBufferByIndex(index); +} + +BufferID DocTabView::findBufferByName(const TCHAR * fullfilename) { //-1 if not found, something else otherwise + TCITEM tie; + tie.lParam = -1; + tie.mask = TCIF_PARAM; + for(size_t i = 0; i < _nbItem; i++) { + ::SendMessage(_hSelf, TCM_GETITEM, i, reinterpret_cast(&tie)); + BufferID id = (BufferID)tie.lParam; + Buffer * buf = MainFileManager->getBufferByID(id); + if (!lstrcmp(fullfilename, buf->getFullPathName())) { + return id; + } + } + return BUFFER_INVALID; +} + +int DocTabView::getIndexByBuffer(BufferID id) { + TCITEM tie; + tie.lParam = -1; + tie.mask = TCIF_PARAM; + for(int i = 0; i < (int)_nbItem; i++) { + ::SendMessage(_hSelf, TCM_GETITEM, i, reinterpret_cast(&tie)); + if ((BufferID)tie.lParam == id) + return i; + } + return -1; +} + +BufferID DocTabView::getBufferByIndex(int index) { + TCITEM tie; + tie.lParam = -1; + tie.mask = TCIF_PARAM; + ::SendMessage(_hSelf, TCM_GETITEM, index, reinterpret_cast(&tie)); + + return (BufferID)tie.lParam; +} + +void DocTabView::bufferUpdated(Buffer * buffer, int mask) { + int index = getIndexByBuffer(buffer->getID()); + if (index == -1) + return; + + TCITEM tie; + tie.lParam = -1; + tie.mask = 0; + + + if (mask & BufferChangeReadonly || mask & BufferChangeDirty) { + tie.mask |= TCIF_IMAGE; + tie.iImage = buffer->isDirty()?UNSAVED_IMG_INDEX:SAVED_IMG_INDEX; + if (buffer->isReadOnly()) { + tie.iImage = REDONLY_IMG_INDEX; + } + } + + if (mask & BufferChangeFilename) { + tie.mask |= TCIF_TEXT; + tie.pszText = (TCHAR *)buffer->getFileName(); + } + + ::SendMessage(_hSelf, TCM_SETITEM, index, reinterpret_cast(&tie)); + + ::SendMessage(_hParent, WM_SIZE, 0, 0); +} + +void DocTabView::setBuffer(int index, BufferID id) { + if (index < 0 || index >= (int)_nbItem) + return; + + TCITEM tie; + tie.lParam = (LPARAM)id; + tie.mask = TCIF_PARAM; + ::SendMessage(_hSelf, TCM_SETITEM, index, reinterpret_cast(&tie)); + + bufferUpdated(MainFileManager->getBufferByID(id), BufferChangeMask); //update tab, everything has changed + + ::SendMessage(_hParent, WM_SIZE, 0, 0); +} diff --git a/PowerEditor/src/ScitillaComponent/DocTabView.h b/PowerEditor/src/ScitillaComponent/DocTabView.h new file mode 100644 index 00000000..3f04836c --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/DocTabView.h @@ -0,0 +1,92 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef DOCTABVIEW_H +#define DOCTABVIEW_H + +#include "TabBar.h" +#include "ScintillaEditView.h" +#include "ImageListSet.h" + +const int SAVED_IMG_INDEX = 0; +const int UNSAVED_IMG_INDEX = 1; +const int REDONLY_IMG_INDEX = 2; + +class DocTabView : public TabBarPlus +{ +public : + DocTabView():TabBarPlus(), _pView(NULL) {}; + virtual ~DocTabView(){}; + + virtual void destroy() { + TabBarPlus::destroy(); + }; + + void init(HINSTANCE hInst, HWND parent, ScintillaEditView * pView, IconList *pIconList = NULL) + { + TabBarPlus::init(hInst, parent); + _pView = pView; + if (pIconList) + TabBar::setImageList(pIconList->getHandle()); + return; + }; + + void addBuffer(BufferID buffer); + void closeBuffer(BufferID buffer); + void bufferUpdated(Buffer * buffer, int mask); + + bool activateBuffer(BufferID buffer); + + BufferID activeBuffer(); + BufferID findBufferByName(const TCHAR * fullfilename); //-1 if not found, something else otherwise + + int getIndexByBuffer(BufferID id); + BufferID getBufferByIndex(int index); + + void setBuffer(int index, BufferID id); + + static bool setHideTabBarStatus(bool hideOrNot) { + bool temp = _hideTabBarStatus; + _hideTabBarStatus = hideOrNot; + return temp; + }; + + static bool getHideTabBarStatus() { + return _hideTabBarStatus; + }; + + virtual void reSizeTo(RECT & rc) { + if (_hideTabBarStatus) + { + RECT rcTmp = rc; + + TabBar::reSizeTo(rcTmp); + _pView->reSizeTo(rc); + } + else + { + TabBar::reSizeTo(rc); + _pView->reSizeTo(rc); + } + }; + +private : + ScintillaEditView *_pView; + static bool _hideTabBarStatus; +}; + +#endif //DOCTABVIEW_H diff --git a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp new file mode 100644 index 00000000..e6a710d1 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.cpp @@ -0,0 +1,1975 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "FindReplaceDlg.h" +#include "ScintillaEditView.h" +#include "Notepad_plus_msgs.h" +//#include "constant.h" +#include "UniConversion.h" + +int Searching::convertExtendedToString(const TCHAR * query, TCHAR * result, int length) { //query may equal to result, since it always gets smaller + int i = 0, j = 0; + int charLeft = length; + bool isGood = true; + TCHAR current; + while(i < length) { //because the backslash escape quences always reduce the size of the generic_string, no overflow checks have to be made for target, assuming parameters are correct + current = query[i]; + charLeft--; + if (current == '\\' && charLeft) { //possible escape sequence + i++; + charLeft--; + current = query[i]; + switch(current) { + case 'r': + result[j] = '\r'; + break; + case 'n': + result[j] = '\n'; + break; + case '0': + result[j] = '\0'; + break; + case 't': + result[j] = '\t'; + break; + case '\\': + result[j] = '\\'; + break; + case 'b': + case 'd': + case 'o': + case 'x': { + int size = 0, base = 0; + if (current == 'b') { //11111111 + size = 8, base = 2; + } else if (current == 'o') { //377 + size = 3, base = 8; + } else if (current == 'd') { //255 + size = 3, base = 10; + } else if (current == 'x') { //0xFF + size = 2, base = 16; + } + if (charLeft >= size) { + int res = 0; + if (Searching::readBase(query+(i+1), &res, base, size)) { + result[j] = (TCHAR)res; + i+=size; + break; + } + } + //not enough chars to make parameter, use default method as fallback + } + default: { //unknown sequence, treat as regular text + result[j] = '\\'; + j++; + result[j] = current; + isGood = false; + break; + } + } + } else { + result[j] = query[i]; + } + i++; + j++; + } + result[j] = 0; + return j; +} + +bool Searching::readBase(const TCHAR * str, int * value, int base, int size) { + int i = 0, temp = 0; + *value = 0; + TCHAR max = '0' + base - 1; + TCHAR current; + while(i < size) { + current = str[i]; + if (current >= '0' && current <= max) { + temp *= base; + temp += (current - '0'); + } else { + return false; + } + i++; + } + *value = temp; + return true; +} + +void Searching::displaySectionCentered(int posStart, int posEnd, ScintillaEditView * pEditView, bool isDownwards) +{ + // to make sure the found result is visible + //When searching up, the beginning of the (possible multiline) result is important, when scrolling down the end + int testPos = (isDownwards)?posEnd:posStart; + pEditView->execute(SCI_SETCURRENTPOS, testPos); + int currentlineNumberDoc = (int)pEditView->execute(SCI_LINEFROMPOSITION, testPos); + int currentlineNumberVis = (int)pEditView->execute(SCI_VISIBLEFROMDOCLINE, currentlineNumberDoc); + pEditView->execute(SCI_ENSUREVISIBLE, currentlineNumberDoc); // make sure target line is unfolded + + int firstVisibleLineVis = (int)pEditView->execute(SCI_GETFIRSTVISIBLELINE); + int linesVisible = (int)pEditView->execute(SCI_LINESONSCREEN) - 1; //-1 for the scrollbar + int lastVisibleLineVis = (int)linesVisible + firstVisibleLineVis; + + //if out of view vertically, scroll line into (center of) view + int linesToScroll = 0; + if (currentlineNumberVis < firstVisibleLineVis) + { + linesToScroll = currentlineNumberVis - firstVisibleLineVis; + //use center + linesToScroll -= linesVisible/2; + } + else if (currentlineNumberVis > lastVisibleLineVis) + { + linesToScroll = currentlineNumberVis - lastVisibleLineVis; + //use center + linesToScroll += linesVisible/2; + } + pEditView->scroll(0, linesToScroll); + + //Make sure the caret is visible, scroll horizontally (this will also fix wrapping problems) + pEditView->execute(SCI_GOTOPOS, posStart); + pEditView->execute(SCI_GOTOPOS, posEnd); + + pEditView->execute(SCI_SETANCHOR, posStart); +} + +LONG FindReplaceDlg::originalFinderProc = NULL; + +void FindReplaceDlg::addText2Combo(const TCHAR * txt2add, HWND hCombo, bool isUTF8) +{ + if (!hCombo) return; + if (!lstrcmp(txt2add, TEXT(""))) return; + + int i = 0; + +#ifdef UNICODE + i = ::SendMessage(hCombo, CB_FINDSTRINGEXACT, -1, (LPARAM)txt2add); + if (i != CB_ERR) // found + { + ::SendMessage(hCombo, CB_DELETESTRING, i, 0); + } + + i = ::SendMessage(hCombo, CB_INSERTSTRING, 0, (LPARAM)txt2add); + +#else + TCHAR text[FINDREPLACE_MAXLENGTH]; + bool isWin9x = _winVer <= WV_ME; + wchar_t wchars2Add[FINDREPLACE_MAXLENGTH]; + wchar_t textW[FINDREPLACE_MAXLENGTH]; + int count = ::SendMessage(hCombo, CB_GETCOUNT, 0, 0); + + if (isUTF8) + ::MultiByteToWideChar(CP_UTF8, 0, txt2add, -1, wchars2Add, FINDREPLACE_MAXLENGTH - 1); + + for ( ; i < count ; i++) + { + if (isUTF8) + { + if (!isWin9x) + ::SendMessageW(hCombo, CB_GETLBTEXT, i, (LPARAM)textW); + + else + { + ::SendMessageA(hCombo, CB_GETLBTEXT, i, (LPARAM)text); + ::MultiByteToWideChar(CP_ACP, 0, text, -1, textW, FINDREPLACE_MAXLENGTH - 1); + } + + if (!wcscmp(wchars2Add, textW)) + { + ::SendMessage(hCombo, CB_DELETESTRING, i, 0); + break; + } + } + else + { + ::SendMessage(hCombo, CB_GETLBTEXT, i, (LPARAM)text); + if (!strcmp(txt2add, text)) + { + ::SendMessage(hCombo, CB_DELETESTRING, i, 0); + break; + } + } + } + + if (!isUTF8) + i = ::SendMessage(hCombo, CB_INSERTSTRING, 0, (LPARAM)txt2add); + + else + { + if (!isWin9x) + i = ::SendMessageW(hCombo, CB_INSERTSTRING, 0, (LPARAM)wchars2Add); + else + { + ::WideCharToMultiByte(CP_ACP, 0, wchars2Add, -1, text, FINDREPLACE_MAXLENGTH - 1, NULL, NULL); + i = ::SendMessageA(hCombo, CB_INSERTSTRING, 0, (LPARAM)text); + } + } +#endif + ::SendMessage(hCombo, CB_SETCURSEL, i, 0); +} + +generic_string FindReplaceDlg::getTextFromCombo(HWND hCombo, bool isUnicode) const +{ + TCHAR str[FINDREPLACE_MAXLENGTH]; +#ifdef UNICODE + ::SendMessage(hCombo, WM_GETTEXT, FINDREPLACE_MAXLENGTH - 1, (LPARAM)str); +#else + bool isWin9x = _winVer <= WV_ME; + if (isUnicode) + { + wchar_t wchars[FINDREPLACE_MAXLENGTH]; + if ( !isWin9x ) + { + ::SendMessageW(hCombo, WM_GETTEXT, FINDREPLACE_MAXLENGTH - 1, (LPARAM)wchars); + } + else + { + char achars[FINDREPLACE_MAXLENGTH]; + ::SendMessageA(hCombo, WM_GETTEXT, FINDREPLACE_MAXLENGTH - 1, (LPARAM)achars); + ::MultiByteToWideChar(CP_ACP, 0, achars, -1, wchars, FINDREPLACE_MAXLENGTH - 1); + } + ::WideCharToMultiByte(CP_UTF8, 0, wchars, -1, str, FINDREPLACE_MAXLENGTH - 1, NULL, NULL); + } + else + { + ::SendMessage(hCombo, WM_GETTEXT, FINDREPLACE_MAXLENGTH - 1, (LPARAM)str); + } + +#endif + return generic_string(str); +} + + +// important : to activate all styles +const int STYLING_MASK = 255; + +void FindReplaceDlg::create(int dialogID, bool isRTL) +{ + StaticDialog::create(dialogID, isRTL); + fillFindHistory(); + _currentStatus = REPLACE_DLG; + initOptionsFromDlg(); + + RECT rect; + //::GetWindowRect(_hSelf, &rect); + getClientRect(rect); + _tab.init(_hInst, _hSelf, false, false, true); + _tab.setFont(TEXT("Tahoma"), 13); + + const TCHAR *find = TEXT("Find"); + const TCHAR *replace = TEXT("Replace"); + const TCHAR *findInFiles = TEXT("Find in files"); + + NppParameters::FindDlgTabTitiles & fdTitles = NppParameters::getInstance()->getFindDlgTabTitiles(); + + if (fdTitles.isWellFilled()) + { + find = fdTitles._find.c_str(); + replace = fdTitles._replace.c_str(); + findInFiles = fdTitles._findInFiles.c_str(); + } + _tab.insertAtEnd(find); + _tab.insertAtEnd(replace); + _tab.insertAtEnd(findInFiles); + + _tab.reSizeTo(rect); + _tab.display(); + + ETDTProc enableDlgTheme = (ETDTProc)::SendMessage(_hParent, NPPM_GETENABLETHEMETEXTUREFUNC, 0, 0); + if (enableDlgTheme) + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + + goToCenter(); +} + +void FindReplaceDlg::fillFindHistory() +{ + NppParameters *nppParams = NppParameters::getInstance(); + + FindHistory& findHistory = nppParams->getFindHistory(); + + fillComboHistory(IDD_FINDINFILES_DIR_COMBO, findHistory._nbFindHistoryPath, findHistory._pFindHistoryPath); + fillComboHistory(IDD_FINDINFILES_FILTERS_COMBO, findHistory._nbFindHistoryFilter, findHistory._pFindHistoryFilter); + fillComboHistory(IDFINDWHAT, findHistory._nbFindHistoryFind, findHistory._pFindHistoryFind); + fillComboHistory(IDREPLACEWITH, findHistory._nbFindHistoryReplace, findHistory._pFindHistoryReplace); + + ::SendDlgItemMessage(_hSelf, IDWRAP, BM_SETCHECK, findHistory._isWrap, 0); + ::SendDlgItemMessage(_hSelf, IDWHOLEWORD, BM_SETCHECK, findHistory._isMatchWord, 0); + ::SendDlgItemMessage(_hSelf, IDMATCHCASE, BM_SETCHECK, findHistory._isMatchCase, 0); + + ::SendDlgItemMessage(_hSelf, IDDIRECTIONUP, BM_SETCHECK, !findHistory._isDirectionDown, 0); + ::SendDlgItemMessage(_hSelf, IDDIRECTIONDOWN, BM_SETCHECK, findHistory._isDirectionDown, 0); + + ::SendDlgItemMessage(_hSelf, IDD_FINDINFILES_INHIDDENDIR_CHECK, BM_SETCHECK, findHistory._isFifInHiddenFolder, 0); + ::SendDlgItemMessage(_hSelf, IDD_FINDINFILES_RECURSIVE_CHECK, BM_SETCHECK, findHistory._isFifRecuisive, 0); + + ::SendDlgItemMessage(_hSelf, IDNORMAL, BM_SETCHECK, findHistory._searchMode == FindHistory::normal, 0); + ::SendDlgItemMessage(_hSelf, IDEXTENDED, BM_SETCHECK, findHistory._searchMode == FindHistory::extended, 0); + ::SendDlgItemMessage(_hSelf, IDREGEXP, BM_SETCHECK, findHistory._searchMode == FindHistory::regExpr, 0); + if (findHistory._searchMode == FindHistory::regExpr) + { + //regex doesnt allow wholeword + ::SendDlgItemMessage(_hSelf, IDWHOLEWORD, BM_SETCHECK, BST_UNCHECKED, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDWHOLEWORD), (BOOL)false); + + //regex doesnt allow upward search + ::SendDlgItemMessage(_hSelf, IDDIRECTIONDOWN, BM_SETCHECK, BST_CHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDDIRECTIONUP, BM_SETCHECK, BST_UNCHECKED, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDDIRECTIONUP), (BOOL)false); + } + + if (nppParams->isTransparentAvailable()) + { + ::ShowWindow(::GetDlgItem(_hSelf, IDC_TRANSPARENT_CHECK), SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_TRANSPARENT_GRPBOX), SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_TRANSPARENT_LOSSFOCUS_RADIO), SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_TRANSPARENT_ALWAYS_RADIO), SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_PERCENTAGE_SLIDER), SW_SHOW); + + ::SendDlgItemMessage(_hSelf, IDC_PERCENTAGE_SLIDER, TBM_SETRANGE, FALSE, MAKELONG(20, 200)); + ::SendDlgItemMessage(_hSelf, IDC_PERCENTAGE_SLIDER, TBM_SETPOS, TRUE, findHistory._transparency); + + if (findHistory._transparencyMode == FindHistory::none) + { + ::EnableWindow(::GetDlgItem(_hSelf, IDC_TRANSPARENT_GRPBOX), FALSE); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_TRANSPARENT_LOSSFOCUS_RADIO), FALSE); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_TRANSPARENT_ALWAYS_RADIO), FALSE); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_PERCENTAGE_SLIDER), FALSE); + } + else + { + ::SendDlgItemMessage(_hSelf, IDC_TRANSPARENT_CHECK, BM_SETCHECK, TRUE, 0); + + int id; + if (findHistory._transparencyMode == FindHistory::onLossingFocus) + { + id = IDC_TRANSPARENT_LOSSFOCUS_RADIO; + } + else + { + id = IDC_TRANSPARENT_ALWAYS_RADIO; + (NppParameters::getInstance())->SetTransparent(_hSelf, findHistory._transparency); + + } + ::SendDlgItemMessage(_hSelf, id, BM_SETCHECK, TRUE, 0); + } + } +} + +void FindReplaceDlg::fillComboHistory(int id, int count, generic_string **pStrings) +{ + int i; + bool isUnicode = false; + HWND hCombo; + + hCombo = ::GetDlgItem(_hSelf, id); + for (i = count -1 ; i >= 0 ; i--) + { + addText2Combo(pStrings[i]->c_str(), hCombo, isUnicode); + } + ::SendMessage(hCombo, CB_SETCURSEL, 0, 0); // select first item +} + + +void FindReplaceDlg::saveFindHistory() +{ + if (! isCreated()) return; + FindHistory& findHistory = (NppParameters::getInstance())->getFindHistory(); + + saveComboHistory(IDD_FINDINFILES_DIR_COMBO, findHistory._nbMaxFindHistoryPath, findHistory._nbFindHistoryPath, findHistory._pFindHistoryPath); + saveComboHistory(IDD_FINDINFILES_FILTERS_COMBO, findHistory._nbMaxFindHistoryFilter, findHistory._nbFindHistoryFilter, findHistory._pFindHistoryFilter); + saveComboHistory(IDFINDWHAT, findHistory._nbMaxFindHistoryFind, findHistory._nbFindHistoryFind, findHistory._pFindHistoryFind); + saveComboHistory(IDREPLACEWITH, findHistory._nbMaxFindHistoryReplace, findHistory._nbFindHistoryReplace, findHistory._pFindHistoryReplace); +} + +void FindReplaceDlg::saveComboHistory(int id, int maxcount, int & oldcount, generic_string **pStrings) +{ + int i, count; + bool isUnicode = false; + HWND hCombo; + TCHAR text[FINDREPLACE_MAXLENGTH]; + + hCombo = ::GetDlgItem(_hSelf, id); + count = ::SendMessage(hCombo, CB_GETCOUNT, 0, 0); + count = min(count, maxcount); + for (i = 0; i < count; i++) + { + ::SendMessage(hCombo, CB_GETLBTEXT, i, (LPARAM) text); + if (i < oldcount) + *pStrings[i] = text; + else + pStrings[i] = new generic_string(text); + } + for (; i < oldcount; i++) delete pStrings[i]; + oldcount = count; +} + +void FindReplaceDlg::updateCombos() +{ + updateCombo(IDREPLACEWITH); + updateCombo(IDFINDWHAT); +} + +FoundInfo Finder::EmptyFoundInfo(0, 0, TEXT("")); +SearchResultMarking Finder::EmptySearchResultMarking; + +bool Finder::notify(SCNotification *notification) +{ + static bool isDoubleClicked = false; + + switch (notification->nmhdr.code) + { + case SCN_MARGINCLICK: + if (notification->margin == ScintillaEditView::_SC_MARGE_FOLDER) + { + _scintView.marginClick(notification->position, notification->modifiers); + } + break; + + case SCN_DOUBLECLICK: + { + // remove selection from the finder + isDoubleClicked = true; + int pos = notification->position; + if (pos == INVALID_POSITION) + pos = _scintView.execute(SCI_GETLINEENDPOSITION, notification->line); + _scintView.execute(SCI_SETSEL, pos, pos); + + GotoFoundLine(); + } + break; + + case SCN_PAINTED : + if (isDoubleClicked) + { + (*_ppEditView)->getFocus(); + isDoubleClicked = false; + } + break; + } + return false; +} + + +void Finder::GotoFoundLine() +{ + int currentPos = _scintView.execute(SCI_GETCURRENTPOS); + int lno = _scintView.execute(SCI_LINEFROMPOSITION, currentPos); + int start = _scintView.execute(SCI_POSITIONFROMLINE, lno); + int end = _scintView.execute(SCI_GETLINEENDPOSITION, lno); + if (start + 2 >= end) return; // avoid empty lines + + if (_scintView.execute(SCI_GETFOLDLEVEL, lno) & SC_FOLDLEVELHEADERFLAG) + { + _scintView.execute(SCI_TOGGLEFOLD, lno); + return; + } + + const FoundInfo fInfo = *(_pMainFoundInfos->begin() + lno); + + // Switch to another document + ::SendMessage(::GetParent(_hParent), WM_DOOPEN, 0, (LPARAM)fInfo._fullPath.c_str()); + Searching::displaySectionCentered(fInfo._start, fInfo._end, *_ppEditView); + + // Then we colourise the double clicked line + setFinderStyle(); + _scintView.execute(SCI_SETLEXER, SCLEX_NULL); // yniq - this line causes a bug!!! (last line suddenly belongs to file header level (?) instead of having level=0x400) + // later it affects DeleteResult and gotoNextFoundResult (assertions) + // fixed by calling setFinderStyle() in DeleteResult() + _scintView.execute(SCI_STYLESETEOLFILLED, SCE_SEARCHRESULT_HIGHLIGHT_LINE, true); + _scintView.execute(SCI_STARTSTYLING, start, STYLING_MASK); + _scintView.execute(SCI_SETSTYLING, end - start + 2, SCE_SEARCHRESULT_HIGHLIGHT_LINE); + _scintView.execute(SCI_COLOURISE, start, end + 1); +} + +void Finder::DeleteResult() +{ + int currentPos = _scintView.execute(SCI_GETCURRENTPOS); // yniq - add handling deletion of multiple lines? + + int lno = _scintView.execute(SCI_LINEFROMPOSITION, currentPos); + int start = _scintView.execute(SCI_POSITIONFROMLINE, lno); + int end = _scintView.execute(SCI_GETLINEENDPOSITION, lno); + if (start + 2 >= end) return; // avoid empty lines + + _scintView.setLexer(SCLEX_SEARCHRESULT, L_SEARCHRESULT, 0); // Restore searchResult lexer in case the lexer was changed to SCLEX_NULL in GotoFoundLine() + + if (_scintView.execute(SCI_GETFOLDLEVEL, lno) & SC_FOLDLEVELHEADERFLAG) // delete a folder + { + int endline = _scintView.execute(SCI_GETLASTCHILD, lno, -1) + 1; + assert((size_t) endline <= _pMainFoundInfos->size()); + + _pMainFoundInfos->erase(_pMainFoundInfos->begin() + lno, _pMainFoundInfos->begin() + endline); // remove found info + _pMainMarkings->erase(_pMainMarkings->begin() + lno, _pMainMarkings->begin() + endline); + + int end = _scintView.execute(SCI_POSITIONFROMLINE, endline); + _scintView.execute(SCI_SETSEL, start, end); + setFinderReadOnly(false); + _scintView.execute(SCI_CLEAR); + setFinderReadOnly(true); + } + else // delete one line + { + assert((size_t) lno < _pMainFoundInfos->size()); + + _pMainFoundInfos->erase(_pMainFoundInfos->begin() + lno); // remove found info + _pMainMarkings->erase(_pMainMarkings->begin() + lno); + + setFinderReadOnly(false); + _scintView.execute(SCI_LINEDELETE); + setFinderReadOnly(true); + } + _MarkingsStruct._length = _pMainMarkings->size(); + + assert(_pMainFoundInfos->size() == _pMainMarkings->size()); + assert(_scintView.execute(SCI_GETLINECOUNT) == _pMainFoundInfos->size() + 1); +} + +void Finder::gotoNextFoundResult(int direction) +{ + int increment = direction < 0 ? -1 : 1; + int currentPos = _scintView.execute(SCI_GETCURRENTPOS); + int lno = _scintView.execute(SCI_LINEFROMPOSITION, currentPos); + int total_lines = _scintView.execute(SCI_GETLINECOUNT); + if (total_lines <= 1) return; + + if (lno == total_lines - 1) lno--; // last line doesn't belong to any search, use last search + + int init_lno = lno; + int max_lno = _scintView.execute(SCI_GETLASTCHILD, lno, searchHeaderLevel); + + assert(max_lno <= total_lines - 2); + + // get the line number of the current search (searchHeaderLevel) + int level = _scintView.execute(SCI_GETFOLDLEVEL, lno) & SC_FOLDLEVELNUMBERMASK; + int min_lno = lno; + while (level-- >= fileHeaderLevel) + { + min_lno = _scintView.execute(SCI_GETFOLDPARENT, min_lno); + assert(min_lno >= 0); + } + + if (min_lno < 0) min_lno = lno; // when lno is a search header line + + assert(min_lno <= max_lno); + + lno += increment; + + if (lno > max_lno) lno = min_lno; + else if (lno < min_lno) lno = max_lno; + + while (_scintView.execute(SCI_GETFOLDLEVEL, lno) & SC_FOLDLEVELHEADERFLAG) + { + lno += increment; + if (lno > max_lno) lno = min_lno; + else if (lno < min_lno) lno = max_lno; + if (lno == init_lno) break; + } + + if ((_scintView.execute(SCI_GETFOLDLEVEL, lno) & SC_FOLDLEVELHEADERFLAG) == 0) + { + int start = _scintView.execute(SCI_POSITIONFROMLINE, lno); + _scintView.execute(SCI_SETSEL, start, start); + _scintView.execute(SCI_ENSUREVISIBLE, lno); + _scintView.execute(SCI_SCROLLCARET); + + GotoFoundLine(); + } +} + +BOOL CALLBACK FindReplaceDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG : + { + RECT arc; + ::GetWindowRect(::GetDlgItem(_hSelf, IDCANCEL), &arc); + _findInFilesClosePos.bottom = _replaceClosePos.bottom = _findClosePos.bottom = arc.bottom - arc.top; + _findInFilesClosePos.right = _replaceClosePos.right = _findClosePos.right = arc.right - arc.left; + + POINT p; + p.x = arc.left; + p.y = arc.top; + ::ScreenToClient(_hSelf, &p); + + _replaceClosePos.left = p.x; + _replaceClosePos.top = p.y; + + p = getLeftTopPoint(::GetDlgItem(_hSelf, IDREPLACEALL)); + _findInFilesClosePos.left = p.x; + _findInFilesClosePos.top = p.y; + + p = getLeftTopPoint(::GetDlgItem(_hSelf, IDCANCEL)); + _findClosePos.left = p.x; + _findClosePos.top = p.y + 10; + + return TRUE; + } + + case WM_HSCROLL : + { + if ((HWND)lParam == ::GetDlgItem(_hSelf, IDC_PERCENTAGE_SLIDER)) + { + int percent = ::SendDlgItemMessage(_hSelf, IDC_PERCENTAGE_SLIDER, TBM_GETPOS, 0, 0); + FindHistory & findHistory = (NppParameters::getInstance())->getFindHistory(); + findHistory._transparency = percent; + if (isCheckedOrNot(IDC_TRANSPARENT_ALWAYS_RADIO)) + { + (NppParameters::getInstance())->SetTransparent(_hSelf, percent); + } + } + return TRUE; + } + + case WM_NOTIFY: + { + NMHDR *nmhdr = (NMHDR *)lParam; + if (nmhdr->code == TCN_SELCHANGE) + { + HWND tabHandle = _tab.getHSelf(); + if (nmhdr->hwndFrom == tabHandle) + { + int indexClicked = int(::SendMessage(tabHandle, TCM_GETCURSEL, 0, 0)); + doDialog((DIALOG_TYPE)indexClicked); + } + return TRUE; + } + break; + } + + case WM_ACTIVATE : + { + if (LOWORD(wParam) == WA_ACTIVE || LOWORD(wParam) == WA_CLICKACTIVE) + { + CharacterRange cr = (*_ppEditView)->getSelection(); + int nbSelected = cr.cpMax - cr.cpMin; + + int checkVal; + if (nbSelected <= 1024) + { + checkVal = BST_UNCHECKED; + _isInSelection = false; + } + else + { + checkVal = BST_CHECKED; + _isInSelection = true; + } + + // Searching/replacing in column selection is not allowed + if ((*_ppEditView)->execute(SCI_GETSELECTIONMODE) == SC_SEL_RECTANGLE) + { + checkVal = BST_UNCHECKED; + _isInSelection = false; + nbSelected = 0; + } + ::EnableWindow(::GetDlgItem(_hSelf, IDC_IN_SELECTION_CHECK), nbSelected); + ::SendDlgItemMessage(_hSelf, IDC_IN_SELECTION_CHECK, BM_SETCHECK, checkVal, 0); + } + + if (isCheckedOrNot(IDC_TRANSPARENT_LOSSFOCUS_RADIO)) + { + if (LOWORD(wParam) == WA_INACTIVE) + { + int percent = ::SendDlgItemMessage(_hSelf, IDC_PERCENTAGE_SLIDER, TBM_GETPOS, 0, 0); + (NppParameters::getInstance())->SetTransparent(_hSelf, percent); + } + else + { + (NppParameters::getInstance())->removeTransparent(_hSelf); + } + } + return TRUE; + } + + case NPPM_MODELESSDIALOG : + return ::SendMessage(_hParent, NPPM_MODELESSDIALOG, wParam, lParam); + + case WM_COMMAND : + { + NppParameters *nppParamInst = NppParameters::getInstance(); + FindHistory & findHistory = nppParamInst->getFindHistory(); + switch (wParam) + { + case IDCANCEL : // Close + display(false); + return TRUE; + +//Single actions + case IDOK : // Find Next : only for FIND_DLG and REPLACE_DLG + { + bool isUnicode = (*_ppEditView)->getCurrentBuffer()->getUnicodeMode() != uni8Bit; + + HWND hFindCombo = ::GetDlgItem(_hSelf, IDFINDWHAT); + generic_string str2Search = getTextFromCombo(hFindCombo, isUnicode); + updateCombo(IDFINDWHAT); + + nppParamInst->_isFindReplacing = true; + processFindNext(str2Search.c_str()); + nppParamInst->_isFindReplacing = false; + } + return TRUE; + + case IDREPLACE : + { + if (_currentStatus == REPLACE_DLG) + { + bool isUnicode = (*_ppEditView)->getCurrentBuffer()->getUnicodeMode() != uni8Bit; + HWND hFindCombo = ::GetDlgItem(_hSelf, IDFINDWHAT); + HWND hReplaceCombo = ::GetDlgItem(_hSelf, IDREPLACEWITH); + generic_string str2Search = getTextFromCombo(hFindCombo, isUnicode); + generic_string str2Replace = getTextFromCombo(hReplaceCombo, isUnicode); + updateCombos(); + + nppParamInst->_isFindReplacing = true; + processReplace(str2Search.c_str(), str2Replace.c_str()); + nppParamInst->_isFindReplacing = false; + } + } + return TRUE; +//Process actions + case IDC_FINDALL_OPENEDFILES : + { + if (_currentStatus == FIND_DLG) + { + updateCombo(IDFINDWHAT); + + nppParamInst->_isFindReplacing = true; + findAllIn(ALL_OPEN_DOCS); + nppParamInst->_isFindReplacing = false; + } + } + return TRUE; + + case IDC_FINDALL_CURRENTFILE : + { + updateCombo(IDFINDWHAT); + + nppParamInst->_isFindReplacing = true; + findAllIn(CURRENT_DOC); + nppParamInst->_isFindReplacing = false; + } + return TRUE; + + case IDD_FINDINFILES_FIND_BUTTON : + { + const int filterSize = 256; + TCHAR filters[filterSize]; + TCHAR directory[MAX_PATH]; + ::GetDlgItemText(_hSelf, IDD_FINDINFILES_FILTERS_COMBO, filters, filterSize); + addText2Combo(filters, ::GetDlgItem(_hSelf, IDD_FINDINFILES_FILTERS_COMBO)); + _filters = filters; + + ::GetDlgItemText(_hSelf, IDD_FINDINFILES_DIR_COMBO, directory, MAX_PATH); + addText2Combo(directory, ::GetDlgItem(_hSelf, IDD_FINDINFILES_DIR_COMBO)); + _directory = directory; + + if ((lstrlen(directory) > 0) && (directory[lstrlen(directory)-1] != '\\')) + _directory += TEXT("\\"); + + updateCombo(IDFINDWHAT); + + nppParamInst->_isFindReplacing = true; + findAllIn(FILES_IN_DIR); + nppParamInst->_isFindReplacing = false; + } + return TRUE; + + case IDD_FINDINFILES_REPLACEINFILES : + { + const int filterSize = 256; + TCHAR filters[filterSize]; + TCHAR directory[MAX_PATH]; + ::GetDlgItemText(_hSelf, IDD_FINDINFILES_FILTERS_COMBO, filters, filterSize); + addText2Combo(filters, ::GetDlgItem(_hSelf, IDD_FINDINFILES_FILTERS_COMBO)); + _filters = filters; + + ::GetDlgItemText(_hSelf, IDD_FINDINFILES_DIR_COMBO, directory, MAX_PATH); + addText2Combo(directory, ::GetDlgItem(_hSelf, IDD_FINDINFILES_DIR_COMBO)); + _directory = directory; + + if ((lstrlen(directory) > 0) && (directory[lstrlen(directory)-1] != '\\')) + _directory += TEXT("\\"); + + generic_string msg = TEXT("Are you sure you want to replace all occurances in :\r"); + msg += _directory; + msg += TEXT("\rfor file type : "); + msg += _filters[0]?_filters:TEXT("*.*"); + + if (::MessageBox(_hSelf, msg.c_str(), TEXT("Are you sure?"), MB_OKCANCEL) == IDOK) + { + updateCombo(IDFINDWHAT); + updateCombo(IDREPLACEWITH); + + nppParamInst->_isFindReplacing = true; + ::SendMessage(_hParent, WM_REPLACEINFILES, 0, 0); + nppParamInst->_isFindReplacing = false; + } + } + return TRUE; + + case IDC_REPLACE_OPENEDFILES : + { + if (_currentStatus == REPLACE_DLG) + { + updateCombos(); + + nppParamInst->_isFindReplacing = true; + replaceAllInOpenedDocs(); + nppParamInst->_isFindReplacing = false; + } + } + return TRUE; + + case IDREPLACEALL : + { + if (_currentStatus == REPLACE_DLG) + { + updateCombos(); + + nppParamInst->_isFindReplacing = true; + (*_ppEditView)->execute(SCI_BEGINUNDOACTION); + int nbReplaced = processAll(ProcessReplaceAll, NULL, NULL); + (*_ppEditView)->execute(SCI_ENDUNDOACTION); + nppParamInst->_isFindReplacing = false; + + TCHAR result[64]; + if (nbReplaced < 0) + lstrcpy(result, TEXT("The regular expression to search is formed badly")); + else + wsprintf(result, TEXT("%d occurrences were replaced."), nbReplaced); + ::MessageBox(_hSelf, result, TEXT("Replace All"), MB_OK); + } + } + return TRUE; + + case IDCCOUNTALL : + { + if (_currentStatus == FIND_DLG) + { + int nbCounted = processAll(ProcessCountAll, NULL, NULL); + TCHAR result[128]; + if (nbCounted < 0) + lstrcpy(result, TEXT("The regular expression to search is formed badly.\r\nIs it resulting in nothing?")); + else + wsprintf(result, TEXT("%d match(es) to occurrence(s)"), nbCounted); + ::MessageBox(_hSelf, result, TEXT("Count"), MB_OK); + } + } + return TRUE; + + case IDCMARKALL : + { + if (_currentStatus == FIND_DLG) + { + updateCombo(IDFINDWHAT); + + nppParamInst->_isFindReplacing = true; + int nbMarked = processAll(ProcessMarkAll, NULL, NULL); + nppParamInst->_isFindReplacing = false; + TCHAR result[128]; + if (nbMarked < 0) + lstrcpy(result, TEXT("The regular expression to search is formed badly.\r\nIs it resulting in nothing?")); + else + wsprintf(result, TEXT("%d match(es) to occurrence(s)"), nbMarked); + ::MessageBox(_hSelf, result, TEXT("Mark"), MB_OK); + } + } + return TRUE; + + case IDC_CLEAR_ALL : + { + if (_currentStatus == FIND_DLG) + { + (*_ppEditView)->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE); + (*_ppEditView)->execute(SCI_MARKERDELETEALL, MARK_BOOKMARK); + } + } + return TRUE; +//Option actions + case IDWHOLEWORD : + findHistory._isMatchWord = _options._isWholeWord = isCheckedOrNot(IDWHOLEWORD); + return TRUE; + + case IDMATCHCASE : + findHistory._isMatchCase = _options._isMatchCase = isCheckedOrNot(IDMATCHCASE); + return TRUE; + + case IDNORMAL: + case IDEXTENDED: + case IDREGEXP : { + if (isCheckedOrNot(IDREGEXP)) + { + _options._searchType = FindRegex; + findHistory._searchMode = FindHistory::regExpr; + } + else if (isCheckedOrNot(IDEXTENDED)) + { + _options._searchType = FindExtended; + findHistory._searchMode = FindHistory::extended; + } + else + { + _options._searchType = FindNormal; + findHistory._searchMode = FindHistory::normal; + } + + bool isRegex = (_options._searchType == FindRegex); + if (isRegex) + { + //regex doesnt allow whole word + _options._isWholeWord = false; + ::SendDlgItemMessage(_hSelf, IDWHOLEWORD, BM_SETCHECK, _options._isWholeWord?BST_CHECKED:BST_UNCHECKED, 0); + + //regex doesnt allow upward search + ::SendDlgItemMessage(_hSelf, IDDIRECTIONDOWN, BM_SETCHECK, BST_CHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDDIRECTIONUP, BM_SETCHECK, BST_UNCHECKED, 0); + _options._whichDirection = DIR_DOWN; + } + + ::EnableWindow(::GetDlgItem(_hSelf, IDWHOLEWORD), (BOOL)!isRegex); + ::EnableWindow(::GetDlgItem(_hSelf, IDDIRECTIONUP), (BOOL)!isRegex); + return TRUE; } + + case IDWRAP : + findHistory._isWrap = _options._isWrapAround = isCheckedOrNot(IDWRAP); + return TRUE; + + case IDDIRECTIONUP : + case IDDIRECTIONDOWN : + _options._whichDirection = (BST_CHECKED == ::SendMessage(::GetDlgItem(_hSelf, IDDIRECTIONDOWN), BM_GETCHECK, BST_CHECKED, 0)); + findHistory._isDirectionDown = _options._whichDirection == DIR_DOWN; + return TRUE; + + case IDC_PURGE_CHECK : + { + if (_currentStatus == FIND_DLG) + _doPurge = isCheckedOrNot(IDC_PURGE_CHECK); + } + return TRUE; + + case IDC_MARKLINE_CHECK : + { + if (_currentStatus == FIND_DLG) + { + _doMarkLine = isCheckedOrNot(IDC_MARKLINE_CHECK); + ::EnableWindow(::GetDlgItem(_hSelf, IDCMARKALL), (_doMarkLine || _doStyleFoundToken)); + } + } + return TRUE; + + case IDC_STYLEFOUND_CHECK : + { + if (_currentStatus == FIND_DLG) + { + _doStyleFoundToken = isCheckedOrNot(IDC_STYLEFOUND_CHECK); + ::EnableWindow(::GetDlgItem(_hSelf, IDCMARKALL), (_doMarkLine || _doStyleFoundToken)); + } + } + return TRUE; + + case IDC_IN_SELECTION_CHECK : + { + if (_currentStatus == REPLACE_DLG) + _isInSelection = isCheckedOrNot(IDC_IN_SELECTION_CHECK); + } + return TRUE; + + case IDC_TRANSPARENT_CHECK : + { + bool isChecked = isCheckedOrNot(IDC_TRANSPARENT_CHECK); + + ::EnableWindow(::GetDlgItem(_hSelf, IDC_TRANSPARENT_GRPBOX), isChecked); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_TRANSPARENT_LOSSFOCUS_RADIO), isChecked); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_TRANSPARENT_ALWAYS_RADIO), isChecked); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_PERCENTAGE_SLIDER), isChecked); + + if (isChecked) + { + ::SendDlgItemMessage(_hSelf, IDC_TRANSPARENT_LOSSFOCUS_RADIO, BM_SETCHECK, BST_CHECKED, 0); + findHistory._transparencyMode = FindHistory::onLossingFocus; + } + else + { + ::SendDlgItemMessage(_hSelf, IDC_TRANSPARENT_LOSSFOCUS_RADIO, BM_SETCHECK, BST_UNCHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDC_TRANSPARENT_ALWAYS_RADIO, BM_SETCHECK, BST_UNCHECKED, 0); + (NppParameters::getInstance())->removeTransparent(_hSelf); + findHistory._transparencyMode = FindHistory::none; + } + + return TRUE; + } + + case IDC_TRANSPARENT_ALWAYS_RADIO : + { + int percent = ::SendDlgItemMessage(_hSelf, IDC_PERCENTAGE_SLIDER, TBM_GETPOS, 0, 0); + (NppParameters::getInstance())->SetTransparent(_hSelf, percent); + findHistory._transparencyMode = FindHistory::persistant; + } + return TRUE; + + case IDC_TRANSPARENT_LOSSFOCUS_RADIO : + { + (NppParameters::getInstance())->removeTransparent(_hSelf); + findHistory._transparencyMode = FindHistory::onLossingFocus; + } + return TRUE; + + // + // Find in Files + // + case IDD_FINDINFILES_RECURSIVE_CHECK : + { + if (_currentStatus == FINDINFILES_DLG) + findHistory._isFifRecuisive = _isRecursive = isCheckedOrNot(IDD_FINDINFILES_RECURSIVE_CHECK); + + } + return TRUE; + + case IDD_FINDINFILES_INHIDDENDIR_CHECK : + { + if (_currentStatus == FINDINFILES_DLG) + findHistory._isFifInHiddenFolder = _isInHiddenDir = isCheckedOrNot(IDD_FINDINFILES_INHIDDENDIR_CHECK); + + } + return TRUE; + case IDD_FINDINFILES_BROWSE_BUTTON : + { + if (_currentStatus == FINDINFILES_DLG) + folderBrowser(_hSelf, IDD_FINDINFILES_DIR_COMBO, _directory.c_str()); + } + return TRUE; + + default : + break; + } + break; + } + } + return FALSE; +} + +// return value : +// true : the text2find is found +// false : the text2find is not found +bool FindReplaceDlg::processFindNext(const TCHAR *txt2find, FindOption *options) +{ + if (!txt2find || !txt2find[0]) + return false; + + FindOption *pOptions = options?options:&_options; + + int stringSizeFind = lstrlen(txt2find); + TCHAR *pText = new TCHAR[stringSizeFind + 1]; + lstrcpy(pText, txt2find); + + if (pOptions->_searchType == FindExtended) { + stringSizeFind = Searching::convertExtendedToString(txt2find, pText, stringSizeFind); + } + + int docLength = int((*_ppEditView)->execute(SCI_GETLENGTH)); + CharacterRange cr = (*_ppEditView)->getSelection(); + + //The search "zone" is relative to the selection, so search happens 'outside' + int startPosition = cr.cpMax; + int endPosition = docLength; + + if (pOptions->_whichDirection == DIR_UP) + { + //When searching upwards, start is the lower part, end the upper, for backwards search + startPosition = cr.cpMin - 1; + endPosition = 0; + } + + if (pOptions->_isIncremental) + { + startPosition = 0; + endPosition = docLength; + } + + bool isRegExp = pOptions->_searchType == FindRegex; + int flags = Searching::buildSearchFlags(pOptions); + + (*_ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); + //::SendMessageA(_hParent, WM_SETTEXT, 0, (LPARAM)pText); + int posFind = (*_ppEditView)->searchInTarget(pText, startPosition, endPosition); + if (posFind == -1) //no match found in target, check if a new target should be used + { + if (pOptions->_isWrapAround) + { + //when wrapping, use the rest of the document (entire document is usable) + if (pOptions->_whichDirection == DIR_DOWN) + { + startPosition = 0; + endPosition = docLength; + } + else + { + startPosition = docLength; + endPosition = 0; + } + + //new target, search again + posFind = (*_ppEditView)->searchInTarget(pText, startPosition, endPosition); + } + if (posFind == -1) + { + //failed, or failed twice with wrap + if (!pOptions->_isIncremental) //incremental search doesnt trigger messages + { + generic_string msg = TEXT("Can't find the text:\r\n\""); + msg += pText; + msg += TEXT("\""); + ::MessageBox(_hSelf, msg.c_str(), TEXT("Find"), MB_OK); + // if the dialog is not shown, pass the focus to his parent(ie. Notepad++) + if (!::IsWindowVisible(_hSelf)) + { + ::SetFocus((*_ppEditView)->getHSelf()); + } + else + { + ::SetFocus(::GetDlgItem(_hSelf, IDFINDWHAT)); + } + } + delete [] pText; + return false; + } + } + + int start = posFind;//int((*_ppEditView)->execute(SCI_GETTARGETSTART)); + int end = int((*_ppEditView)->execute(SCI_GETTARGETEND)); + + // to make sure the found result is visible + Searching::displaySectionCentered(start, end, *_ppEditView, pOptions->_whichDirection == DIR_DOWN); + + + delete [] pText; + return true; +} + +// return value : +// true : the text is replaced, and find the next occurrence +// false : the text2find is not found, so the text is NOT replace +// || the text is replaced, and do NOT find the next occurrence +bool FindReplaceDlg::processReplace(const TCHAR *txt2find, const TCHAR *txt2replace, FindOption *options) +{ + if (!txt2find || !txt2find[0] || !txt2replace) + return false; + + FindOption *pOptions = options?options:&_options; + + if ((*_ppEditView)->getCurrentBuffer()->isReadOnly()) return false; + + int stringSizeFind = lstrlen(txt2find); + int stringSizeReplace = lstrlen(txt2replace); + TCHAR *pTextFind = new TCHAR[stringSizeFind + 1]; + TCHAR *pTextReplace = new TCHAR[stringSizeReplace + 1]; + lstrcpy(pTextFind, txt2find); + lstrcpy(pTextReplace, txt2replace); + + if (pOptions->_searchType == FindExtended) { + stringSizeFind = Searching::convertExtendedToString(txt2find, pTextFind, stringSizeFind); + stringSizeReplace = Searching::convertExtendedToString(txt2replace, pTextReplace, stringSizeReplace); + } + + bool isRegExp = pOptions->_searchType == FindRegex; + int flags = Searching::buildSearchFlags(pOptions); + CharacterRange cr = (*_ppEditView)->getSelection(); + + (*_ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); + int posFind = (*_ppEditView)->searchInTarget(pTextFind, cr.cpMin, cr.cpMax); + if (posFind != -1) + { + if (isRegExp) + { + //For the rare re exp case. ex: replace ^ by AAA + int start = int((*_ppEditView)->execute(SCI_GETTARGETSTART)); + int end = int((*_ppEditView)->execute(SCI_GETTARGETEND)); + int foundTextLen = (end >= start)?end - start:start - end; + + int replacedLen = (*_ppEditView)->replaceTargetRegExMode(pTextReplace); + + //if (!foundTextLen) + (*_ppEditView)->execute(SCI_SETSEL, start, start + replacedLen); + } + else + { + int start = int((*_ppEditView)->execute(SCI_GETTARGETSTART)); + int replacedLen = (*_ppEditView)->replaceTarget(pTextReplace); + (*_ppEditView)->execute(SCI_SETSEL, start, start + replacedLen); + } + } + + delete [] pTextFind; + delete [] pTextReplace; + return processFindNext(txt2find); //after replacing, find the next section for selection +} + + +int FindReplaceDlg::markAll(const TCHAR *txt2find, int styleID) +{ + _doStyleFoundToken = true; + FindOption opt; + opt._isMatchCase = true; + opt._isWholeWord = false; + + int nbFound = processAll(ProcessMarkAllExt, txt2find, NULL, true, NULL, &opt, styleID); + return nbFound; +} + +int FindReplaceDlg::markAll2(const TCHAR *txt2find) +{ + FindOption opt; + opt._isMatchCase = false; + opt._isWholeWord = true; + int nbFound = processAll(ProcessMarkAll_2, txt2find, NULL, true, NULL, &opt); + return nbFound; +} + + + +int FindReplaceDlg::markAllInc(const TCHAR *txt2find, FindOption *opt) +{ + int nbFound = processAll(ProcessMarkAll_IncSearch, txt2find, NULL, true, NULL, opt); + return nbFound; +} + +int FindReplaceDlg::processAll(ProcessOperation op, const TCHAR *txt2find, const TCHAR *txt2replace, bool isEntire, const TCHAR *fileName, FindOption *opt, int colourStyleID) +{ + FindOption *pOptions = opt?opt:&_options; + + CharacterRange cr = (*_ppEditView)->getSelection(); + int docLength = int((*_ppEditView)->execute(SCI_GETLENGTH)); + + // Default : + // direction : down + // begin at : 0 + // end at : end of doc + int startPosition = 0; + int endPosition = docLength; + + bool direction = pOptions->_whichDirection; + + //first try limiting scope by direction + if (direction == DIR_UP) + { + startPosition = 0; + endPosition = cr.cpMax; + } + else + { + startPosition = cr.cpMin; + endPosition = docLength; + } + + //then adjust scope if the full document needs to be changed + if (pOptions->_isWrapAround || isEntire || (op == ProcessCountAll)) //entire document needs to be scanned + { + startPosition = 0; + endPosition = docLength; + } + + //then readjust scope if the selection override is active and allowed + if ((_isInSelection) && ((op == ProcessMarkAll) || ((op == ProcessReplaceAll) && (!isEntire)))) //if selection limiter and either mark all or replace all w/o entire document override + { + startPosition = cr.cpMin; + endPosition = cr.cpMax; + } + + if (ProcessMarkAllExt && colourStyleID != -1) + { + startPosition = 0; + endPosition = docLength; + } + + return processRange(op, txt2find, txt2replace, startPosition, endPosition, fileName, opt, colourStyleID); +} + +int FindReplaceDlg::processRange(ProcessOperation op, const TCHAR *txt2find, const TCHAR *txt2replace, int startRange, int endRange, const TCHAR *fileName, FindOption *opt, int colourStyleID) +{ + int nbProcessed = 0; + + if (!isCreated() && !txt2find) + return nbProcessed; + + if ((op == ProcessReplaceAll) && (*_ppEditView)->getCurrentBuffer()->isReadOnly()) + return nbProcessed; + + if (startRange == endRange) + return nbProcessed; + + if (!fileName) + fileName = TEXT(""); + + FindOption *pOptions = opt?opt:&_options; + //bool isUnicode = (*_ppEditView)->getCurrentBuffer()->getUnicodeMode() != uni8Bit; + bool isUnicode = ((*_ppEditView)->execute(SCI_GETCODEPAGE) == SC_CP_UTF8); + + int stringSizeFind = 0; + int stringSizeReplace = 0; + + TCHAR *pTextFind = NULL;//new TCHAR[stringSizeFind + 1]; + if (!txt2find) + { + HWND hFindCombo = ::GetDlgItem(_hSelf, IDFINDWHAT); + generic_string str2Search = getTextFromCombo(hFindCombo, isUnicode); + stringSizeFind = str2Search.length(); + pTextFind = new TCHAR[stringSizeFind + 1]; + lstrcpy(pTextFind, str2Search.c_str()); + } + else + { + stringSizeFind = lstrlen(txt2find); + pTextFind = new TCHAR[stringSizeFind + 1]; + lstrcpy(pTextFind, txt2find); + } + + if (!pTextFind[0]) + { + delete [] pTextFind; + return nbProcessed; + } + + TCHAR *pTextReplace = NULL; + if (op == ProcessReplaceAll) + { + if (!txt2replace) + { + HWND hReplaceCombo = ::GetDlgItem(_hSelf, IDREPLACEWITH); + generic_string str2Replace = getTextFromCombo(hReplaceCombo, isUnicode); + stringSizeReplace = str2Replace.length(); + pTextReplace = new TCHAR[stringSizeReplace + 1]; + lstrcpy(pTextReplace, str2Replace.c_str()); + } + else + { + stringSizeReplace = lstrlen(txt2replace); + pTextReplace = new TCHAR[stringSizeReplace + 1]; + lstrcpy(pTextReplace, txt2replace); + } + } + + if (pOptions->_searchType == FindExtended) { + stringSizeFind = Searching::convertExtendedToString(pTextFind, pTextFind, stringSizeFind); + if (op == ProcessReplaceAll) + stringSizeReplace = Searching::convertExtendedToString(pTextReplace, pTextReplace, stringSizeReplace); + } + + bool isRegExp = pOptions->_searchType == FindRegex; + int flags = Searching::buildSearchFlags(pOptions); + + + + if (op == ProcessMarkAll && colourStyleID == -1) //if marking, check if purging is needed + { + if (_doPurge) { + if (_doMarkLine) + (*_ppEditView)->execute(SCI_MARKERDELETEALL, MARK_BOOKMARK); + + if (_doStyleFoundToken) + (*_ppEditView)->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE); + } + } + + int targetStart = 0; + int targetEnd = 0; + + //Initial range for searching + (*_ppEditView)->execute(SCI_SETSEARCHFLAGS, flags); + targetStart = (*_ppEditView)->searchInTarget(pTextFind, startRange, endRange); + + if ((targetStart != -1) && (op == ProcessFindAll)) //add new filetitle if this file results in hits + { + _pFinder->addFileNameTitle(fileName); + } + while (targetStart != -1) + { + //int posFindBefore = posFind; + targetStart = int((*_ppEditView)->execute(SCI_GETTARGETSTART)); + targetEnd = int((*_ppEditView)->execute(SCI_GETTARGETEND)); + if (targetEnd > endRange) { //we found a result but outside our range, therefore do not process it + break; + } + int foundTextLen = targetEnd - targetStart; + int replaceDelta = 0; + + // Search resulted in empty token, possible with RE + if (!foundTextLen) { + delete [] pTextFind; + delete [] pTextReplace; + return -1; + } + + switch (op) + { + case ProcessFindAll: + { + int lineNumber = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, targetStart); + int lend = (*_ppEditView)->execute(SCI_GETLINEENDPOSITION, lineNumber); + int lstart = (*_ppEditView)->execute(SCI_POSITIONFROMLINE, lineNumber); + int nbChar = lend - lstart; + + // use the static buffer + TCHAR lineBuf[1024]; + + if (nbChar > 1024 - 3) + lend = lstart + 1020; + + int start_mark = targetStart - lstart; + int end_mark = targetEnd - lstart; + + (*_ppEditView)->getGenericText(lineBuf, lstart, lend, &start_mark, &end_mark); + generic_string line; +#ifdef UNICODE + line = lineBuf; +#else + UINT cp = (*_ppEditView)->execute(SCI_GETCODEPAGE); + if (cp != SC_CP_UTF8) + { + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + const wchar_t *pTextW = wmc->char2wchar(lineBuf, ::GetACP()); + const char *pTextA = wmc->wchar2char(pTextW, SC_CP_UTF8); + line = pTextA; + } + else + line = lineBuf; +#endif + line += TEXT("\r\n"); + SearchResultMarking srm; + srm._start = start_mark; + srm._end = end_mark; + _pFinder->add(FoundInfo(targetStart, targetEnd, fileName), srm, line.c_str(), lineNumber + 1); + + break; + } + + case ProcessReplaceAll: + { + int replacedLength; + if (isRegExp) + replacedLength = (*_ppEditView)->replaceTargetRegExMode(pTextReplace); + else + replacedLength = (*_ppEditView)->replaceTarget(pTextReplace); + + replaceDelta = replacedLength - foundTextLen; + break; + } + + case ProcessMarkAll: + { + if (_doStyleFoundToken) + { + (*_ppEditView)->execute(SCI_SETINDICATORCURRENT, SCE_UNIVERSAL_FOUND_STYLE); + (*_ppEditView)->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen); + } + + if (_doMarkLine) + { + int lineNumber = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, targetStart); + int state = (*_ppEditView)->execute(SCI_MARKERGET, lineNumber); + + if (!(state & (1 << MARK_BOOKMARK))) + (*_ppEditView)->execute(SCI_MARKERADD, lineNumber, MARK_BOOKMARK); + } + break; + } + + case ProcessMarkAllExt: + { + (*_ppEditView)->execute(SCI_SETINDICATORCURRENT, colourStyleID); + (*_ppEditView)->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen); + break; + } + + case ProcessMarkAll_2: + { + (*_ppEditView)->execute(SCI_SETINDICATORCURRENT, SCE_UNIVERSAL_FOUND_STYLE_2); + (*_ppEditView)->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen); + break; + } + + case ProcessMarkAll_IncSearch: + { + (*_ppEditView)->execute(SCI_SETINDICATORCURRENT, SCE_UNIVERSAL_FOUND_STYLE_INC); + (*_ppEditView)->execute(SCI_INDICATORFILLRANGE, targetStart, foundTextLen); + break; + } + + case ProcessCountAll: + { + //Nothing to do + break; + } + + default: + { + delete [] pTextFind; + delete [] pTextReplace; + return nbProcessed; + } + + } + + startRange = targetStart + foundTextLen + replaceDelta; //search from result onwards + endRange += replaceDelta; //adjust end of range in case of replace + + nbProcessed++; + + //::SendMessageA(_hParent, WM_SETTEXT, 0, (LPARAM)pTextFind); + targetStart = (*_ppEditView)->searchInTarget(pTextFind, startRange, endRange); + } + delete [] pTextFind; + delete [] pTextReplace; + + if (nbProcessed > 0 && op == ProcessFindAll) + _pFinder->addFileHitCount(nbProcessed); + + return nbProcessed; +} + +void FindReplaceDlg::replaceAllInOpenedDocs() +{ + ::SendMessage(_hParent, WM_REPLACEALL_INOPENEDDOC, 0, 0); +} + +void FindReplaceDlg::findAllIn(InWhat op) +{ + //HANDLE hEvent = ::OpenEvent(EVENT_ALL_ACCESS, FALSE, TEXT("findInFilesEvent")); + if (!_pFinder) + { + _pFinder = new Finder(); + _pFinder->init(_hInst, _hSelf, _ppEditView); + + tTbData data = {0}; + _pFinder->create(&data, false); + ::SendMessage(_hParent, NPPM_MODELESSDIALOG, MODELESSDIALOGREMOVE, (WPARAM)_pFinder->getHSelf()); + // define the default docking behaviour + data.uMask = DWS_DF_CONT_BOTTOM | DWS_ICONTAB | DWS_ADDINFO; + data.hIconTab = (HICON)::LoadImage(_hInst, MAKEINTRESOURCE(IDI_FIND_RESULT_ICON), IMAGE_ICON, 0, 0, LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT); + data.pszAddInfo = _findAllResultStr; + + data.pszModuleName = TEXT("dummy"); + + // the dlgDlg should be the index of funcItem where the current function pointer is + // in this case is DOCKABLE_DEMO_INDEX + data.dlgID = 0; + ::SendMessage(_hParent, NPPM_DMMREGASDCKDLG, 0, (LPARAM)&data); + + _pFinder->_scintView.init(_hInst, _pFinder->getHSelf()); + + // Subclass the ScintillaEditView for the Finder (Scintilla doesn't notify all key presses) + originalFinderProc = SetWindowLong( _pFinder->_scintView.getHSelf(), GWL_WNDPROC, (LONG) finderProc); + + _pFinder->setFinderReadOnly(true); + _pFinder->_scintView.execute(SCI_SETCODEPAGE, SC_CP_UTF8); + _pFinder->_scintView.execute(SCI_USEPOPUP, FALSE); + _pFinder->_scintView.execute(SCI_SETUNDOCOLLECTION, false); //dont store any undo information + _pFinder->_scintView.execute(SCI_SETCARETLINEVISIBLE, 1); + _pFinder->_scintView.execute(SCI_SETCARETWIDTH, 0); + _pFinder->_scintView.showMargin(ScintillaEditView::_SC_MARGE_FOLDER, true); + //_pFinder->_scintView.execute(SCI_SETEOLMODE, SC_EOL_CRLF); // yniq - needed? + + // Send the address of _MarkingsStruct to the lexer + char ptrword[sizeof(void*)*2+1]; + sprintf(ptrword, "%p", &_pFinder->_MarkingsStruct); + _pFinder->_scintView.execute(SCI_SETKEYWORDS, 0, (LPARAM) ptrword); + + // get the width of FindDlg + RECT findRect; + ::GetWindowRect(_pFinder->getHSelf(), &findRect); + + // overwrite some default settings + _pFinder->_scintView.showMargin(ScintillaEditView::_SC_MARGE_SYBOLE, false); + _pFinder->_scintView.setMakerStyle(FOLDER_STYLE_SIMPLE); + + _pFinder->_scintView.display(); + _pFinder->display(); + } + _pFinder->setFinderStyle(); + + ::SendMessage(_pFinder->getHSelf(), WM_SIZE, 0, 0); + + int cmdid = 0; + if (op == ALL_OPEN_DOCS) + cmdid = WM_FINDALL_INOPENEDDOC; + else if (op == FILES_IN_DIR) + cmdid = WM_FINDINFILES; + else if (op == CURRENT_DOC) + cmdid = WM_FINDALL_INCURRENTDOC; + + if (!cmdid) return; + + if (::SendMessage(_hParent, cmdid, 0, 0)) + { + wsprintf(_findAllResultStr, TEXT("%d hits"), _findAllResult); + if (_findAllResult) + { + focusOnFinder(); + } + else + getFocus(); // no hits + } + else // error - search folder doesn't exist + ::SendMessage(_hSelf, WM_NEXTDLGCTL, (WPARAM)::GetDlgItem(_hSelf, IDD_FINDINFILES_DIR_COMBO), TRUE); +} + +void FindReplaceDlg::enableReplaceFunc(bool isEnable) +{ + _currentStatus = isEnable?REPLACE_DLG:FIND_DLG; + int hideOrShow = isEnable?SW_SHOW:SW_HIDE; + RECT *pClosePos = isEnable?&_replaceClosePos:&_findClosePos; + + enableFindInFilesControls(false); + + // replce controls + ::ShowWindow(::GetDlgItem(_hSelf, ID_STATICTEXT_REPLACE),hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDREPLACE),hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDREPLACEWITH),hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDREPLACEALL),hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDREPLACEINSEL),hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_REPLACE_OPENEDFILES),hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_REPLACEINSELECTION),hideOrShow); + + // find controls + ::ShowWindow(::GetDlgItem(_hSelf, IDC_FINDALL_OPENEDFILES), !hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDCCOUNTALL),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_FINDALL_STATIC),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDCMARKALL),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_MARKLINE_CHECK),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_STYLEFOUND_CHECK),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_PURGE_CHECK),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_CLEAR_ALL),!hideOrShow); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_FINDALL_CURRENTFILE),!hideOrShow); + + gotoCorrectTab(); + + ::MoveWindow(::GetDlgItem(_hSelf, IDCANCEL), pClosePos->left, pClosePos->top, pClosePos->right, pClosePos->bottom, TRUE); + + TCHAR label[MAX_PATH]; + _tab.getCurrentTitle(label, MAX_PATH); + ::SetWindowText(_hSelf, label); + + setDefaultButton(IDOK); +} + +void FindReplaceDlg::enableFindInFilesControls(bool isEnable) +{ + // Hide Items + ::ShowWindow(::GetDlgItem(_hSelf, IDWRAP), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDCCOUNTALL), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_FINDALL_OPENEDFILES), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_FINDALL_CURRENTFILE), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDOK), isEnable?SW_HIDE:SW_SHOW); + + ::ShowWindow(::GetDlgItem(_hSelf, IDC_FINDALL_STATIC), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_MARKLINE_CHECK), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_STYLEFOUND_CHECK), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_PURGE_CHECK), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_IN_SELECTION_CHECK), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_CLEAR_ALL), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDCMARKALL), isEnable?SW_HIDE:SW_SHOW); + + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DIR_STATIC), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDDIRECTIONUP), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDDIRECTIONDOWN), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDREPLACE), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_REPLACEINSELECTION), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDREPLACEALL), isEnable?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_REPLACE_OPENEDFILES), isEnable?SW_HIDE:SW_SHOW); + + // Show Items + if (isEnable) + { + ::ShowWindow(::GetDlgItem(_hSelf, ID_STATICTEXT_REPLACE), SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDREPLACEWITH), SW_SHOW); + } + ::ShowWindow(::GetDlgItem(_hSelf, IDD_FINDINFILES_REPLACEINFILES), isEnable?SW_SHOW:SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDD_FINDINFILES_FILTERS_STATIC), isEnable?SW_SHOW:SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDD_FINDINFILES_FILTERS_COMBO), isEnable?SW_SHOW:SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDD_FINDINFILES_DIR_STATIC), isEnable?SW_SHOW:SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDD_FINDINFILES_DIR_COMBO), isEnable?SW_SHOW:SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDD_FINDINFILES_BROWSE_BUTTON), isEnable?SW_SHOW:SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDD_FINDINFILES_FIND_BUTTON), isEnable?SW_SHOW:SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDD_FINDINFILES_GOBACK_BUTTON), isEnable?SW_SHOW:SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDD_FINDINFILES_RECURSIVE_CHECK), isEnable?SW_SHOW:SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDD_FINDINFILES_INHIDDENDIR_CHECK), isEnable?SW_SHOW:SW_HIDE); +} + +void FindReplaceDlg::getPatterns(vector & patternVect) +{ + cutString(_filters.c_str(), patternVect); +} + +void Finder::setFinderStyle() +{ + // Set global styles for the finder + _scintView.performGlobalStyles(); + + // Set current line background color for the finder + const TCHAR * lexerName = ScintillaEditView::langNames[L_SEARCHRESULT].lexerName; + LexerStyler *pStyler = (_scintView._pParameter->getLStylerArray()).getLexerStylerByName(lexerName); + if (pStyler) + { + int i = pStyler->getStylerIndexByID(SCE_SEARCHRESULT_CURRENT_LINE); + if (i != -1) + { + Style & style = pStyler->getStyler(i); + _scintView.execute(SCI_SETCARETLINEBACK, style._bgColor); + } + } + + _scintView.setSearchResultLexer(); + _scintView.execute(SCI_COLOURISE, 0, -1); +} + +BOOL CALLBACK Finder::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_COMMAND : + { + switch (wParam) + { + case NPPM_INTERNAL_SCINTILLAFINFERCOLLAPSE : + { + _scintView.foldAll(fold_collapse); + return TRUE; + } + + case NPPM_INTERNAL_SCINTILLAFINFERUNCOLLAPSE : + { + _scintView.foldAll(fold_uncollapse); + return TRUE; + } + + case NPPM_INTERNAL_SCINTILLAFINFERCOPY : + { + _scintView.execute(SCI_COPY); + return TRUE; + } + + case NPPM_INTERNAL_SCINTILLAFINFERSELECTALL : + { + _scintView.execute(SCI_SELECTALL); + return TRUE; + } + + case NPPM_INTERNAL_SCINTILLAFINFERCLEARALL: + { + removeAll(); + return TRUE; + } + + default : + { + return FALSE; + } + } + } + + case WM_CONTEXTMENU : + { + if (HWND(wParam) == _scintView.getHSelf()) + { + POINT p; + ::GetCursorPos(&p); + ContextMenu scintillaContextmenu; + vector tmp; + tmp.push_back(MenuItemUnit(NPPM_INTERNAL_SCINTILLAFINFERCOLLAPSE, TEXT("Collapse all"))); + tmp.push_back(MenuItemUnit(NPPM_INTERNAL_SCINTILLAFINFERUNCOLLAPSE, TEXT("Uncollapse all"))); + tmp.push_back(MenuItemUnit(0, TEXT("Separator"))); + tmp.push_back(MenuItemUnit(NPPM_INTERNAL_SCINTILLAFINFERCOPY, TEXT("Copy"))); + tmp.push_back(MenuItemUnit(NPPM_INTERNAL_SCINTILLAFINFERSELECTALL, TEXT("Select All"))); + tmp.push_back(MenuItemUnit(NPPM_INTERNAL_SCINTILLAFINFERCLEARALL, TEXT("Clear All"))); + + scintillaContextmenu.create(_hSelf, tmp); + + scintillaContextmenu.display(p); + return TRUE; + } + return ::DefWindowProc(_hSelf, message, wParam, lParam); + } + + case WM_SIZE : + { + RECT rc; + getClientRect(rc); + _scintView.reSizeTo(rc); + break; + } + + case WM_NOTIFY: + { + notify(reinterpret_cast(lParam)); + return FALSE; + } + default : + return DockingDlgInterface::run_dlgProc(message, wParam, lParam); + } + return FALSE; +} + +void FindIncrementDlg::destroy() +{ + if (_pRebar) + { + _pRebar->removeBand(_rbBand.wID); + _pRebar = NULL; + } +} + +void FindIncrementDlg::display(bool toShow) const +{ + if (!_pRebar) + { + Window::display(toShow); + return; + } + if (toShow) + ::SetFocus(::GetDlgItem(_hSelf, IDC_INCFINDTEXT)); + _pRebar->setIDVisible(_rbBand.wID, toShow); +} + +BOOL CALLBACK FindIncrementDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_COMMAND : + { + bool isUnicode = (*(_pFRDlg->_ppEditView))->getCurrentBuffer()->getUnicodeMode() != uni8Bit; + switch (LOWORD(wParam)) + { + case IDCANCEL : + (*(_pFRDlg->_ppEditView))->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_INC); + ::SetFocus((*(_pFRDlg->_ppEditView))->getHSelf()); + + display(false); + return TRUE; + + case IDC_INCFINDPREVOK : + case IDC_INCFINDNXTOK : + { + FindOption fo; + fo._isWholeWord = false; + fo._isMatchCase = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_INCFINDMATCHCASE, BM_GETCHECK, 0, 0)); + if (LOWORD(wParam) == IDC_INCFINDPREVOK) + fo._whichDirection = DIR_UP; + + generic_string str2Search = _pFRDlg->getTextFromCombo(::GetDlgItem(_hSelf, IDC_INCFINDTEXT), isUnicode); + _pFRDlg->processFindNext(str2Search.c_str(), &fo); + } + return TRUE; + + case IDC_INCFINDMATCHCASE: + case IDC_INCFINDTEXT : + case IDC_INCFINDHILITEALL : + { + if (_doSearchFromBegin) + { + FindOption fo; + fo._isWholeWord = false; + fo._isIncremental = true; + fo._isMatchCase = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_INCFINDMATCHCASE, BM_GETCHECK, 0, 0)); + + generic_string str2Search = _pFRDlg->getTextFromCombo(::GetDlgItem(_hSelf, IDC_INCFINDTEXT), isUnicode); + bool isFound = _pFRDlg->processFindNext(str2Search.c_str(), &fo); + if (!isFound) + { + CharacterRange range = (*(_pFRDlg->_ppEditView))->getSelection(); + (*(_pFRDlg->_ppEditView))->execute(SCI_SETSEL, -1, range.cpMin); + } + + bool isHiLieAll = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_INCFINDHILITEALL, BM_GETCHECK, 0, 0)); + if (str2Search == TEXT("")) + isHiLieAll = false; + + markSelectedTextInc(isHiLieAll, &fo); + } + else + _doSearchFromBegin = true; + } + return TRUE; + + } + } + + case WM_ERASEBKGND: + { + HWND hParent = ::GetParent(_hSelf); + HDC winDC = (HDC)wParam; + //RTL handling + POINT pt = {0, 0}, ptOrig = {0, 0}; + ::MapWindowPoints(_hSelf, hParent, &pt, 1); + ::OffsetWindowOrgEx((HDC)wParam, pt.x, pt.y, &ptOrig); + LRESULT lResult = SendMessage(hParent, WM_ERASEBKGND,(WPARAM)winDC, 0); + ::SetWindowOrgEx(winDC, ptOrig.x, ptOrig.y, NULL); + return (BOOL)lResult; + break; + } + + case WM_MOVE: + { + ::InvalidateRect(_hSelf, NULL, TRUE); //when moving, force background redraw + return FALSE; + break; + } + } + return FALSE; +} + +void FindIncrementDlg::markSelectedTextInc(bool enable, FindOption *opt) +{ + (*(_pFRDlg->_ppEditView))->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_INC); + + if (!enable) + return; + + //Get selection + CharacterRange range = (*(_pFRDlg->_ppEditView))->getSelection(); + + //If nothing selected, dont mark anything + if (range.cpMin == range.cpMax) + return; + + TCHAR text2Find[FINDREPLACE_MAXLENGTH]; + (*(_pFRDlg->_ppEditView))->getGenericSelectedText(text2Find, FINDREPLACE_MAXLENGTH, false); //do not expand selection (false) + _pFRDlg->markAllInc(text2Find, opt); +} + +void FindIncrementDlg::addToRebar(ReBar * rebar) { + if(_pRebar) + return; + HWND hRebar = rebar->getHSelf(); + _pRebar = rebar; + RECT client; + getClientRect(client); + + ZeroMemory(&_rbBand, sizeof(REBARBANDINFO)); + _rbBand.cbSize = sizeof(REBARBANDINFO); + _rbBand.fMask = RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | + RBBIM_SIZE | RBBIM_ID; + + _rbBand.fStyle = RBBS_HIDDEN; + _rbBand.hwndChild = getHSelf(); + _rbBand.wID = REBAR_BAR_SEARCH; //ID REBAR_BAR_SEARCH for search dialog + _rbBand.cxMinChild = 0; + _rbBand.cyIntegral = 1; + _rbBand.cyMinChild = _rbBand.cyMaxChild = client.bottom-client.top; + _rbBand.cxIdeal = _rbBand.cx = client.right-client.left; + + _pRebar->addBand(&_rbBand, true); +} diff --git a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.h b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.h new file mode 100644 index 00000000..bb34c13a --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.h @@ -0,0 +1,594 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef FIND_REPLACE_DLG_H +#define FIND_REPLACE_DLG_H + +#include "StaticDialog.h" +#include "FindReplaceDlg_rc.h" +#include "Buffer.h" +#include "ScintillaEditView.h" +#include "StatusBar.h" +#include "DockingDlgInterface.h" + + +#define FIND_RECURSIVE 1 +#define FIND_INHIDDENDIR 2 + +#define FINDREPLACE_MAXLENGTH 2048 + +enum DIALOG_TYPE {FIND_DLG, REPLACE_DLG, FINDINFILES_DLG}; + +#define DIR_DOWN true +#define DIR_UP false + +//#define FIND_REPLACE_STR_MAX 256 + +enum InWhat{ALL_OPEN_DOCS, FILES_IN_DIR, CURRENT_DOC}; + +struct FoundInfo { + FoundInfo(int start, int end, const TCHAR *fullPath) + : _start(start), _end(end), _fullPath(fullPath) {}; + int _start; + int _end; + std::generic_string _fullPath; +}; + +struct TargetRange { + int targetStart; + int targetEnd; +}; + +enum SearchType { FindNormal, FindExtended, FindRegex }; +enum ProcessOperation { ProcessFindAll, ProcessReplaceAll, ProcessCountAll, ProcessMarkAll, ProcessMarkAll_2, ProcessMarkAll_IncSearch, ProcessMarkAllExt }; + +struct FindOption { + bool _isWholeWord; + bool _isMatchCase; + bool _isWrapAround; + bool _whichDirection; + bool _isIncremental; + SearchType _searchType; + FindOption() :_isWholeWord(true), _isMatchCase(true), _searchType(FindNormal),\ + _isWrapAround(true), _whichDirection(DIR_DOWN), _isIncremental(false){}; +}; + +//This class contains generic search functions as static functions for easy access +class Searching { +public: + static int convertExtendedToString(const TCHAR * query, TCHAR * result, int length); + static TargetRange t; + static int buildSearchFlags(FindOption * option) { + return (option->_isWholeWord ? SCFIND_WHOLEWORD : 0) | + (option->_isMatchCase ? SCFIND_MATCHCASE : 0) | + (option->_searchType == FindRegex ? SCFIND_REGEXP|SCFIND_POSIX : 0); + }; + static void displaySectionCentered(int posStart, int posEnd, ScintillaEditView * pEditView, bool isDownwards = true); + +private: + static bool readBase(const TCHAR * str, int * value, int base, int size); + +}; + +//Finder: Dockable window that contains search results +class Finder : public DockingDlgInterface { +friend class FindReplaceDlg; +public: + Finder() : DockingDlgInterface(IDD_FINDRESULT), _pMainFoundInfos(&_foundInfos1), _pMainMarkings(&_markings1) { + _MarkingsStruct._length = 0; + _MarkingsStruct._markings = NULL; + }; + + ~Finder() { + _scintView.destroy(); + } + void init(HINSTANCE hInst, HWND hPere, ScintillaEditView **ppEditView) { + DockingDlgInterface::init(hInst, hPere); + _ppEditView = ppEditView; + }; + + void addSearchLine(const TCHAR *searchName) { + generic_string str = TEXT("Search \""); + str += searchName; + str += TEXT("\"\r\n"); + + setFinderReadOnly(false); + _scintView.addGenericText(str.c_str()); + setFinderReadOnly(true); + _lastSearchHeaderPos = _scintView.execute(SCI_GETCURRENTPOS) - 2; + + _pMainFoundInfos->push_back(EmptyFoundInfo); + _pMainMarkings->push_back(EmptySearchResultMarking); + }; + + void addFileNameTitle(const TCHAR * fileName) { + generic_string str = TEXT(" "); + str += fileName; + str += TEXT("\r\n"); + + setFinderReadOnly(false); + _scintView.addGenericText(str.c_str()); + setFinderReadOnly(true); + _lastFileHeaderPos = _scintView.execute(SCI_GETCURRENTPOS) - 2; + + _pMainFoundInfos->push_back(EmptyFoundInfo); + _pMainMarkings->push_back(EmptySearchResultMarking); + }; + + void addFileHitCount(int count) { + TCHAR text[20]; + wsprintf(text, TEXT(" (%i hits)"), count); + setFinderReadOnly(false); + _scintView.insertGenericTextFrom(_lastFileHeaderPos, text); + setFinderReadOnly(true); + nFoundFiles++; + }; + + void addSearchHitCount(int count) { + TCHAR text[50]; + wsprintf(text, TEXT(" (%i hits in %i files)"), count, nFoundFiles); + setFinderReadOnly(false); + _scintView.insertGenericTextFrom(_lastSearchHeaderPos, text); + setFinderReadOnly(true); + }; + + + void add(FoundInfo fi, SearchResultMarking mi, const TCHAR* foundline, int lineNb) { + _pMainFoundInfos->push_back(fi); + std::generic_string str = TEXT("\tLine "); + + TCHAR lnb[16]; + wsprintf(lnb, TEXT("%d"), lineNb); + str += lnb; + str += TEXT(": "); + mi._start += str.length(); + mi._end += str.length(); + str += foundline; + + if (str.length() >= SC_SEARCHRESULT_LINEBUFFERMAXLENGTH) + { + const TCHAR * endOfLongLine = TEXT("...\r\n"); + str = str.substr(0, SC_SEARCHRESULT_LINEBUFFERMAXLENGTH - lstrlen(endOfLongLine) - 1); + str += endOfLongLine; + } + setFinderReadOnly(false); + _scintView.addGenericText(str.c_str(), &mi._start, &mi._end); + setFinderReadOnly(true); + _pMainMarkings->push_back(mi); + }; + + void setFinderStyle(); + + void removeAll() { + _pMainFoundInfos->clear(); + _pMainMarkings->clear(); + setFinderReadOnly(false); + _scintView.execute(SCI_CLEARALL); + setFinderReadOnly(true); + }; + + void beginNewFilesSearch() { + _scintView.execute(SCI_SETLEXER, SCLEX_NULL); + + _scintView.execute(SCI_SETCURRENTPOS, 0); + _pMainFoundInfos = _pMainFoundInfos == &_foundInfos1 ? &_foundInfos2 : &_foundInfos1; + _pMainMarkings = _pMainMarkings == &_markings1 ? &_markings2 : &_markings1; + nFoundFiles = 0; + + // fold all old searches (1st level only) + _scintView.collapse(searchHeaderLevel - SC_FOLDLEVELBASE, fold_collapse); + }; + + void finishFilesSearch(int count) { + std::vector* _pOldFoundInfos; + std::vector* _pOldMarkings; + _pOldFoundInfos = _pMainFoundInfos == &_foundInfos1 ? &_foundInfos2 : &_foundInfos1; + _pOldMarkings = _pMainMarkings == &_markings1 ? &_markings2 : &_markings1; + + _pOldFoundInfos->insert(_pOldFoundInfos->begin(), _pMainFoundInfos->begin(), _pMainFoundInfos->end()); + _pOldMarkings->insert(_pOldMarkings->begin(), _pMainMarkings->begin(), _pMainMarkings->end()); + _pMainFoundInfos->clear(); + _pMainMarkings->clear(); + _pMainFoundInfos = _pOldFoundInfos; + _pMainMarkings = _pOldMarkings; + + _MarkingsStruct._length = _pMainMarkings->size(); + _MarkingsStruct._markings = &((*_pMainMarkings)[0]); + + addSearchHitCount(count); + _scintView.execute(SCI_SETSEL, 0, 0); + + _scintView.execute(SCI_SETLEXER, SCLEX_SEARCHRESULT); + }; + + + void gotoNextFoundResult(int direction); + void GotoFoundLine(); + void DeleteResult(); + +protected : + virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + bool notify(SCNotification *notification); + +private: + + enum { searchHeaderLevel = SC_FOLDLEVELBASE + 1, fileHeaderLevel, resultLevel }; + + ScintillaEditView **_ppEditView; + std::vector _foundInfos1; + std::vector _foundInfos2; + std::vector* _pMainFoundInfos; + std::vector _markings1; + std::vector _markings2; + std::vector* _pMainMarkings; + SearchResultMarkings _MarkingsStruct; + + ScintillaEditView _scintView; + unsigned int nFoundFiles; + + int _lastFileHeaderPos; + int _lastSearchHeaderPos; + + void setFinderReadOnly(bool isReadOnly) { + _scintView.execute(SCI_SETREADONLY, isReadOnly); + }; + + static FoundInfo EmptyFoundInfo; + static SearchResultMarking EmptySearchResultMarking; +}; + +//FindReplaceDialog: standard find/replace window +class FindReplaceDlg : public StaticDialog +{ +friend class FindIncrementDlg; +public : + FindReplaceDlg() : StaticDialog(), _pFinder(NULL), _isRTL(false), _isRecursive(true),_isInHiddenDir(false),\ + _fileNameLenMax(1024) { + _uniFileName = new char[(_fileNameLenMax + 3) * 2]; + _winVer = (NppParameters::getInstance())->getWinVersion(); + }; + ~FindReplaceDlg() { + _tab.destroy(); + if (_pFinder) + delete _pFinder; + delete [] _uniFileName; + }; + + void init(HINSTANCE hInst, HWND hPere, ScintillaEditView **ppEditView) { + Window::init(hInst, hPere); + if (!ppEditView) + throw int(9900); + _ppEditView = ppEditView; + }; + + virtual void create(int dialogID, bool isRTL = false); + + void initOptionsFromDlg() { + _options._isWholeWord = isCheckedOrNot(IDWHOLEWORD); + _options._isMatchCase = isCheckedOrNot(IDMATCHCASE); + _options._searchType = isCheckedOrNot(IDREGEXP)?FindRegex:isCheckedOrNot(IDEXTENDED)?FindExtended:FindNormal; + _options._isWrapAround = isCheckedOrNot(IDWRAP); + _isInSelection = isCheckedOrNot(IDC_IN_SELECTION_CHECK); + + // Set Direction : Down by default + _options._whichDirection = DIR_DOWN; + ::SendMessage(::GetDlgItem(_hSelf, IDDIRECTIONDOWN), BM_SETCHECK, BST_CHECKED, 0); + + _doPurge = isCheckedOrNot(IDC_PURGE_CHECK); + _doMarkLine = isCheckedOrNot(IDC_MARKLINE_CHECK); + _doStyleFoundToken = isCheckedOrNot(IDC_STYLEFOUND_CHECK); + + ::EnableWindow(::GetDlgItem(_hSelf, IDCMARKALL), (_doMarkLine || _doStyleFoundToken)); + }; + + void doDialog(DIALOG_TYPE whichType, bool isRTL = false) { + if (!isCreated()) + { + create(IDD_FIND_REPLACE_DLG, isRTL); + _isRTL = isRTL; + } + + if (whichType == FINDINFILES_DLG) + enableFindInFilesFunc(); + else + enableReplaceFunc(whichType == REPLACE_DLG); + + ::SetFocus(::GetDlgItem(_hSelf, IDFINDWHAT)); + display(); + }; + bool processFindNext(const TCHAR *txt2find, FindOption *options = NULL); + bool processReplace(const TCHAR *txt2find, const TCHAR *txt2replace, FindOption *options = NULL); + + int markAll(const TCHAR *txt2find, int styleID); + int markAll2(const TCHAR *str2find); + int markAllInc(const TCHAR *str2find, FindOption *opt); + + + int processAll(ProcessOperation op, const TCHAR *txt2find, const TCHAR *txt2replace, bool isEntire = false, const TCHAR *fileName = NULL, FindOption *opt = NULL, int colourStyleID = -1); + int processRange(ProcessOperation op, const TCHAR *txt2find, const TCHAR *txt2replace, int startRange, int endRange, const TCHAR *fileName = NULL, FindOption *opt = NULL, int colourStyleID = -1); + void replaceAllInOpenedDocs(); + void findAllIn(InWhat op); + + void setSearchText(TCHAR * txt2find) { + HWND hCombo = ::GetDlgItem(_hSelf, IDFINDWHAT); + if (txt2find && txt2find[0]) + { + // We got a valid search string + ::SendMessage(hCombo, CB_SETCURSEL, -1, 0); // remove selection - to allow using down arrow to get to last searched word + ::SetDlgItemText(_hSelf, IDFINDWHAT, txt2find); + } + ::SendMessage(hCombo, CB_SETEDITSEL, 0, MAKELPARAM(0, -1)); // select all text - fast edit + } + void gotoNextFoundResult(int direction = 0) {if (_pFinder) _pFinder->gotoNextFoundResult(direction);}; + + void putFindResult(int result) { + _findAllResult = result; + }; + const TCHAR * getDir2Search() const {return _directory.c_str();}; + + void getPatterns(vector & patternVect); + + void launchFindInFilesDlg() { + doDialog(FINDINFILES_DLG); + }; + + void setFindInFilesDirFilter(const TCHAR *dir, const TCHAR *filters) { + if (dir) + { + _directory = dir; + ::SetDlgItemText(_hSelf, IDD_FINDINFILES_DIR_COMBO, dir); + } + if (filters) + { + _filters = filters; + ::SetDlgItemText(_hSelf, IDD_FINDINFILES_FILTERS_COMBO, filters); + } + }; + + generic_string getText2search() const { + return getTextFromCombo(::GetDlgItem(_hSelf, IDFINDWHAT)); + }; + + const generic_string & getFilters() const {return _filters;}; + const generic_string & getDirectory() const {return _directory;}; + const FindOption & getCurrentOptions() const {return _options;}; + bool isRecursive() const { return _isRecursive; }; + bool isInHiddenDir() const { return _isInHiddenDir; }; + void saveFindHistory(); + void changeTabName(DIALOG_TYPE index, const TCHAR *name2change) { + TCITEM tie; + tie.mask = TCIF_TEXT; + tie.pszText = (TCHAR *)name2change; + TabCtrl_SetItem(_tab.getHSelf(), index, &tie); + } + void beginNewFilesSearch() + { + _pFinder->beginNewFilesSearch(); + bool isUnicode = (*_ppEditView)->getCurrentBuffer()->getUnicodeMode() != uni8Bit; + _pFinder->addSearchLine(getText2search().c_str()); + } + + void finishFilesSearch(int count) + { + _pFinder->finishFilesSearch(count); + } + + void focusOnFinder() { + // Show finder and set focus + if (_pFinder) + { + ::SendMessage(_hParent, NPPM_DMMSHOW, 0, (LPARAM)_pFinder->getHSelf()); + _pFinder->_scintView.getFocus(); + } + }; + + HWND getHFindResults() { + if (_pFinder) + return _pFinder->_scintView.getHSelf(); + return NULL; + } + + void updateFinderScintilla() { + if (_pFinder && _pFinder->isCreated() && _pFinder->isVisible()) + { + _pFinder->setFinderStyle(); + } + }; + +protected : + virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + void addText2Combo(const TCHAR * txt2add, HWND comboID, bool isUTF8 = false); + generic_string getTextFromCombo(HWND hCombo, bool isUnicode = false) const; + static LONG originalFinderProc; + + // Window procedure for the finder + static LRESULT FAR PASCAL finderProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) + { + if (message == WM_KEYDOWN && (wParam == VK_DELETE || wParam == VK_RETURN)) + { + ScintillaEditView *pScint = (ScintillaEditView *)(::GetWindowLongPtr(hwnd, GWL_USERDATA)); + Finder *pFinder = (Finder *)(::GetWindowLongPtr(pScint->getHParent(), GWL_USERDATA)); + if (wParam == VK_RETURN) + pFinder->GotoFoundLine(); + else // VK_DELETE + pFinder->DeleteResult(); + return 0; + } + else + // Call default (original) window procedure + return CallWindowProc((WNDPROC) originalFinderProc, hwnd, message, wParam, lParam); + } + +private : + DIALOG_TYPE _currentStatus; + FindOption _options; + + bool _doPurge; + bool _doMarkLine; + bool _doStyleFoundToken; + bool _isInSelection; + + + RECT _findClosePos, _replaceClosePos, _findInFilesClosePos; + + ScintillaEditView **_ppEditView; + Finder *_pFinder; + bool _isRTL; + + int _findAllResult; + TCHAR _findAllResultStr[1024]; + + generic_string _filters; + generic_string _directory; + bool _isRecursive; + bool _isInHiddenDir; + + int _fileNameLenMax; + char *_uniFileName; + + TabBar _tab; + winVer _winVer; + + void enableReplaceFunc(bool isEnable); + void enableFindInFilesControls(bool isEnable = true); + void enableFindInFilesFunc() { + enableFindInFilesControls(); + + _currentStatus = FINDINFILES_DLG; + gotoCorrectTab(); + ::MoveWindow(::GetDlgItem(_hSelf, IDCANCEL), _findInFilesClosePos.left, _findInFilesClosePos.top, _findInFilesClosePos.right, _findInFilesClosePos.bottom, TRUE); + + TCHAR label[MAX_PATH]; + _tab.getCurrentTitle(label, MAX_PATH); + ::SetWindowText(_hSelf, label); + + setDefaultButton(IDD_FINDINFILES_FIND_BUTTON); + }; + + ////////////////// + + void setDefaultButton(int nID) + { +#if 0 + // There is a problem when you: + // 1. open the find dialog + // 2. press the "close" buttom + // 3. open it again + // 4. search for a non existing text + // 5. when the "Can't find the text:" messagebox appears, hit "OK" + // 6. now, the "Close" button looks like the default button. (but it only looks like that) + // if you hit "Enter" the "Find" button will be "pressed". + // I thought this code might fix this but it doesn't + // See: http://msdn.microsoft.com/en-us/library/ms645413(VS.85).aspx + + HWND pButton; + DWORD dwDefInfo = SendMessage(_hSelf, DM_GETDEFID, 0, 0L); + if (HIWORD(dwDefInfo) == DC_HASDEFID && (int)LOWORD(dwDefInfo) != nID) + { + // Reset 'DefButton' style + pButton = GetDlgItem(_hSelf, (int)LOWORD(dwDefInfo)); + if (pButton) + SendMessage(pButton, BM_SETSTYLE, LOWORD(BS_PUSHBUTTON | BS_RIGHT ), MAKELPARAM(TRUE, 0)); + } + + SendMessage(_hSelf, DM_SETDEFID, (WPARAM)nID, 0L); + pButton = GetDlgItem(_hSelf, nID); + if (pButton) + { + SendMessage(pButton, BM_SETSTYLE, LOWORD(BS_DEFPUSHBUTTON), MAKELPARAM(TRUE, 0)); + } +#endif + SendMessage(_hSelf, DM_SETDEFID, (WPARAM)nID, 0L); + } + //////////////////////// + + void gotoCorrectTab() { + int currentIndex = _tab.getCurrentTabIndex(); + if (currentIndex != _currentStatus) + _tab.activateAt(_currentStatus); + }; + + bool isCheckedOrNot(int checkControlID) const { + return (BST_CHECKED == ::SendMessage(::GetDlgItem(_hSelf, checkControlID), BM_GETCHECK, 0, 0)); + }; + + void updateCombos(); + void updateCombo(int comboID) { + bool isUnicode = (*_ppEditView)->getCurrentBuffer()->getUnicodeMode() != uni8Bit; + HWND hCombo = ::GetDlgItem(_hSelf, comboID); + addText2Combo(getTextFromCombo(hCombo, isUnicode).c_str(), hCombo, isUnicode); + }; + void fillFindHistory(); + void fillComboHistory(int id, int count, generic_string **pStrings); + void saveComboHistory(int id, int maxcount, int& oldcount, generic_string **pStrings); +}; + +//FindIncrementDlg: incremental search dialog, docked in rebar +class FindIncrementDlg : public StaticDialog +{ +public : + FindIncrementDlg() : _pFRDlg(NULL), _pRebar(NULL) {}; + void init(HINSTANCE hInst, HWND hPere, FindReplaceDlg *pFRDlg, bool isRTL = false) { + Window::init(hInst, hPere); + if (!pFRDlg) + throw int(9910); + _pFRDlg = pFRDlg; + create(IDD_INCREMENT_FIND, isRTL); + _isRTL = isRTL; + }; + virtual void destroy(); + virtual void display(bool toShow = true) const; + + void setSearchText(const TCHAR * txt2find, bool isUTF8 = false) { + _doSearchFromBegin = false; +#ifdef UNICODE + ::SendDlgItemMessage(_hSelf, IDC_INCFINDTEXT, WM_SETTEXT, 0, (LPARAM)txt2find); +#else + if (!isUTF8) + { + ::SendDlgItemMessage(_hSelf, IDC_INCFINDTEXT, WM_SETTEXT, 0, (LPARAM)txt2find); + return; + } + const int wideBufferSize = 256; + WCHAR wchars[wideBufferSize]; + ::MultiByteToWideChar(CP_UTF8, 0, txt2find, -1, wchars, wideBufferSize); + winVer winVersion = NppParameters::getInstance()->getWinVersion(); + if (winVersion <= WV_ME) { + //Cannot simply take txt2find since its UTF8 + char ansiBuffer[wideBufferSize]; //Assuming no more than 2 bytes for each wchar (SBCS or DBCS, no UTF8 and sorts) + ::WideCharToMultiByte(CP_ACP, 0, wchars, -1, ansiBuffer, wideBufferSize, NULL, NULL); + ::SendDlgItemMessageA(_hSelf, IDC_INCFINDTEXT, WM_SETTEXT, 0, (LPARAM)ansiBuffer); + } else { + ::SendDlgItemMessageW(_hSelf, IDC_INCFINDTEXT, WM_SETTEXT, 0, (LPARAM)wchars); + } +#endif + } + + void addToRebar(ReBar * rebar); +private : + bool _isRTL; + FindReplaceDlg *_pFRDlg; + + ReBar * _pRebar; + REBARBANDINFO _rbBand; + + bool _doSearchFromBegin; + virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + void markSelectedTextInc(bool enable, FindOption *opt = NULL); +}; + +#endif //FIND_REPLACE_DLG_H diff --git a/PowerEditor/src/ScitillaComponent/FindReplaceDlg.rc b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.rc new file mode 100644 index 00000000..fbcb5d15 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/FindReplaceDlg.rc @@ -0,0 +1,100 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#ifndef FIND_REPLACE_DLG_RC +#define FIND_REPLACE_DLG_RC +#include +#include "FindReplaceDlg_rc.h" + +IDD_FIND_REPLACE_DLG DIALOGEX 36, 44, 317, 182 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_TOOLWINDOW +CAPTION "Replace" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + RTEXT "&Find what :",IDFINDWHAT_STATIC,6,22,75,8 + COMBOBOX IDFINDWHAT,83,20,125,150,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_TABSTOP + RTEXT "Rep&lace with :",ID_STATICTEXT_REPLACE,6,40,75,8 + COMBOBOX IDREPLACEWITH,83,38,125,50,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_TABSTOP + CONTROL "&Mark Line",IDC_MARKLINE_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13,40,88,10 + CONTROL "Style found to&ken",IDC_STYLEFOUND_CHECK,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,13,52,100,15 + GROUPBOX "",IDC_FINDALL_STATIC,6,31,204,54 + CONTROL "Purge for each search",IDC_PURGE_CHECK,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,13,66,99,16 + PUSHBUTTON "Find &All",IDCMARKALL,146,38,59,14 + GROUPBOX "",IDC_REPLACEINSELECTION,141,50,170,23 + CONTROL "In select&ion",IDC_IN_SELECTION_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,146,58,59,10 + PUSHBUTTON "Clear",IDC_CLEAR_ALL,146,71,59,11 + RTEXT "Filter&s :",IDD_FINDINFILES_FILTERS_STATIC,27,58,53,8 + COMBOBOX IDD_FINDINFILES_FILTERS_COMBO,83,56,125,150,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_TABSTOP + RTEXT "Dir&ectory :",IDD_FINDINFILES_DIR_STATIC,7,76,40,8 + COMBOBOX IDD_FINDINFILES_DIR_COMBO,49,74,141,150,CBS_DROPDOWN | CBS_AUTOHSCROLL | WS_TABSTOP + PUSHBUTTON "...",IDD_FINDINFILES_BROWSE_BUTTON,193,74,15,13 + CONTROL "In all su&b-folders",IDD_FINDINFILES_RECURSIVE_CHECK, "Button", BS_AUTOCHECKBOX | WS_TABSTOP,218,73,94,15 + CONTROL "In &hidden folders",IDD_FINDINFILES_INHIDDENDIR_CHECK, "Button", BS_AUTOCHECKBOX | WS_TABSTOP,218,87,94,15 + CONTROL "Match &whole word only",IDWHOLEWORD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,88,140,15 + CONTROL "Match &case",IDMATCHCASE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,100,140,15 + CONTROL "Wra&p around",IDWRAP,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,6,112,110,15 + GROUPBOX "Search mode",IDC_MODE_STATIC,6,126,138,48 + CONTROL "&Normal",IDNORMAL,"Button",BS_AUTORADIOBUTTON | WS_GROUP,12,138,126,10 + CONTROL "E&xtended (\\n, \\r, \\t, \\0, \\x...)",IDEXTENDED, "Button",BS_AUTORADIOBUTTON,12,150,126,10 + CONTROL "Re&gular expression",IDREGEXP,"Button",BS_AUTORADIOBUTTON,12,162,126,10 + CONTROL "&Up",IDDIRECTIONUP,"Button",BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,155,138,45,12 + CONTROL "&Down",IDDIRECTIONDOWN,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,155,150,45,12 + GROUPBOX "Direction",IDC_DIR_STATIC,150,126,60,48,WS_GROUP + PUSHBUTTON "Find Next",IDOK,217,20,90,14,WS_GROUP + PUSHBUTTON "Coun&t",IDCCOUNTALL,217,38,90,14 + PUSHBUTTON "Find all in all &opened documents",IDC_FINDALL_OPENEDFILES,217,56,90,21,BS_MULTILINE + PUSHBUTTON "Find all in current document",IDC_FINDALL_CURRENTFILE,217,80,90,21,BS_MULTILINE + PUSHBUTTON "&Replace",IDREPLACE,217,38,90,14 + PUSHBUTTON "Replace &All",IDREPLACEALL,217,56,90,14 + PUSHBUTTON "Replace all in all &opened documents",IDC_REPLACE_OPENEDFILES,217,74,90,21,BS_MULTILINE + PUSHBUTTON "Find All",IDD_FINDINFILES_FIND_BUTTON,217,20,90,14,WS_GROUP + PUSHBUTTON "&Replace in files",IDD_FINDINFILES_REPLACEINFILES,217,38,90,14 + PUSHBUTTON "Close",IDCANCEL,217,98,90,14 + GROUPBOX "",IDC_TRANSPARENT_GRPBOX,222,126,85,48 + CONTROL "Transparenc&y",IDC_TRANSPARENT_CHECK,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,218,126,80,10 + CONTROL "On lose focus",IDC_TRANSPARENT_LOSSFOCUS_RADIO,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,232,138,70,10 + CONTROL "Always",IDC_TRANSPARENT_ALWAYS_RADIO,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,232,150,70,10 + CONTROL "",IDC_PERCENTAGE_SLIDER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | NOT WS_VISIBLE | WS_TABSTOP,235,161,53,10 +END + +IDD_INCREMENT_FIND DIALOGEX 0, 0, 400, 20 +STYLE DS_SYSMODAL | DS_CONTROL | DS_FIXEDSYS | WS_CHILD | WS_CLIPCHILDREN +//EXSTYLE WS_EX_TRANSPARENT +FONT 8, TEXT("MS Shell Dlg") +BEGIN + PUSHBUTTON "X",IDCANCEL,2,3,16,14 + RTEXT "Find :",IDC_INCSTATIC,20,6,25,12 + EDITTEXT IDC_INCFINDTEXT,45,4,175,12,ES_AUTOHSCROLL | ES_WANTRETURN | NOT WS_BORDER,WS_EX_STATICEDGE + PUSHBUTTON "<",IDC_INCFINDPREVOK,223,3,16,14 + DEFPUSHBUTTON ">",IDC_INCFINDNXTOK,243,3,16,14 + CONTROL "Highlight all", IDC_INCFINDHILITEALL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,270,5,65,12 + CONTROL "Match case", IDC_INCFINDMATCHCASE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,335,5,60,12 +END + +IDD_FINDRESULT DIALOGEX 26, 41, 223, 67 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE +CAPTION "Find result" +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x0 +BEGIN +DEFPUSHBUTTON ">",IDC_INCFINDNXTOK,243,0,16,14, NOT WS_VISIBLE +END + +#endif //FIND_REPLACE_DLG_RC diff --git a/PowerEditor/src/ScitillaComponent/FindReplaceDlg_rc.h b/PowerEditor/src/ScitillaComponent/FindReplaceDlg_rc.h new file mode 100644 index 00000000..6c93f6a9 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/FindReplaceDlg_rc.h @@ -0,0 +1,74 @@ + + +#define IDD_FIND_REPLACE_DLG 1600 +#define IDFINDWHAT 1601 +#define IDREPLACEWITH 1602 +#define IDWHOLEWORD 1603 +#define IDMATCHCASE 1604 + +#define IDC_MODE_STATIC 1624 +#define IDNORMAL 1625 +#define IDEXTENDED 1626 + +#define IDREGEXP 1605 + +#define IDWRAP 1606 +#define IDUNSLASH 1607 +#define IDREPLACE 1608 +#define IDREPLACEALL 1609 +#define IDREPLACEINSEL 1610 +#define ID_STATICTEXT_REPLACE 1611 +#define IDDIRECTIONUP 1612 +#define IDDIRECTIONDOWN 1613 +#define IDCCOUNTALL 1614 +#define IDCMARKALL 1615 +#define IDC_MARKLINE_CHECK 1616 +#define IDC_STYLEFOUND_CHECK 1617 +#define IDC_PURGE_CHECK 1618 +#define IDC_FINDALL_STATIC 1619 +#define IDFINDWHAT_STATIC 1620 +#define IDC_DIR_STATIC 1621 + +#define IDC_PERCENTAGE_SLIDER 1622 +#define IDC_TRANSPARENT_GRPBOX 1623 + +#define IDC_FIND_IN_STATIC 1628 +//#define IDC_CURRENT_FILE_RADIO 1629 +//#define IDC_OPENED_FILES_RADIO 1630 +//#define IDC_FILES_RADIO 1631 +#define IDC_IN_SELECTION_CHECK 1632 +#define IDC_CLEAR_ALL 1633 +#define IDC_REPLACEINSELECTION 1634 +#define IDC_REPLACE_OPENEDFILES 1635 +#define IDC_FINDALL_OPENEDFILES 1636 +//#define IDC_FINDINFILES 1637 +#define IDC_FINDINFILES_LAUNCH 1638 +#define IDC_GETCURRENTDOCTYPE 1639 +#define IDC_FINDALL_CURRENTFILE 1641 +//#define IDSWITCH 1640 + +#define IDD_FINDINFILES_DLG 1650 +#define IDD_FINDINFILES_BROWSE_BUTTON 1651 +#define IDD_FINDINFILES_FILTERS_COMBO 1652 +#define IDD_FINDINFILES_DIR_COMBO 1653 +#define IDD_FINDINFILES_FILTERS_STATIC 1654 +#define IDD_FINDINFILES_DIR_STATIC 1655 +#define IDD_FINDINFILES_FIND_BUTTON 1656 +#define IDD_FINDINFILES_GOBACK_BUTTON 1657 +#define IDD_FINDINFILES_RECURSIVE_CHECK 1658 +#define IDD_FINDINFILES_INHIDDENDIR_CHECK 1659 +#define IDD_FINDINFILES_REPLACEINFILES 1660 + +#define IDD_FINDRESULT 1670 + +#define IDD_INCREMENT_FIND 1680 +#define IDC_INCSTATIC 1681 +#define IDC_INCFINDTEXT 1682 +#define IDC_INCFINDPREVOK 1683 +#define IDC_INCFINDNXTOK 1684 +#define IDC_INCFINDMATCHCASE 1685 +#define IDC_INCFINDHILITEALL 1686 + +#define IDC_TRANSPARENT_CHECK 1686 +#define IDC_TRANSPARENT_LOSSFOCUS_RADIO 1687 +#define IDC_TRANSPARENT_ALWAYS_RADIO 1688 diff --git a/PowerEditor/src/ScitillaComponent/FunctionCallTip.cpp b/PowerEditor/src/ScitillaComponent/FunctionCallTip.cpp new file mode 100644 index 00000000..9f6c4aee --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/FunctionCallTip.cpp @@ -0,0 +1,416 @@ +//this file is part of Notepad++ +//Copyright (C)2008 Harry Bruin +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "FunctionCallTip.h" + + +struct Token { + TCHAR * token; + int length; + bool isIdentifier; + Token(TCHAR * tok, int len, bool isID) : token(tok), length(len), isIdentifier(isID) {}; +}; + +struct FunctionValues { + int lastIdentifier; + int lastFunctionIdentifier; + int param; + int scopeLevel; + FunctionValues() : lastIdentifier(-1), lastFunctionIdentifier(-1), param(0), scopeLevel(-1) {}; +}; + +inline bool lower(TCHAR c) { + return (c >= 'a' && c <= 'z'); +} + +inline bool match(TCHAR c1, TCHAR c2) { + if (c1 == c2) return true; + if (lower(c1)) + return ((c1-32) == c2); + if (lower(c2)) + return ((c2-32) == c1); + return false; +} + +//test string case insensitive ala Scintilla +//0 if equal, <0 of before, >0 if after (name1 that is) +int testNameNoCase(const TCHAR * name1, const TCHAR * name2, int len = -1) { + if (len == -1) { + len = 1024; //magic value, but it probably fails way before it reaches this + } + int i = 0; + while(match(name1[i], name2[i])) { + if (name1[i] == 0 || i == len) { + return 0; //equal + } + i++; + } + + int subs1 = lower(name1[i])?32:0; + int subs2 = lower(name2[i])?32:0; + + return ( (name1[i]-subs1) - (name2[i]-subs2) ); +} + +void FunctionCallTip::setLanguageXML(TiXmlElement * pXmlKeyword) { + if (isVisible()) + close(); + _pXmlKeyword = pXmlKeyword; +} + +bool FunctionCallTip::updateCalltip(int ch, bool needShown) { + if (!needShown && ch != _start && !isVisible()) //must be already visible + return false; + + _curPos = _pEditView->execute(SCI_GETCURRENTPOS); + + //recalculate everything + if (!getCursorFunction()) { //cannot display calltip (anymore) + close(); + return false; + } + showCalltip(); + return true; +} + +void FunctionCallTip::showNextOverload() { + if (!isVisible()) + return; + _currentOverload = (_currentOverload+1) % _currentNrOverloads; + showCalltip(); +} + +void FunctionCallTip::showPrevOverload() { + if (!isVisible()) + return; + _currentOverload = _currentOverload > 0?(_currentOverload-1) : _currentNrOverloads-1; + showCalltip(); +} + +void FunctionCallTip::close() { + if (!isVisible()) { + return; + } + + _pEditView->execute(SCI_CALLTIPCANCEL); + _currentOverload = 0; +} + +bool FunctionCallTip::getCursorFunction() { + int line = _pEditView->execute(SCI_LINEFROMPOSITION, _curPos); + int startpos = _pEditView->execute(SCI_POSITIONFROMLINE, line); + int endpos = _pEditView->execute(SCI_GETLINEENDPOSITION, line); + int len = endpos - startpos + 3; //also take CRLF in account, even if not there + int offset = _curPos - startpos; //offset is cursor location, only stuff before cursor has influence + const int maxLen = 128; + + if ((offset < 2) || (len >= maxLen)) + { + reset(); + return false; //cannot be a func, need name and separator + } + + TCHAR lineData[maxLen] = TEXT(""); + + _pEditView->getLine(line, lineData, len); + + //line aquired, find the functionname + //first split line into tokens to parse + //token is identifier or some expression, whitespace is ignored + std::vector< Token > tokenVector; + int tokenLen = 0; + TCHAR ch; + for (int i = 0; i < offset; i++) { //we dont care about stuff after the offset + //tokenVector.push_back(pair(lineData+i, len)); + ch = lineData[i]; + if (ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9' || ch == '_') { //part of identifier + tokenLen = 0; + TCHAR * begin = lineData+i; + while ( (ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9' || ch == '_') && i < offset) { + tokenLen++; + i++; + ch = lineData[i]; + } + tokenVector.push_back(Token(begin, tokenLen, true)); + i--; //correct overshooting of while loop + } else { + if (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') { //whitespace + //do nothing + } else { + tokenLen = 1; + tokenVector.push_back(Token(lineData+i, tokenLen, false)); + } + } + } + + size_t vsize = tokenVector.size(); + //mind nested funcs, like |blblb a (x, b(), c);| + //therefore, use stack + std::vector valueVec; + + FunctionValues curValue, newValue; + int scopeLevel = 0; + for (size_t i = 0; i < vsize; i++) { + Token & curToken = tokenVector.at(i); + if (curToken.isIdentifier) { + curValue.lastIdentifier = i; + } else { + if (curToken.token[0] == _start) { + scopeLevel++; + newValue = curValue; + valueVec.push_back(newValue); //store the current settings, so when this new function doesnt happen to be the 'real' one, we can restore everything + + curValue.scopeLevel = scopeLevel; + if (i > 0 && curValue.lastIdentifier == i-1) { //identifier must be right before (, else we have some expression like "( x + y() )" + curValue.lastFunctionIdentifier = curValue.lastIdentifier; + curValue.param = 0; + } else { //some expression + curValue.lastFunctionIdentifier = -1; + } + } else if (curToken.token[0] == _param && curValue.lastFunctionIdentifier > -1) { + curValue.param++; + } else if (curToken.token[0] == _stop) { + if (scopeLevel) //scope cannot go below -1 + scopeLevel--; + if (valueVec.size() > 0) { //only pop level if scope was of actual function + curValue = valueVec.back(); + valueVec.pop_back(); + } else { + //invalidate curValue + curValue = FunctionValues(); + } + } else if (curToken.token[0] == _terminal) { + //invalidate everything + valueVec.clear(); + curValue = FunctionValues(); + } + } + } + + bool res = false; + + if (curValue.lastFunctionIdentifier == -1) { //not in direct function. Start popping the stack untill we empty it, or a func IS found + while(curValue.lastFunctionIdentifier == -1 && valueVec.size() > 0) { + curValue = valueVec.back(); + valueVec.pop_back(); + } + } + if (curValue.lastFunctionIdentifier > -1) { + Token funcToken = tokenVector.at(curValue.lastFunctionIdentifier); + funcToken.token[funcToken.length] = 0; + _currentParam = curValue.param; + + bool same = false; + if (_funcName) { + if(_ignoreCase) + same = testNameNoCase(_funcName, funcToken.token, lstrlen(_funcName)) == 0; + else + same = generic_strncmp(_funcName, funcToken.token, lstrlen(_funcName)) == 0; + } + if (!same) { //check if we need to reload data + if (_funcName) { + delete [] _funcName; + } + _funcName = new TCHAR[funcToken.length+1]; + lstrcpy(_funcName, funcToken.token); + res = loadFunction(); + } else { + res = true; + } + } + return res; +} + +/* +Find function in XML structure and parse it +*/ +bool FunctionCallTip::loadFunction() { + reset(); //set everything back to 0 + //The functions should be ordered, but linear search because we cant access like array + _curFunction = NULL; + //Iterate through all keywords and find the correct function keyword + TiXmlElement *funcNode = _pXmlKeyword; + const TCHAR * name = NULL; + for (; funcNode; funcNode = funcNode->NextSiblingElement(TEXT("KeyWord")) ) { + name = funcNode->Attribute(TEXT("name")); + if (!name) //malformed node + continue; + int compVal = 0; + if (_ignoreCase) + compVal = testNameNoCase(name, _funcName); //lstrcmpi doesnt work in this case + else + compVal = lstrcmp(name, _funcName); + if (!compVal) { //found it? + const TCHAR * val = funcNode->Attribute(TEXT("func")); + if (val) + { + if (!lstrcmp(val, TEXT("yes"))) { + //what we've been looking for + _curFunction = funcNode; + break; + } else { + //name matches, but not a function, abort the entire procedure + return false; + } + } + } else if (compVal > 0) { //too far, abort + return false; + } + } + + //Nothing found + if (!_curFunction) + return false; + + stringVec paramVec; + + TiXmlElement *overloadNode = _curFunction->FirstChildElement(TEXT("Overload")); + TiXmlElement *paramNode = NULL; + for (; overloadNode ; overloadNode = overloadNode->NextSiblingElement(TEXT("Overload")) ) { + const TCHAR * retVal = overloadNode->Attribute(TEXT("retVal")); + if (!retVal) + continue; //malformed node + _retVals.push_back(retVal); + + const TCHAR * description = overloadNode->Attribute(TEXT("descr")); + if (description) + _descriptions.push_back(description); + else + _descriptions.push_back(TEXT("")); //"no description available" + + paramNode = overloadNode->FirstChildElement(TEXT("Param")); + for (; paramNode ; paramNode = paramNode->NextSiblingElement(TEXT("Param")) ) { + const TCHAR * param = paramNode->Attribute(TEXT("name")); + if (!param) + continue; //malformed node + paramVec.push_back(param); + } + _overloads.push_back(paramVec); + paramVec.clear(); + + _currentNrOverloads++; + } + + _currentNrOverloads = (int)_overloads.size(); + + if (_currentNrOverloads == 0) //malformed node + return false; + + return true; +} + +void FunctionCallTip::showCalltip() { + if (_currentNrOverloads == 0) { + //ASSERT + return; + } + + //Check if the current overload still holds. If the current param exceeds amounti n overload, see if another one fits better (enough params) + stringVec & params = _overloads.at(_currentOverload); + size_t psize = params.size()+1, osize; + if ((size_t)_currentParam >= psize) { + osize = _overloads.size(); + for(size_t i = 0; i < osize; i++) { + psize = _overloads.at(i).size()+1; + if ((size_t)_currentParam < psize) { + _currentOverload = i; + break; + } + } + } + const TCHAR * curRetValText = _retVals.at(_currentOverload); + const TCHAR * curDescriptionText = _descriptions.at(_currentOverload); + bool hasDescr = true; + if (!curDescriptionText[0]) + hasDescr = false; + + int bytesNeeded = lstrlen(curRetValText) + lstrlen(_funcName) + 5;//'retval funcName (params)\0' + if (hasDescr) + bytesNeeded += lstrlen(curDescriptionText); + + size_t nrParams = params.size(); + for(size_t i = 0; i < nrParams; i++) { + bytesNeeded += lstrlen(params.at(i)) + 2; //'param, ' + } + + if (_currentNrOverloads > 1) { + bytesNeeded += 24; // /\00001 of 00003\/ + } + + const int maxLen = 512; + if (bytesNeeded >= maxLen) + return; + + TCHAR textBuffer[maxLen]; + textBuffer[0] = 0; + + if (_currentNrOverloads > 1) { + wsprintf(textBuffer, TEXT("\001%u of %u\002"), _currentOverload+1, _currentNrOverloads); + } + + lstrcat(textBuffer, curRetValText); + lstrcat(textBuffer, TEXT(" ")); + lstrcat(textBuffer, _funcName); + lstrcat(textBuffer, TEXT(" (")); + + int highlightstart = 0; + int highlightend = 0; + for(size_t i = 0; i < nrParams; i++) { + if (i == _currentParam) { + highlightstart = lstrlen(textBuffer); + highlightend = highlightstart + lstrlen(params.at(i)); + } + lstrcat(textBuffer, params.at(i)); + if (i < nrParams-1) + lstrcat(textBuffer, TEXT(", ")); + } + + lstrcat(textBuffer, TEXT(")")); + if (hasDescr) { + lstrcat(textBuffer, TEXT("\n")); + lstrcat(textBuffer, curDescriptionText); + } + + if (isVisible()) + _pEditView->execute(SCI_CALLTIPCANCEL); + else + _startPos = _curPos; + _pEditView->showCallTip(_startPos, textBuffer); + + if (highlightstart != highlightend) { + _pEditView->execute(SCI_CALLTIPSETHLT, highlightstart, highlightend); + } +} + +void FunctionCallTip::reset() { + _currentOverload = 0; + _currentParam = 0; + //_curPos = 0; + _startPos = 0; + _overloads.clear(); + _currentNrOverloads = 0; + _retVals.clear(); + _descriptions.clear(); +} + +void FunctionCallTip::cleanup() { + reset(); + if (_funcName) + delete [] _funcName; + _funcName = 0; + _pEditView = NULL; +} diff --git a/PowerEditor/src/ScitillaComponent/FunctionCallTip.h b/PowerEditor/src/ScitillaComponent/FunctionCallTip.h new file mode 100644 index 00000000..96ace095 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/FunctionCallTip.h @@ -0,0 +1,71 @@ +//this file is part of Notepad++ +//Copyright (C)2008 Harry Bruin +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef FUNCTIONCALLTIP_H +#define FUNCTIONCALLTIP_H + +#include "ScintillaEditView.h" + +typedef std::vector stringVec; + +class FunctionCallTip { + friend class AutoCompletion; +public: + FunctionCallTip(ScintillaEditView * pEditView) : _pEditView(pEditView), _pXmlKeyword(NULL), _curPos(0), _startPos(0), + _curFunction(NULL), _currentNrOverloads(0), _currentOverload(0), + _currentParam(0), _funcName(NULL), + _start('('), _stop(')'), _param(','), _terminal(';'), _ignoreCase(true) + {}; + ~FunctionCallTip() {/* cleanup(); */}; + void setLanguageXML(TiXmlElement * pXmlKeyword); //set calltip keyword node + bool updateCalltip(int ch, bool needShown = false); //Ch is character typed, or 0 if another event occured. NeedShown is true if calltip should be attempted to displayed. Return true if calltip was made visible + void showNextOverload(); //show next overlaoded parameters + void showPrevOverload(); //show prev overlaoded parameters + bool isVisible() { return _pEditView?_pEditView->execute(SCI_CALLTIPACTIVE) == TRUE:false; }; //true if calltip visible + void close(); //Close calltip if visible + +private: + ScintillaEditView * _pEditView; //Scintilla to display calltip in + TiXmlElement * _pXmlKeyword; //current keyword node (first one) + + int _curPos; //cursor position + int _startPos; //display start position + + TiXmlElement * _curFunction; //current function element + //cache some XML values n stuff + TCHAR * _funcName; //name of function + stringVec _retVals; //vector of overload return values/types + vector _overloads; //vector of overload params (=vector) + stringVec _descriptions; //vecotr of function descriptions + int _currentNrOverloads; //current amount of overloads + int _currentOverload; //current chosen overload + int _currentParam; //current highlighted param + + TCHAR _start; + TCHAR _stop; + TCHAR _param; + TCHAR _terminal; + bool _ignoreCase; + + bool getCursorFunction(); //retrieve data about function at cursor. Returns true if a function was found. Calls loaddata if needed + bool loadFunction(); //returns true if the function can be found + void showCalltip(); //display calltip based on current variables + void reset(); //reset all vars in case function is invalidated + void cleanup(); //delete any leftovers +}; + +#endif// FUNCTIONCALLTIP_H diff --git a/PowerEditor/src/ScitillaComponent/GoToLineDlg.cpp b/PowerEditor/src/ScitillaComponent/GoToLineDlg.cpp new file mode 100644 index 00000000..9d35027e --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/GoToLineDlg.cpp @@ -0,0 +1,104 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "GoToLineDlg.h" + + +BOOL CALLBACK GoToLineDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG : + { + ::SendDlgItemMessage(_hSelf, IDC_RADIO_GOTOLINE, BM_SETCHECK, TRUE, 0); + goToCenter(); + return TRUE; + } + case WM_COMMAND : + { + switch (wParam) + { + case IDCANCEL : // Close + display(false); + cleanLineEdit(); + return TRUE; + + case IDOK : + { + int line = getLine(); + if (line != -1) + { + display(false); + cleanLineEdit(); + if (_mode == go2line) { + (*_ppEditView)->execute(SCI_ENSUREVISIBLE, line-1); + (*_ppEditView)->execute(SCI_GOTOLINE, line-1); + } else { + int sci_line = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, line); + (*_ppEditView)->execute(SCI_ENSUREVISIBLE, sci_line); + (*_ppEditView)->execute(SCI_GOTOPOS, line); + } + } + (*_ppEditView)->getFocus(); + return TRUE; + } + + case IDC_RADIO_GOTOLINE : + case IDC_RADIO_GOTOOFFSET : + { + + bool isLine, isOffset; + if (wParam == IDC_RADIO_GOTOLINE) + { + isLine = true; + isOffset = false; + _mode = go2line; + } + else + { + isLine = false; + isOffset = true; + _mode = go2offsset; + } + ::SendDlgItemMessage(_hSelf, IDC_RADIO_GOTOLINE, BM_SETCHECK, isLine, 0); + ::SendDlgItemMessage(_hSelf, IDC_RADIO_GOTOOFFSET, BM_SETCHECK, isOffset, 0); + updateLinesNumbers(); + return TRUE; + } + default : + { + switch (HIWORD(wParam)) + { + case EN_SETFOCUS : + case BN_SETFOCUS : + updateLinesNumbers(); + return TRUE; + default : + return TRUE; + } + break; + } + } + } + + default : + return FALSE; + } + return FALSE; +} + + diff --git a/PowerEditor/src/ScitillaComponent/GoToLineDlg.h b/PowerEditor/src/ScitillaComponent/GoToLineDlg.h new file mode 100644 index 00000000..5de43885 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/GoToLineDlg.h @@ -0,0 +1,93 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef GOTILINE_DLG_H +#define GOTILINE_DLG_H + +#include "StaticDialog.h" +#include "..\resource.h" + +#include "ScintillaEditView.h" + +class GoToLineDlg : public StaticDialog +{ +public : + GoToLineDlg() : StaticDialog(), _mode(go2line) {}; + + void init(HINSTANCE hInst, HWND hPere, ScintillaEditView **ppEditView) { + Window::init(hInst, hPere); + if (!ppEditView) + throw int(9900); + _ppEditView = ppEditView; + }; + + virtual void create(int dialogID, bool isRTL = false) { + StaticDialog::create(dialogID, isRTL); + }; + + void doDialog(bool isRTL = false) { + if (!isCreated()) + create(IDD_GOLINE, isRTL); + display(); + }; + + virtual void display(bool toShow = true) const { + Window::display(toShow); + if (toShow) + ::SetFocus(::GetDlgItem(_hSelf, ID_GOLINE_EDIT)); + }; + +protected : + enum mode {go2line, go2offsset}; + mode _mode; + virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + +private : + + ScintillaEditView **_ppEditView; + + void updateLinesNumbers() const { + unsigned int current = 0; + unsigned int limit = 0; + + if (_mode == go2line) + { + current = (unsigned int)((*_ppEditView)->getCurrentLineNumber() + 1); + limit = (unsigned int)((*_ppEditView)->execute(SCI_GETLINECOUNT)); + } + else + { + current = (unsigned int)(*_ppEditView)->execute(SCI_GETCURRENTPOS); + limit = (unsigned int)((*_ppEditView)->getCurrentDocLen() - 1); + } + ::SetDlgItemInt(_hSelf, ID_CURRLINE, current, FALSE); + ::SetDlgItemInt(_hSelf, ID_LASTLINE, limit, FALSE); + }; + + void cleanLineEdit() const { + ::SetDlgItemText(_hSelf, ID_GOLINE_EDIT, TEXT("")); + }; + + int getLine() const { + BOOL isSuccessful; + int line = ::GetDlgItemInt(_hSelf, ID_GOLINE_EDIT, &isSuccessful, FALSE); + return (isSuccessful?line:-1); + }; + +}; + +#endif //GOTILINE_DLG_H diff --git a/PowerEditor/src/ScitillaComponent/Printer.cpp b/PowerEditor/src/ScitillaComponent/Printer.cpp new file mode 100644 index 00000000..59e6c157 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/Printer.cpp @@ -0,0 +1,502 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "Printer.h" + +void replaceStr(generic_string & str, generic_string str2BeReplaced, generic_string replacement) +{ + size_t pos = str.find(str2BeReplaced); + + if (pos != str.npos) + str.replace(pos, str2BeReplaced.length(), replacement); +} + +void Printer::init(HINSTANCE hInst, HWND hwnd, ScintillaEditView *pSEView, bool showDialog, int startPos, int endPos) +{ + _pSEView = pSEView; + _startPos = startPos; + _endPos = endPos; + _pdlg.lStructSize = sizeof(PRINTDLG); + _pdlg.hwndOwner = hwnd; + _pdlg.hInstance = hInst; + _pdlg.Flags = PD_USEDEVMODECOPIES | PD_ALLPAGES | PD_RETURNDC; + _pdlg.nFromPage = 1; + _pdlg.nToPage = 1; + _pdlg.nMinPage = 1; + _pdlg.nMaxPage = 0xffffU; // We do not know how many pages in the + // document until the printer is selected and the paper size is known. + _pdlg.nCopies = 1; + _pdlg.hDC = 0; + _pdlg.hDevMode = NULL; + _pdlg.hDevNames = NULL; + _pdlg.lCustData = 0; + _pdlg.lpfnPrintHook = NULL; + _pdlg.lpfnSetupHook = NULL; + _pdlg.lpPrintTemplateName = NULL; + _pdlg.lpSetupTemplateName = NULL; + _pdlg.hPrintTemplate = NULL; + _pdlg.hSetupTemplate = NULL; + + // See if a range has been selected + _pdlg.Flags |= (_startPos != _endPos)?PD_SELECTION:PD_NOSELECTION; + + if (!showDialog) + { + // Don't display dialog box, just use the default printer and options + _pdlg.Flags |= PD_RETURNDEFAULT; + } +} + + + +size_t Printer::doPrint(bool justDoIt) +{/* + if (!::PrintDlg(&_pdlg)) + return 0; +*/ + + const NppGUI & nppGUI = (NppParameters::getInstance())->getNppGUI(); + + POINT ptPage; + POINT ptDpi; + + RECT rectMargins; + RECT rectPhysMargins; + RECT userMargins; + + // Get printer resolution + ptDpi.x = GetDeviceCaps(_pdlg.hDC, LOGPIXELSX); // dpi in X direction + ptDpi.y = GetDeviceCaps(_pdlg.hDC, LOGPIXELSY); // dpi in Y direction + + // Start by getting the physical page size (in device units). + ptPage.x = GetDeviceCaps(_pdlg.hDC, PHYSICALWIDTH); // device units + ptPage.y = GetDeviceCaps(_pdlg.hDC, PHYSICALHEIGHT); // device units + + // Get the dimensions of the unprintable + // part of the page (in device units). + rectPhysMargins.left = GetDeviceCaps(_pdlg.hDC, PHYSICALOFFSETX); + rectPhysMargins.top = GetDeviceCaps(_pdlg.hDC, PHYSICALOFFSETY); + + // To get the right and lower unprintable area, + // we take the entire width and height of the paper and + // subtract everything else. + rectPhysMargins.right = ptPage.x // total paper width + - GetDeviceCaps(_pdlg.hDC, HORZRES) // printable width + - rectPhysMargins.left; // left unprintable margin + + rectPhysMargins.bottom = ptPage.y // total paper height + - GetDeviceCaps(_pdlg.hDC, VERTRES) // printable height + - rectPhysMargins.top; // right unprintable margin + if (nppGUI._printSettings.isUserMargePresent()) + { + userMargins.left = MulDiv(nppGUI._printSettings._marge.left*100, ptDpi.x, 2540); + userMargins.top = MulDiv(nppGUI._printSettings._marge.top*100, ptDpi.y, 2540); + userMargins.right = MulDiv(nppGUI._printSettings._marge.right*100, ptDpi.x, 2540); + userMargins.bottom = MulDiv(nppGUI._printSettings._marge.bottom*100, ptDpi.y, 2540); + + rectMargins.left = max(rectPhysMargins.left, userMargins.left); + rectMargins.top = max(rectPhysMargins.top, userMargins.top); + rectMargins.right = max(rectPhysMargins.right, userMargins.right); + rectMargins.bottom = max(rectPhysMargins.bottom, userMargins.bottom); + } + else + { + rectMargins.left = rectPhysMargins.left; + rectMargins.top = rectPhysMargins.top; + rectMargins.right = rectPhysMargins.right; + rectMargins.bottom = rectPhysMargins.bottom; + } + // Convert device coordinates into logical coordinates + DPtoLP(_pdlg.hDC, (LPPOINT)&rectMargins, 2); + DPtoLP(_pdlg.hDC, (LPPOINT)&rectPhysMargins, 2); + + // Convert page size to logical units and we're done! + DPtoLP(_pdlg.hDC, &ptPage, 1); + + TEXTMETRIC tm; + + int fontSize = nppGUI._printSettings._headerFontSize?nppGUI._printSettings._headerFontSize:9; + int fontWeight = nppGUI._printSettings._headerFontStyle & FONTSTYLE_BOLD?FW_BOLD:FW_NORMAL; + int isFontItalic = nppGUI._printSettings._headerFontStyle & FONTSTYLE_ITALIC?TRUE:FALSE; + const TCHAR *fontFace = (nppGUI._printSettings._headerFontName != TEXT(""))?nppGUI._printSettings._headerFontName.c_str():TEXT("Arial"); + + int headerLineHeight = ::MulDiv(fontSize, ptDpi.y, 72); + //TCHAR toto[10]; + //::MessageBox(NULL, itoa(nppGUI._printSettings._headerFontStyle, toto, 10), TEXT("header"), MB_OK); + + HFONT fontHeader = ::CreateFont(headerLineHeight, + 0, 0, 0, + fontWeight, + isFontItalic, + FALSE, + 0, 0, 0, + 0, 0, 0, + fontFace); + + ::SelectObject(_pdlg.hDC, fontHeader); + ::GetTextMetrics(_pdlg.hDC, &tm); + headerLineHeight = tm.tmHeight + tm.tmExternalLeading; + + fontSize = nppGUI._printSettings._footerFontSize?nppGUI._printSettings._footerFontSize:9; + fontWeight = nppGUI._printSettings._footerFontStyle & FONTSTYLE_BOLD?FW_BOLD:FW_NORMAL; + isFontItalic = nppGUI._printSettings._footerFontStyle & FONTSTYLE_ITALIC?TRUE:FALSE; + fontFace = (nppGUI._printSettings._footerFontName != TEXT(""))?nppGUI._printSettings._footerFontName.c_str():TEXT("Arial"); + //::MessageBox(NULL, itoa(nppGUI._printSettings._footerFontStyle, , 10), TEXT("footer"), MB_OK); + + int footerLineHeight = ::MulDiv(fontSize, ptDpi.y, 72); + HFONT fontFooter = ::CreateFont(footerLineHeight, + 0, 0, 0, + fontWeight, + isFontItalic, + FALSE, + 0, 0, 0, + 0, 0, 0, + fontFace); + + ::SelectObject(_pdlg.hDC, fontFooter); + ::GetTextMetrics(_pdlg.hDC, &tm); + footerLineHeight = tm.tmHeight + tm.tmExternalLeading; + + + ::GetTextMetrics(_pdlg.hDC, &tm); + int printMarge = tm.tmHeight + tm.tmExternalLeading; + printMarge = printMarge + printMarge / 2; + + DOCINFO docInfo; + docInfo.cbSize = sizeof(DOCINFO); + docInfo.lpszDocName = _pSEView->getCurrentBuffer()->getFullPathName(); + docInfo.lpszOutput = NULL; + + if (::StartDoc(_pdlg.hDC, &docInfo) < 0) + { + MessageBox(NULL, TEXT("Can not start printer document."), 0, MB_OK); + return 0; + } + + // By default, we will print all the document + long lengthPrinted = 0; + long lengthDoc = _pSEView->getCurrentDocLen(); + long lengthDocMax = lengthDoc; + + // In the case that the print dialog was launched and that there's a range of selection + // We print the range of selection + if ((!(_pdlg.Flags & PD_RETURNDEFAULT)) && (_pdlg.Flags & PD_SELECTION)) + { + if (_startPos > _endPos) + { + lengthPrinted = _endPos; + lengthDoc = _startPos; + } + else + { + lengthPrinted = _startPos; + lengthDoc = _endPos; + } + + if (lengthPrinted < 0) + lengthPrinted = 0; + if (lengthDoc > lengthDocMax) + lengthDoc = lengthDocMax; + } + + RangeToFormat frPrint; + frPrint.hdc = _pdlg.hDC; + frPrint.hdcTarget = _pdlg.hDC; + frPrint.rc.left = rectMargins.left - rectPhysMargins.left; + frPrint.rc.top = rectMargins.top - rectPhysMargins.top; + frPrint.rc.right = ptPage.x - rectMargins.right - rectPhysMargins.left; + frPrint.rc.bottom = ptPage.y - rectMargins.bottom - rectPhysMargins.top; + frPrint.rcPage.left = 0; + frPrint.rcPage.top = 0; + frPrint.rcPage.right = ptPage.x - rectPhysMargins.left - rectPhysMargins.right - 1; + frPrint.rcPage.bottom = ptPage.y - rectPhysMargins.top - rectPhysMargins.bottom - 1; + + frPrint.rc.top += printMarge; + frPrint.rc.bottom -= printMarge; + frPrint.rc.left += printMarge; + frPrint.rc.right -= printMarge; + + const int headerSize = 256; + TCHAR headerL[headerSize] = TEXT(""); + TCHAR headerM[headerSize] = TEXT(""); + TCHAR headerR[headerSize] = TEXT(""); + TCHAR footerL[headerSize] = TEXT(""); + TCHAR footerM[headerSize] = TEXT(""); + TCHAR footerR[headerSize] = TEXT(""); + + + const TCHAR shortDateVar[] = TEXT("$(SHORT_DATE)"); + const TCHAR longDateVar[] = TEXT("$(LONG_DATE)"); + const TCHAR timeVar[] = TEXT("$(TIME)"); + + const int bufferSize = 64; + TCHAR shortDate[bufferSize]; + TCHAR longDate[bufferSize]; + TCHAR time[bufferSize]; + + SYSTEMTIME st; + ::GetLocalTime(&st); + ::GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &st, NULL, shortDate, bufferSize); + ::GetDateFormat(LOCALE_USER_DEFAULT, DATE_LONGDATE, &st, NULL, longDate, bufferSize); + ::GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, NULL, time, bufferSize); + + if (nppGUI._printSettings.isHeaderPresent()) + { + frPrint.rc.top += headerLineHeight + headerLineHeight / 2; + + generic_string headerLeftPart = nppGUI._printSettings._headerLeft; + if (headerLeftPart != TEXT("")) + { + replaceStr(headerLeftPart, shortDateVar, shortDate); + replaceStr(headerLeftPart, longDateVar, longDate); + replaceStr(headerLeftPart, timeVar, time); + expandNppEnvironmentStrs(headerLeftPart.c_str(), headerL, headerSize, _pdlg.hwndOwner); + } + + generic_string headerMiddlePart = nppGUI._printSettings._headerMiddle; + if (headerMiddlePart != TEXT("")) + { + replaceStr(headerMiddlePart, shortDateVar, shortDate); + replaceStr(headerMiddlePart, longDateVar, longDate); + replaceStr(headerMiddlePart, timeVar, time); + expandNppEnvironmentStrs(headerMiddlePart.c_str(), headerM, headerSize, _pdlg.hwndOwner); + } + + generic_string headerRightPart = nppGUI._printSettings._headerRight; + if (headerRightPart != TEXT("")) + { + replaceStr(headerRightPart, shortDateVar, shortDate); + replaceStr(headerRightPart, longDateVar, longDate); + replaceStr(headerRightPart, timeVar, time); + expandNppEnvironmentStrs(headerRightPart.c_str(), headerR, headerSize, _pdlg.hwndOwner); + } + + } + + if (nppGUI._printSettings.isFooterPresent()) + { + frPrint.rc.bottom -= footerLineHeight + footerLineHeight / 2; + + generic_string footerLeftPart = nppGUI._printSettings._footerLeft; + if (footerLeftPart != TEXT("")) + { + replaceStr(footerLeftPart, shortDateVar, shortDate); + replaceStr(footerLeftPart, longDateVar, longDate); + replaceStr(footerLeftPart, timeVar, time); + expandNppEnvironmentStrs(footerLeftPart.c_str(), footerL, headerSize, _pdlg.hwndOwner); + } + + generic_string footerMiddlePart = nppGUI._printSettings._footerMiddle; + if (footerMiddlePart != TEXT("")) + { + replaceStr(footerMiddlePart, shortDateVar, shortDate); + replaceStr(footerMiddlePart, longDateVar, longDate); + replaceStr(footerMiddlePart, timeVar, time); + expandNppEnvironmentStrs(footerMiddlePart.c_str(), footerM, headerSize, _pdlg.hwndOwner); + } + + generic_string footerRightPart = nppGUI._printSettings._footerRight; + if (footerRightPart != TEXT("")) + { + replaceStr(footerRightPart, shortDateVar, shortDate); + replaceStr(footerRightPart, longDateVar, longDate); + replaceStr(footerRightPart, timeVar, time); + expandNppEnvironmentStrs(footerRightPart.c_str(), footerR, headerSize, _pdlg.hwndOwner); + } + } + + + bool isShown = _pSEView->hasMarginShowed(ScintillaEditView::_SC_MARGE_LINENUMBER); + if (!nppGUI._printSettings._printLineNumber) + _pSEView->showMargin(ScintillaEditView::_SC_MARGE_LINENUMBER, false); + + size_t pageNum = 1; + bool printPage; + const TCHAR pageVar[] = TEXT("$(CURRENT_PRINTING_PAGE)"); + + while (lengthPrinted < lengthDoc) + { + printPage = (!(_pdlg.Flags & PD_PAGENUMS) || + (pageNum >= _pdlg.nFromPage) && (pageNum <= _pdlg.nToPage)); + + if (!justDoIt) + printPage = false; + + TCHAR pageString[32]; + wsprintf(pageString, TEXT("%0d"), pageNum); + + if (printPage) + { + ::StartPage(_pdlg.hDC); + + if (nppGUI._printSettings.isHeaderPresent()) + { + ::SelectObject(_pdlg.hDC, fontHeader); + + ::SetTextColor(_pdlg.hDC, RGB(0, 0, 0)); + ::SetBkColor(_pdlg.hDC, RGB(255, 255, 255)); + + UINT oldTASettings = ::SetTextAlign(_pdlg.hDC, TA_BOTTOM); + RECT rcw = {frPrint.rc.left, frPrint.rc.top - headerLineHeight - headerLineHeight / 2, + frPrint.rc.right, frPrint.rc.top - headerLineHeight / 2}; + rcw.bottom = rcw.top + headerLineHeight; + + + SIZE size; + + // Left part + if (headerL[0] != '\0') + { + generic_string headerLeft(headerL); + size_t pos = headerLeft.find(pageVar); + + if (pos != headerLeft.npos) + headerLeft.replace(pos, lstrlen(pageVar), pageString); + + ::ExtTextOut(_pdlg.hDC, frPrint.rc.left + 5, frPrint.rc.top - headerLineHeight / 2, + ETO_OPAQUE, &rcw, headerLeft.c_str(), static_cast(headerLeft.length()), NULL); + } + + // Middle part + if (headerM != '\0') + { + generic_string headerMiddle(headerM); + size_t pos = headerMiddle.find(pageVar); + if (pos != headerMiddle.npos) + headerMiddle.replace(pos, lstrlen(pageVar), pageString); + + ::GetTextExtentPoint32(_pdlg.hDC, headerMiddle.c_str(), static_cast(headerMiddle.length()), &size); + ::ExtTextOut(_pdlg.hDC, ((frPrint.rc.right - frPrint.rc.left)/2 + frPrint.rc.left) - (size.cx/2), frPrint.rc.top - headerLineHeight / 2, + ETO_CLIPPED, &rcw, headerMiddle.c_str(), static_cast(headerMiddle.length()), NULL); + } + // Right part + if (headerR != '\0') + { + generic_string headerRight(headerR); + size_t pos = headerRight.find(pageVar); + if (pos != headerRight.npos) + headerRight.replace(pos, lstrlen(pageVar), pageString); + + ::GetTextExtentPoint32(_pdlg.hDC, headerRight.c_str(), static_cast(headerRight.length()), &size); + ::ExtTextOut(_pdlg.hDC, frPrint.rc.right - size.cx, frPrint.rc.top - headerLineHeight / 2, + ETO_CLIPPED, &rcw, headerRight.c_str(), static_cast(headerRight.length()), NULL); + } + + ::SetTextAlign(_pdlg.hDC, oldTASettings); + HPEN pen = ::CreatePen(0, 1, 0x00000000); + HPEN penOld = static_cast(::SelectObject(_pdlg.hDC, pen)); + ::MoveToEx(_pdlg.hDC, frPrint.rc.left, frPrint.rc.top - headerLineHeight / 4, NULL); + ::LineTo(_pdlg.hDC, frPrint.rc.right, frPrint.rc.top - headerLineHeight / 4); + ::SelectObject(_pdlg.hDC, penOld); + ::DeleteObject(pen); + } + } + + frPrint.chrg.cpMin = lengthPrinted; + frPrint.chrg.cpMax = lengthDoc; + _pSEView->execute(SCI_SETPRINTCOLOURMODE, nppGUI._printSettings._printOption); + lengthPrinted = long(_pSEView->execute(SCI_FORMATRANGE, printPage, reinterpret_cast(&frPrint))); + + if (printPage) + { + if (nppGUI._printSettings.isFooterPresent()) + { + ::SelectObject(_pdlg.hDC, fontFooter); + + ::SetTextColor(_pdlg.hDC, RGB(0, 0, 0)); + ::SetBkColor(_pdlg.hDC, RGB(255, 255, 255)); + + UINT oldta = ::SetTextAlign(_pdlg.hDC, TA_TOP); + RECT rcw = {frPrint.rc.left, frPrint.rc.bottom + footerLineHeight / 2, + frPrint.rc.right, frPrint.rc.bottom + footerLineHeight + footerLineHeight / 2}; + + SIZE size; + + // Left part + if (footerL[0] != '\0') + { + generic_string footerLeft(footerL); + size_t pos = footerLeft.find(pageVar); + if (pos != footerLeft.npos) + footerLeft.replace(pos, lstrlen(pageVar), pageString); + + ::ExtTextOut(_pdlg.hDC, frPrint.rc.left + 5, frPrint.rc.bottom + footerLineHeight / 2, + ETO_OPAQUE, &rcw, footerLeft.c_str(), static_cast(footerLeft.length()), NULL); + } + + // Middle part + if (footerM[0] != '\0') + { + generic_string footerMiddle(footerM); + size_t pos = footerMiddle.find(pageVar); + if (pos != footerMiddle.npos) + footerMiddle.replace(pos, lstrlen(pageVar), pageString); + + ::GetTextExtentPoint32(_pdlg.hDC, footerMiddle.c_str(), static_cast(footerMiddle.length()), &size); + ::ExtTextOut(_pdlg.hDC, ((frPrint.rc.right - frPrint.rc.left)/2 + frPrint.rc.left) - (size.cx/2), frPrint.rc.bottom + footerLineHeight / 2, + ETO_CLIPPED, &rcw, footerMiddle.c_str(), static_cast(footerMiddle.length()), NULL); + } + // Right part + if (footerR[0] != '\0') + { + generic_string footerRight(footerR); + size_t pos = footerRight.find(pageVar); + if (pos != footerRight.npos) + footerRight.replace(pos, lstrlen(pageVar), pageString); + ::GetTextExtentPoint32(_pdlg.hDC, footerRight.c_str(), static_cast(footerRight.length()), &size); + ::ExtTextOut(_pdlg.hDC, frPrint.rc.right - size.cx, frPrint.rc.bottom + footerLineHeight / 2, + ETO_CLIPPED, &rcw, footerRight.c_str(), static_cast(footerRight.length()), NULL); + } + + ::SetTextAlign(_pdlg.hDC, oldta); + HPEN pen = ::CreatePen(0, 1, 0x00000000); + HPEN penOld = static_cast(::SelectObject(_pdlg.hDC, pen)); + + ::MoveToEx(_pdlg.hDC, frPrint.rc.left, frPrint.rc.bottom + footerLineHeight / 4, NULL); + ::LineTo(_pdlg.hDC, frPrint.rc.right, frPrint.rc.bottom + footerLineHeight / 4); + ::SelectObject(_pdlg.hDC, penOld); + ::DeleteObject(pen); + } + + ::EndPage(_pdlg.hDC); + } + + pageNum++; + + if ((_pdlg.Flags & PD_PAGENUMS) && (pageNum > _pdlg.nToPage)) + break; + } + + //TCHAR toto[10]; + //::MessageBox(NULL, itoa(pageNum, toto, 10), TEXT("page total"), MB_OK); + if (!nppGUI._printSettings._printLineNumber) + _pSEView->showMargin(ScintillaEditView::_SC_MARGE_LINENUMBER, isShown); + + _pSEView->execute(SCI_FORMATRANGE, FALSE, 0); + ::EndDoc(_pdlg.hDC); + ::DeleteDC(_pdlg.hDC); + + if (fontHeader) + ::DeleteObject(fontHeader); + + if (fontFooter) + ::DeleteObject(fontFooter); + + return (pageNum - 1); +} + + diff --git a/PowerEditor/src/ScitillaComponent/Printer.h b/PowerEditor/src/ScitillaComponent/Printer.h new file mode 100644 index 00000000..461fedca --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/Printer.h @@ -0,0 +1,55 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef PRINTER_H +#define PRINTER_H + +#include +#include "ScintillaEditView.h" +#include "RunDlg.h" +#include "Parameters.h" + +struct RangeToFormat { + HDC hdc; + HDC hdcTarget; + RECT rc; + RECT rcPage; + CharacterRange chrg; +}; + +class Printer +{ +public : + Printer(){}; + void init(HINSTANCE hInst, HWND hwnd, ScintillaEditView *pSEView, bool showDialog, int startPos, int endPos); + size_t Printer::doPrint() { + if (!::PrintDlg(&_pdlg)) + return 0; + + return doPrint(true); + }; + size_t doPrint(bool justDoIt); + +private : + PRINTDLG _pdlg; + ScintillaEditView *_pSEView; + size_t _startPos; + size_t _endPos; + size_t _nbPageTotal; +}; + +#endif //PRINTER_H diff --git a/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp b/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp new file mode 100644 index 00000000..1df138ed --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/ScintillaEditView.cpp @@ -0,0 +1,2486 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + + +#include +#include +#include "ScintillaEditView.h" +#include "Parameters.h" + + +// initialize the static variable +HINSTANCE ScintillaEditView::_hLib = ::LoadLibrary(TEXT("SciLexer.DLL")); +int ScintillaEditView::_refCount = 0; +UserDefineDialog ScintillaEditView::_userDefineDlg; + +const int ScintillaEditView::_SC_MARGE_LINENUMBER = 0; +const int ScintillaEditView::_SC_MARGE_SYBOLE = 1; +const int ScintillaEditView::_SC_MARGE_FOLDER = 2; +//const int ScintillaEditView::_SC_MARGE_MODIFMARKER = 3; + +WNDPROC ScintillaEditView::_scintillaDefaultProc = NULL; +/* +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 +*/ + +const int ScintillaEditView::_markersArray[][NB_FOLDER_STATE] = { + {SC_MARKNUM_FOLDEROPEN, SC_MARKNUM_FOLDER, SC_MARKNUM_FOLDERSUB, SC_MARKNUM_FOLDERTAIL, SC_MARKNUM_FOLDEREND, SC_MARKNUM_FOLDEROPENMID, SC_MARKNUM_FOLDERMIDTAIL}, + {SC_MARK_MINUS, SC_MARK_PLUS, SC_MARK_EMPTY, SC_MARK_EMPTY, SC_MARK_EMPTY, SC_MARK_EMPTY, SC_MARK_EMPTY}, + {SC_MARK_ARROWDOWN, SC_MARK_ARROW, SC_MARK_EMPTY, SC_MARK_EMPTY, SC_MARK_EMPTY, SC_MARK_EMPTY, SC_MARK_EMPTY}, + {SC_MARK_CIRCLEMINUS, SC_MARK_CIRCLEPLUS,SC_MARK_VLINE, SC_MARK_LCORNERCURVE, SC_MARK_CIRCLEPLUSCONNECTED, SC_MARK_CIRCLEMINUSCONNECTED, SC_MARK_TCORNERCURVE}, + {SC_MARK_BOXMINUS, SC_MARK_BOXPLUS, SC_MARK_VLINE, SC_MARK_LCORNER, SC_MARK_BOXPLUSCONNECTED, SC_MARK_BOXMINUSCONNECTED, SC_MARK_TCORNER} +}; + +//Array with all the names of all languages +LanguageName ScintillaEditView::langNames[L_EXTERNAL+1] = { +{TEXT("normal"), TEXT("Normal text"), TEXT("Normal text file"), L_TXT, SCLEX_NULL}, +{TEXT("php"), TEXT("PHP"), TEXT("PHP Hypertext Preprocessor file"), L_PHP, SCLEX_HTML}, +{TEXT("c"), TEXT("C"), TEXT("C source file"), L_C, SCLEX_CPP}, +{TEXT("cpp"), TEXT("C++"), TEXT("C++ source file"), L_CPP, SCLEX_CPP}, +{TEXT("cs"), TEXT("C#"), TEXT("C# source file"), L_CS, }, +{TEXT("objc"), TEXT("Objective-C"), TEXT("Objective-C source file"), L_OBJC, }, +{TEXT("java"), TEXT("Java"), TEXT("Java source file"), L_JAVA, SCLEX_CPP}, +{TEXT("rc"), TEXT("RC"), TEXT("Windows Resource file"), L_RC, SCLEX_CPP}, +{TEXT("html"), TEXT("HTML"), TEXT("Hyper Text Markup Language file"), L_HTML, SCLEX_HTML}, +{TEXT("xml"), TEXT("XML"), TEXT("eXtensible Markup Language file"), L_XML, SCLEX_XML}, +{TEXT("makefile"), TEXT("Makefile"), TEXT("Makefile"), L_MAKEFILE, SCLEX_MAKEFILE}, +{TEXT("pascal"), TEXT("Pascal"), TEXT("Pascal source file"), L_PASCAL, SCLEX_PASCAL}, +{TEXT("batch"), TEXT("Batch"), TEXT("Batch file"), L_BATCH, SCLEX_BATCH}, +{TEXT("ini"), TEXT("ini"), TEXT("MS ini file"), L_INI, SCLEX_PROPERTIES}, +{TEXT("nfo"), TEXT("NFO"), TEXT("MSDOS Style/ASCII Art"), L_NFO, SCLEX_NULL}, +{TEXT("udf"), TEXT("udf"), TEXT("User Define File"), L_USER, SCLEX_USER}, +{TEXT("asp"), TEXT("ASP"), TEXT("Active Server Pages script file"), L_ASP, SCLEX_HTML}, +{TEXT("sql"), TEXT("SQL"), TEXT("Structured Query Language file"), L_SQL, SCLEX_SQL}, +{TEXT("vb"), TEXT("VB"), TEXT("Visual Basic file"), L_VB, SCLEX_VB}, +{TEXT("javascript"), TEXT("JavaScript"), TEXT("JavaScript file"), L_JS, SCLEX_CPP}, +{TEXT("css"), TEXT("CSS"), TEXT("Cascade Style Sheets File"), L_CSS, SCLEX_CSS}, +{TEXT("perl"), TEXT("Perl"), TEXT("Perl source file"), L_PERL, SCLEX_PERL}, +{TEXT("python"), TEXT("Python"), TEXT("Python file"), L_PYTHON, SCLEX_PYTHON}, +{TEXT("lua"), TEXT("Lua"), TEXT("Lua source File"), L_LUA, SCLEX_LUA}, +{TEXT("tex"), TEXT("TeX"), TEXT("TeX file"), L_TEX, SCLEX_TEX}, +{TEXT("fortran"), TEXT("Fortran"), TEXT("Fortran source file"), L_FORTRAN, SCLEX_FORTRAN}, +{TEXT("bash"), TEXT("Shell"), TEXT("Unix script file"), L_BASH, SCLEX_BASH}, +{TEXT("actionscript"), TEXT("Flash Action"), TEXT("Flash Action script file"), L_FLASH, SCLEX_OBJC}, //WARNING, was "flash" +{TEXT("nsis"), TEXT("NSIS"), TEXT("Nullsoft Scriptable Install System script file"), L_NSIS, SCLEX_NSIS}, +{TEXT("tcl"), TEXT("TCL"), TEXT("Tool Command Language file"), L_TCL, SCLEX_TCL}, +{TEXT("lisp"), TEXT("Lisp"), TEXT("List Processing language file"), L_LISP, SCLEX_LISP}, +{TEXT("scheme"), TEXT("Scheme"), TEXT("Scheme file"), L_SCHEME, SCLEX_LISP}, +{TEXT("asm"), TEXT("Assembly"), TEXT("Assembly language source file"), L_ASM, SCLEX_ASM}, +{TEXT("diff"), TEXT("Diff"), TEXT("Diff file"), L_DIFF, SCLEX_DIFF}, +{TEXT("props"), TEXT("Properties file"), TEXT("Properties file"), L_PROPS, SCLEX_PROPERTIES}, +{TEXT("postscript"), TEXT("Postscript"), TEXT("Postscript file"), L_PS, SCLEX_PS}, +{TEXT("ruby"), TEXT("Ruby"), TEXT("Ruby file"), L_RUBY, SCLEX_RUBY}, +{TEXT("smalltalk"), TEXT("Smalltalk"), TEXT("Smalltalk file"), L_SMALLTALK, SCLEX_SMALLTALK}, +{TEXT("vhdl"), TEXT("VHDL"), TEXT("VHSIC Hardware Description Language file"), L_VHDL, SCLEX_VHDL}, +{TEXT("kix"), TEXT("KiXtart"), TEXT("KiXtart file"), L_KIX, SCLEX_KIX}, +{TEXT("autoit"), TEXT("AutoIt"), TEXT("AutoIt"), L_AU3, SCLEX_AU3}, +{TEXT("caml"), TEXT("CAML"), TEXT("Categorical Abstract Machine Language"), L_CAML, SCLEX_CAML}, +{TEXT("ada"), TEXT("Ada"), TEXT("Ada file"), L_ADA, SCLEX_ADA}, +{TEXT("verilog"), TEXT("Verilog"), TEXT("Verilog file"), L_VERILOG, SCLEX_VERILOG}, +{TEXT("matlab"), TEXT("MATLAB"), TEXT("MATrix LABoratory"), L_MATLAB, SCLEX_MATLAB}, +{TEXT("haskell"), TEXT("Haskell"), TEXT("Haskell"), L_HASKELL, SCLEX_HASKELL}, +{TEXT("inno"), TEXT("Inno"), TEXT("Inno Setup script"), L_INNO, SCLEX_INNOSETUP}, +{TEXT("searchResult"), TEXT("Internal Search"), TEXT("Internal Search"), L_SEARCHRESULT, SCLEX_SEARCHRESULT}, +{TEXT("cmake"), TEXT("CMAKEFILE"), TEXT("CMAKEFILE"), L_CMAKE, SCLEX_CMAKE}, +{TEXT("yaml"), TEXT("YAML"), TEXT("YAML Ain't Markup Language"), L_YAML, SCLEX_YAML}, +{TEXT("ext"), TEXT("External"), TEXT("External"), L_EXTERNAL, SCLEX_NULL} +}; + +//const int MASK_RED = 0xFF0000; +//const int MASK_GREEN = 0x00FF00; +//const int MASK_BLUE = 0x0000FF; + +void ScintillaEditView::init(HINSTANCE hInst, HWND hPere) +{ + if (!_hLib) + { + MessageBox( NULL, TEXT("Can not load the dynamic library"), TEXT("SCINTILLA ERROR : "), MB_OK | MB_ICONSTOP); + throw int(106901); + } + + Window::init(hInst, hPere); + _hSelf = ::CreateWindowEx( + WS_EX_CLIENTEDGE,\ + TEXT("Scintilla"),\ + TEXT("Notepad++"),\ + WS_CHILD | WS_VSCROLL | WS_HSCROLL | WS_CLIPCHILDREN | WS_EX_RTLREADING,\ + 0, 0, 100, 100,\ + _hParent,\ + NULL,\ + _hInst,\ + NULL); + + if (!_hSelf) + { + systemMessage(TEXT("System Error")); + throw int(106901); + } + + _pScintillaFunc = (SCINTILLA_FUNC)::SendMessage(_hSelf, SCI_GETDIRECTFUNCTION, 0, 0); + _pScintillaPtr = (SCINTILLA_PTR)::SendMessage(_hSelf, SCI_GETDIRECTPOINTER, 0, 0); + + _userDefineDlg.init(_hInst, _hParent, this); + + if (!_pScintillaFunc || !_pScintillaPtr) + { + systemMessage(TEXT("System Err")); + throw int(106901); + } + + execute(SCI_SETMARGINMASKN, _SC_MARGE_FOLDER, SC_MASK_FOLDERS); + showMargin(_SC_MARGE_FOLDER, true); + + execute(SCI_SETMARGINMASKN, _SC_MARGE_SYBOLE, (1<("fold"), reinterpret_cast("1")); + execute(SCI_SETPROPERTY, reinterpret_cast("fold.compact"), reinterpret_cast("0")); + + execute(SCI_SETPROPERTY, reinterpret_cast("fold.html"), reinterpret_cast("1")); + execute(SCI_SETPROPERTY, reinterpret_cast("fold.comment"), reinterpret_cast("1")); + execute(SCI_SETPROPERTY, reinterpret_cast("fold.preprocessor"), reinterpret_cast("1")); + execute(SCI_SETFOLDFLAGS, 16); + execute(SCI_SETSCROLLWIDTHTRACKING, true); + execute(SCI_SETSCROLLWIDTH, 1); //default empty document: override default width of 2000 + + // smart hilighting + execute(SCI_INDICSETSTYLE, SCE_UNIVERSAL_FOUND_STYLE_2, INDIC_ROUNDBOX); + execute(SCI_INDICSETSTYLE, SCE_UNIVERSAL_FOUND_STYLE, INDIC_ROUNDBOX); + execute(SCI_INDICSETSTYLE, SCE_UNIVERSAL_FOUND_STYLE_INC, INDIC_ROUNDBOX); + execute(SCI_INDICSETSTYLE, SCE_UNIVERSAL_TAGMATCH, INDIC_ROUNDBOX); + execute(SCI_INDICSETSTYLE, SCE_UNIVERSAL_TAGATTR, INDIC_ROUNDBOX); + execute(SCI_INDICSETSTYLE, SCE_UNIVERSAL_FOUND_STYLE_EXT1, INDIC_ROUNDBOX); + 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_INDICSETALPHA, SCE_UNIVERSAL_FOUND_STYLE_2, 100); + execute(SCI_INDICSETALPHA, SCE_UNIVERSAL_FOUND_STYLE, 100); + execute(SCI_INDICSETALPHA, SCE_UNIVERSAL_FOUND_STYLE_INC, 100); + execute(SCI_INDICSETALPHA, SCE_UNIVERSAL_TAGMATCH, 100); + execute(SCI_INDICSETALPHA, SCE_UNIVERSAL_TAGATTR, 100); + execute(SCI_INDICSETALPHA, SCE_UNIVERSAL_FOUND_STYLE_EXT1, 100); + 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_INDICSETUNDER, SCE_UNIVERSAL_FOUND_STYLE_2, true); + execute(SCI_INDICSETUNDER, SCE_UNIVERSAL_FOUND_STYLE, true); + execute(SCI_INDICSETUNDER, SCE_UNIVERSAL_FOUND_STYLE_INC, true); + execute(SCI_INDICSETUNDER, SCE_UNIVERSAL_TAGMATCH, true); + execute(SCI_INDICSETUNDER, SCE_UNIVERSAL_TAGATTR, true); + execute(SCI_INDICSETUNDER, SCE_UNIVERSAL_FOUND_STYLE_EXT1, true); + 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); + _pParameter = NppParameters::getInstance(); + + _codepage = ::GetACP(); + _oemCodepage = ::GetOEMCP(); + + //Use either Unicode or ANSI setwindowlong, depending on environment + if (::IsWindowUnicode(_hSelf)) + { + ::SetWindowLongPtrW(_hSelf, GWL_USERDATA, reinterpret_cast(this)); + _callWindowProc = CallWindowProcW; + _scintillaDefaultProc = reinterpret_cast(::SetWindowLongPtrW(_hSelf, GWL_WNDPROC, reinterpret_cast(scintillaStatic_Proc))); + } + else + { + ::SetWindowLongPtrA(_hSelf, GWL_USERDATA, reinterpret_cast(this)); + _callWindowProc = CallWindowProcA; + _scintillaDefaultProc = reinterpret_cast(::SetWindowLongPtrA(_hSelf, GWL_WNDPROC, reinterpret_cast(scintillaStatic_Proc))); + } + + //Get the startup document and make a buffer for it so it can be accessed like a file + attachDefaultDoc(); +} + +LRESULT ScintillaEditView::scintillaNew_Proc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_CHAR : + { + if (execute(SCI_SELECTIONISRECTANGLE) && !(::GetKeyState(VK_LCONTROL) & 0x80000000)) + { + if (wParam != VK_ESCAPE) + { + execute(SCI_BEGINUNDOACTION); + + ColumnModeInfo colInfos = getColumnModeSelectInfo(); + generic_string str(1, (TCHAR)wParam); + columnReplace(colInfos, str.c_str()); + + int selStart = execute(SCI_GETSELECTIONSTART)+1; + int selEnd = execute(SCI_GETSELECTIONEND); + execute(SCI_SETSELECTIONSTART, selStart); + execute(SCI_SETSELECTIONEND, selEnd); + + execute(SCI_ENDUNDOACTION); + execute(SCI_SETCURRENTPOS,colInfos[colInfos.size()-1].second); + } + else + { + int pos = execute(SCI_GETSELECTIONSTART); + execute(SCI_SETSEL, pos, pos); + } + return TRUE; + } + break; + } + + case WM_MOUSEHWHEEL : + { + ::CallWindowProc(_scintillaDefaultProc, hwnd, WM_HSCROLL, ((short)HIWORD(wParam) > 0)?SB_LINERIGHT:SB_LINELEFT, NULL); + break; + } + + case WM_MOUSEWHEEL : + { + if (LOWORD(wParam) & MK_RBUTTON) + { + ::SendMessage(_hParent, Message, wParam, lParam); + return TRUE; + } + + //Have to perform the scroll first, because the first/last line do not get updated untill after the scroll has been parsed + LRESULT scrollResult = ::CallWindowProc(_scintillaDefaultProc, hwnd, Message, wParam, lParam); + return scrollResult; + break; + } + + case WM_IME_REQUEST: + { + + if (wParam == IMR_RECONVERTSTRING) + { + int textLength; + int selectSize; + char smallTextBuffer[128]; + char * selectedStr = smallTextBuffer; + RECONVERTSTRING * reconvert = (RECONVERTSTRING *)lParam; + + // does nothing with a rectangular selection + if (execute(SCI_SELECTIONISRECTANGLE, 0, 0)) + return 0; + + // get the codepage of the text + + unsigned int codepage = execute(SCI_GETCODEPAGE); + + // get the current text selection + + CharacterRange range = getSelection(); + if (range.cpMax == range.cpMin) + { + // no selection: select the current word instead + + expandWordSelection(); + range = getSelection(); + } + selectSize = range.cpMax - range.cpMin; + + // does nothing if still no luck with the selection + + if (selectSize == 0) + return 0; + + if (selectSize + 1 > sizeof(smallTextBuffer)) + selectedStr = new char[selectSize + 1]; + getText(selectedStr, range.cpMin, range.cpMax); + + if (reconvert == NULL) + { + // convert the selection to Unicode, and get the number + // of bytes required for the converted text + textLength = sizeof(WCHAR) * ::MultiByteToWideChar(codepage, 0, selectedStr, selectSize, NULL, 0); + } + else + { + // convert the selection to Unicode, and store it at the end of the structure. + // Beware: For a Unicode IME, dwStrLen , dwCompStrLen, and dwTargetStrLen + // are TCHAR values, that is, character counts. The members dwStrOffset, + // dwCompStrOffset, and dwTargetStrOffset specify byte counts. + + textLength = ::MultiByteToWideChar( codepage, 0, + selectedStr, selectSize, + (LPWSTR)((LPSTR)reconvert + sizeof(RECONVERTSTRING)), + reconvert->dwSize - sizeof(RECONVERTSTRING)); + + // fill the structure + reconvert->dwVersion = 0; + reconvert->dwStrLen = textLength; + reconvert->dwStrOffset = sizeof(RECONVERTSTRING); + reconvert->dwCompStrLen = textLength; + reconvert->dwCompStrOffset = 0; + reconvert->dwTargetStrLen = reconvert->dwCompStrLen; + reconvert->dwTargetStrOffset = reconvert->dwCompStrOffset; + + textLength *= sizeof(WCHAR); + } + + if (selectedStr != smallTextBuffer) + delete [] selectedStr; + + // return the total length of the structure + return sizeof(RECONVERTSTRING) + textLength; + } + break; + } + + case WM_VSCROLL : + { + break; + } + } + return _callWindowProc(_scintillaDefaultProc, hwnd, Message, wParam, lParam); +} + + +void ScintillaEditView::setSpecialStyle(Style & styleToSet) +{ + int styleID = styleToSet._styleID; + if ( styleToSet._colorStyle & COLORSTYLE_FOREGROUND ) + execute(SCI_STYLESETFORE, styleID, styleToSet._fgColor); + + if ( styleToSet._colorStyle & COLORSTYLE_BACKGROUND ) + execute(SCI_STYLESETBACK, styleID, styleToSet._bgColor); + + if ((!styleToSet._fontName)||(lstrcmp(styleToSet._fontName, TEXT("")))) + { +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + const char * fontNameA = wmc->wchar2char(styleToSet._fontName, CP_ACP); + execute(SCI_STYLESETFONT, (WPARAM)styleID, (LPARAM)fontNameA); +#else + execute(SCI_STYLESETFONT, (WPARAM)styleID, (LPARAM)styleToSet._fontName); +#endif + } + int fontStyle = styleToSet._fontStyle; + if (fontStyle != -1) + { + execute(SCI_STYLESETBOLD, (WPARAM)styleID, fontStyle & FONTSTYLE_BOLD); + execute(SCI_STYLESETITALIC, (WPARAM)styleID, fontStyle & FONTSTYLE_ITALIC); + execute(SCI_STYLESETUNDERLINE, (WPARAM)styleID, fontStyle & FONTSTYLE_UNDERLINE); + } + + if (styleToSet._fontSize > 0) + execute(SCI_STYLESETSIZE, styleID, styleToSet._fontSize); +} + +void ScintillaEditView::setStyle(Style styleToSet) +{ + GlobalOverride & go = _pParameter->getGlobalOverrideStyle(); + //go.enableBg = true; + + if (go.isEnable()) + { + StyleArray & stylers = _pParameter->getMiscStylerArray(); + int i = stylers.getStylerIndexByName(TEXT("Global override")); + if (i != -1) + { + Style & style = stylers.getStyler(i); + + if (go.enableFg) { + if (style._colorStyle & COLORSTYLE_FOREGROUND) { + styleToSet._colorStyle |= COLORSTYLE_FOREGROUND; + styleToSet._fgColor = style._fgColor; + } else { + if (styleToSet._styleID == STYLE_DEFAULT) { //if global is set to transparent, use default style color + styleToSet._colorStyle |= COLORSTYLE_FOREGROUND; + } else { + styleToSet._colorStyle &= ~COLORSTYLE_FOREGROUND; + } + } + } + if (go.enableBg) { + if (style._colorStyle & COLORSTYLE_BACKGROUND) { + styleToSet._colorStyle |= COLORSTYLE_BACKGROUND; + styleToSet._bgColor = style._bgColor; + } else { + if (styleToSet._styleID == STYLE_DEFAULT) { //if global is set to transparent, use default style color + styleToSet._colorStyle |= COLORSTYLE_BACKGROUND; + } else { + styleToSet._colorStyle &= ~COLORSTYLE_BACKGROUND; + } + } + } + if (go.enableFont && style._fontName && style._fontName[0]) + styleToSet._fontName = style._fontName; + if (go.enableFontSize && (style._fontSize > 0)) + styleToSet._fontSize = style._fontSize; + + if (style._fontStyle != -1) + { + if (go.enableBold) + { + if (style._fontStyle & FONTSTYLE_BOLD) + styleToSet._fontStyle |= FONTSTYLE_BOLD; + else + styleToSet._fontStyle &= ~FONTSTYLE_BOLD; + } + if (go.enableItalic) + { + if (style._fontStyle & FONTSTYLE_ITALIC) + styleToSet._fontStyle |= FONTSTYLE_ITALIC; + else + styleToSet._fontStyle &= ~FONTSTYLE_ITALIC; + } + if (go.enableUnderLine) + { + if (style._fontStyle & FONTSTYLE_UNDERLINE) + styleToSet._fontStyle |= FONTSTYLE_UNDERLINE; + else + styleToSet._fontStyle &= ~FONTSTYLE_UNDERLINE; + } + } + } + } + setSpecialStyle(styleToSet); +} + + +void ScintillaEditView::setXmlLexer(LangType type) +{ + if (type == L_XML) + { + execute(SCI_SETLEXER, SCLEX_XML); + for (int i = 0 ; i < 4 ; i++) + execute(SCI_SETKEYWORDS, i, reinterpret_cast(TEXT(""))); + + makeStyle(type); + } + else if ((type == L_HTML) || (type == L_PHP) || (type == L_ASP)) + { + execute(SCI_SETLEXER, SCLEX_HTML); + const TCHAR *htmlKeyWords_generic =_pParameter->getWordList(L_HTML, LANG_INDEX_INSTR); + +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + const char *htmlKeyWords = wmc->wchar2char(htmlKeyWords_generic, CP_ACP); + execute(SCI_SETKEYWORDS, 0, reinterpret_cast(htmlKeyWords?htmlKeyWords:"")); +#else + execute(SCI_SETKEYWORDS, 0, reinterpret_cast(htmlKeyWords_generic?htmlKeyWords_generic:"")); +#endif + makeStyle(L_HTML); + + setEmbeddedJSLexer(); + setPhpEmbeddedLexer(); + setEmbeddedAspLexer(); + } +} + +void ScintillaEditView::setEmbeddedJSLexer() +{ + const TCHAR *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + makeStyle(L_JS, pKwArray); + + basic_string keywordList(""); + if (pKwArray[LANG_INDEX_INSTR]) + { +#ifdef UNICODE + basic_string kwlW = pKwArray[LANG_INDEX_INSTR]; + keywordList = wstring2string(kwlW, CP_ACP); +#else + keywordList = pKwArray[LANG_INDEX_INSTR]; +#endif + } + + execute(SCI_SETKEYWORDS, 1, (LPARAM)getCompleteKeywordList(keywordList, L_JS, LANG_INDEX_INSTR)); + execute(SCI_STYLESETEOLFILLED, SCE_HJ_DEFAULT, true); + execute(SCI_STYLESETEOLFILLED, SCE_HJ_COMMENT, true); + execute(SCI_STYLESETEOLFILLED, SCE_HJ_COMMENTDOC, true); +} + +void ScintillaEditView::setPhpEmbeddedLexer() +{ + const TCHAR *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + makeStyle(L_PHP, pKwArray); + + basic_string keywordList(""); + if (pKwArray[LANG_INDEX_INSTR]) + { +#ifdef UNICODE + basic_string kwlW = pKwArray[LANG_INDEX_INSTR]; + keywordList = wstring2string(kwlW, CP_ACP); +#else + keywordList = pKwArray[LANG_INDEX_INSTR]; +#endif + } + + execute(SCI_SETKEYWORDS, 4, (LPARAM)getCompleteKeywordList(keywordList, L_PHP, LANG_INDEX_INSTR)); + + execute(SCI_STYLESETEOLFILLED, SCE_HPHP_DEFAULT, true); + execute(SCI_STYLESETEOLFILLED, SCE_HPHP_COMMENT, true); +} + +void ScintillaEditView::setEmbeddedAspLexer() +{ + const TCHAR *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + makeStyle(L_ASP, pKwArray); + + basic_string keywordList(""); + if (pKwArray[LANG_INDEX_INSTR]) + { +#ifdef UNICODE + basic_string kwlW = pKwArray[LANG_INDEX_INSTR]; + keywordList = wstring2string(kwlW, CP_ACP); +#else + keywordList = pKwArray[LANG_INDEX_INSTR]; +#endif + } + + execute(SCI_SETKEYWORDS, 2, (LPARAM)getCompleteKeywordList(keywordList, L_VB, LANG_INDEX_INSTR)); + + execute(SCI_STYLESETEOLFILLED, SCE_HBA_DEFAULT, true); +} + +void ScintillaEditView::setUserLexer(const TCHAR *userLangName) +{ + execute(SCI_SETLEXER, SCLEX_USER); + + UserLangContainer * userLangContainer = userLangName?NppParameters::getInstance()->getULCFromName(userLangName):_userDefineDlg._pCurrentUserLang; + + if (!userLangContainer) + return; + + execute(SCI_SETPROPERTY, (WPARAM)"userDefine.ignoreCase", (LPARAM)(userLangContainer->_isCaseIgnored?"1":"0")); + execute(SCI_SETPROPERTY, (WPARAM)"userDefine.commentLineSymbol", (LPARAM)(userLangContainer->_isCommentLineSymbol?"1":"0")); + execute(SCI_SETPROPERTY, (WPARAM)"userDefine.commentSymbol", (LPARAM)(userLangContainer->_isCommentSymbol?"1":"0")); + + const char strArray[4][20] = {"userDefine.g1Prefix", "userDefine.g2Prefix", "userDefine.g3Prefix", "userDefine.g4Prefix"}; + for (int i = 0 ; i < 4 ; i++) + execute(SCI_SETPROPERTY, (WPARAM)strArray[i], (LPARAM)(userLangContainer->_isPrefix[i]?"1":"0")); + + for (int i = 0 ; i < userLangContainer->getNbKeywordList() ; i++) + { +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + const char * keyWords_char = wmc->wchar2char(userLangContainer->_keywordLists[i], CP_ACP); + execute(SCI_SETKEYWORDS, i, reinterpret_cast(keyWords_char)); +#else + execute(SCI_SETKEYWORDS, i, reinterpret_cast(userLangContainer->_keywordLists[i])); +#endif + } + + for (int i = 0 ; i < userLangContainer->_styleArray.getNbStyler() ; i++) + { + Style & style = userLangContainer->_styleArray.getStyler(i); + setStyle(style); + } +} + +void ScintillaEditView::setExternalLexer(LangType typeDoc) +{ + int id = typeDoc - L_EXTERNAL; + TCHAR * name = NppParameters::getInstance()->getELCFromIndex(id)._name; + +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + const char *pName = wmc->wchar2char(name, CP_ACP); +#else + const char *pName = name; +#endif + execute(SCI_SETLEXERLANGUAGE, 0, (LPARAM)pName); + + LexerStyler *pStyler = (_pParameter->getLStylerArray()).getLexerStylerByName(name); + if (pStyler) + { + for (int i = 0 ; i < pStyler->getNbStyler() ; i++) + { + Style & style = pStyler->getStyler(i); + + setStyle(style); + + if (style._keywordClass >= 0 && style._keywordClass <= KEYWORDSET_MAX) + { + basic_string keywordList(""); + if (style._keywords) + { +#ifdef UNICODE + keywordList = wstring2string(*(style._keywords), CP_ACP); +#else + keywordList = *(style._keywords); +#endif + } + execute(SCI_SETKEYWORDS, style._keywordClass, (LPARAM)getCompleteKeywordList(keywordList, typeDoc, style._keywordClass)); + } + } + } +} + +void ScintillaEditView::setCppLexer(LangType langType) +{ + const char *cppInstrs; + const char *cppTypes; + const TCHAR *doxygenKeyWords = _pParameter->getWordList(L_CPP, LANG_INDEX_TYPE2); + + const TCHAR *lexerName = ScintillaEditView::langNames[langType].lexerName; + + execute(SCI_SETLEXER, SCLEX_CPP); + if (isCJK()) + { + int charSet = codepage2CharSet(); + if (charSet) + execute(SCI_STYLESETCHARACTERSET, SCE_C_STRING, charSet); + } + + if ((langType != L_RC) && (langType != L_JS)) + { + if (doxygenKeyWords) + { +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + const char * doxygenKeyWords_char = wmc->wchar2char(doxygenKeyWords, CP_ACP); + execute(SCI_SETKEYWORDS, 2, (LPARAM)doxygenKeyWords_char); +#else + execute(SCI_SETKEYWORDS, 2, (LPARAM)doxygenKeyWords); +#endif + } + } + + if (langType == L_JS) + { + LexerStyler *pStyler = (_pParameter->getLStylerArray()).getLexerStylerByName(lexerName); + if (pStyler) + { + for (int i = 0 ; i < pStyler->getNbStyler() ; i++) + { + Style style = pStyler->getStyler(i); //not by reference, but copy + int cppID = style._styleID; + switch (style._styleID) + { + case SCE_HJ_DEFAULT : cppID = SCE_C_DEFAULT; break; + case SCE_HJ_WORD : cppID = SCE_C_IDENTIFIER; break; + case SCE_HJ_SYMBOLS : cppID = SCE_C_OPERATOR; break; + case SCE_HJ_COMMENT : cppID = SCE_C_COMMENT; break; + case SCE_HJ_COMMENTLINE : cppID = SCE_C_COMMENTLINE; break; + case SCE_HJ_COMMENTDOC : cppID = SCE_C_COMMENTDOC; break; + case SCE_HJ_NUMBER : cppID = SCE_C_NUMBER; break; + case SCE_HJ_KEYWORD : cppID = SCE_C_WORD; break; + case SCE_HJ_DOUBLESTRING : cppID = SCE_C_STRING; break; + case SCE_HJ_SINGLESTRING : cppID = SCE_C_CHARACTER; break; + case SCE_HJ_REGEX : cppID = SCE_C_REGEX; break; + } + style._styleID = cppID; + setStyle(style); + } + } + execute(SCI_STYLESETEOLFILLED, SCE_C_DEFAULT, true); + execute(SCI_STYLESETEOLFILLED, SCE_C_COMMENTLINE, true); + execute(SCI_STYLESETEOLFILLED, SCE_C_COMMENT, true); + execute(SCI_STYLESETEOLFILLED, SCE_C_COMMENTDOC, true); + } + + const TCHAR *pKwArray[10] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + makeStyle(langType, pKwArray); + + basic_string keywordListInstruction(""); + basic_string keywordListType(""); + if (pKwArray[LANG_INDEX_INSTR]) + { +#ifdef UNICODE + basic_string kwlW = pKwArray[LANG_INDEX_INSTR]; + keywordListInstruction = wstring2string(kwlW, CP_ACP); +#else + keywordListInstruction = pKwArray[LANG_INDEX_INSTR]; +#endif + } + cppInstrs = getCompleteKeywordList(keywordListInstruction, langType, LANG_INDEX_INSTR); + + if (pKwArray[LANG_INDEX_TYPE]) + { +#ifdef UNICODE + basic_string kwlW = pKwArray[LANG_INDEX_TYPE]; + keywordListType = wstring2string(kwlW, CP_ACP); +#else + keywordListType = pKwArray[LANG_INDEX_TYPE]; +#endif + } + cppTypes = getCompleteKeywordList(keywordListType, langType, LANG_INDEX_TYPE); + + execute(SCI_SETKEYWORDS, 0, (LPARAM)cppInstrs); + execute(SCI_SETKEYWORDS, 1, (LPARAM)cppTypes); + +} + +//used by Objective-C and Actionscript +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]) + { +#ifdef UNICODE + objcInstr1Kwl = wstring2string(pKwArray[LANG_INDEX_INSTR], CP_ACP); +#else + objcInstr1Kwl = pKwArray[LANG_INDEX_INSTR]; +#endif + } + const char *objcInstrs = getCompleteKeywordList(objcInstr1Kwl, langType, LANG_INDEX_INSTR); + + basic_string objcInstr2Kwl(""); + if (pKwArray[LANG_INDEX_INSTR2]) + { +#ifdef UNICODE + objcInstr2Kwl = wstring2string(pKwArray[LANG_INDEX_INSTR2], CP_ACP); +#else + objcInstr2Kwl = pKwArray[LANG_INDEX_INSTR2]; +#endif + } + const char *objCDirective = getCompleteKeywordList(objcInstr2Kwl, langType, LANG_INDEX_INSTR2); + + basic_string objcTypeKwl(""); + if (pKwArray[LANG_INDEX_TYPE]) + { +#ifdef UNICODE + objcTypeKwl = wstring2string(pKwArray[LANG_INDEX_TYPE], CP_ACP); +#else + objcTypeKwl = pKwArray[LANG_INDEX_TYPE]; +#endif + } + const char *objcTypes = getCompleteKeywordList(objcTypeKwl, langType, LANG_INDEX_TYPE); + + + basic_string objcType2Kwl(""); + if (pKwArray[LANG_INDEX_TYPE2]) + { +#ifdef UNICODE + objcType2Kwl = wstring2string(pKwArray[LANG_INDEX_TYPE2], CP_ACP); +#else + objcType2Kwl = pKwArray[LANG_INDEX_TYPE2]; +#endif + } + const char *objCQualifier = getCompleteKeywordList(objcType2Kwl, langType, LANG_INDEX_TYPE2); + + const TCHAR *doxygenKeyWords_generic = _pParameter->getWordList(L_CPP, LANG_INDEX_TYPE2); + const char * doxygenKeyWords; + basic_string doxygenKeyWordsString(""); +#ifdef UNICODE + doxygenKeyWordsString = wstring2string(doxygenKeyWords_generic, CP_ACP); + doxygenKeyWords = doxygenKeyWordsString.c_str(); +#else + doxygenKeyWords = doxygenKeyWords_generic; +#endif + execute(SCI_SETKEYWORDS, 0, (LPARAM)objcInstrs); + execute(SCI_SETKEYWORDS, 1, (LPARAM)objcTypes); + execute(SCI_SETKEYWORDS, 2, (LPARAM)doxygenKeyWords); + execute(SCI_SETKEYWORDS, 3, (LPARAM)objCDirective); + execute(SCI_SETKEYWORDS, 4, (LPARAM)objCQualifier); +} + +void ScintillaEditView::setKeywords(LangType langType, const char *keywords, int index) +{ + std::basic_string wordList; + wordList = (keywords)?keywords:""; + execute(SCI_SETKEYWORDS, index, (LPARAM)getCompleteKeywordList(wordList, langType, index)); +} + +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); + +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); +#endif + + if (whichList & LIST_0) + { +#ifdef UNICODE + const char * keyWords_char = wmc->wchar2char(pKwArray[LANG_INDEX_INSTR], CP_ACP); + setKeywords(langType, keyWords_char, LANG_INDEX_INSTR); +#else + setKeywords(langType, pKwArray[LANG_INDEX_INSTR], LANG_INDEX_INSTR); +#endif + } + + if (whichList & LIST_1) + { +#ifdef UNICODE + const char * keyWords_char = wmc->wchar2char(pKwArray[LANG_INDEX_INSTR2], CP_ACP); + setKeywords(langType, keyWords_char, LANG_INDEX_INSTR2); +#else + setKeywords(langType, pKwArray[LANG_INDEX_INSTR2], LANG_INDEX_INSTR2); +#endif + } + + if (whichList & LIST_2) + { +#ifdef UNICODE + const char * keyWords_char = wmc->wchar2char(pKwArray[LANG_INDEX_TYPE], CP_ACP); + setKeywords(langType, keyWords_char, LANG_INDEX_TYPE); +#else + setKeywords(langType, pKwArray[LANG_INDEX_TYPE], LANG_INDEX_TYPE); +#endif + } + + if (whichList & LIST_3) + { +#ifdef UNICODE + const char * keyWords_char = wmc->wchar2char(pKwArray[LANG_INDEX_TYPE2], CP_ACP); + setKeywords(langType, keyWords_char, LANG_INDEX_TYPE2); +#else + setKeywords(langType, pKwArray[LANG_INDEX_TYPE2], LANG_INDEX_TYPE2); +#endif + } + + if (whichList & LIST_4) + { +#ifdef UNICODE + const char * keyWords_char = wmc->wchar2char(pKwArray[LANG_INDEX_TYPE3], CP_ACP); + setKeywords(langType, keyWords_char, LANG_INDEX_TYPE3); +#else + setKeywords(langType, pKwArray[LANG_INDEX_TYPE3], LANG_INDEX_TYPE3); +#endif + } + + if (whichList & LIST_5) + { +#ifdef UNICODE + const char * keyWords_char = wmc->wchar2char(pKwArray[LANG_INDEX_TYPE4], CP_ACP); + setKeywords(langType, keyWords_char, LANG_INDEX_TYPE4); +#else + setKeywords(langType, pKwArray[LANG_INDEX_TYPE4], LANG_INDEX_TYPE4); +#endif + } + + if (whichList & LIST_6) + { +#ifdef UNICODE + const char * keyWords_char = wmc->wchar2char(pKwArray[LANG_INDEX_TYPE5], CP_ACP); + setKeywords(langType, keyWords_char, LANG_INDEX_TYPE5); +#else + setKeywords(langType, pKwArray[LANG_INDEX_TYPE5], LANG_INDEX_TYPE5); +#endif + } +} + +void ScintillaEditView::makeStyle(LangType language, const TCHAR **keywordArray) +{ + const TCHAR * lexerName = ScintillaEditView::langNames[language].lexerName; + LexerStyler *pStyler = (_pParameter->getLStylerArray()).getLexerStylerByName(lexerName); + if (pStyler) + { + for (int i = 0 ; i < pStyler->getNbStyler() ; i++) + { + Style & style = pStyler->getStyler(i); + setStyle(style); + if (keywordArray) + { + if ((style._keywordClass != -1) && (style._keywords)) + keywordArray[style._keywordClass] = style._keywords->c_str(); + } + } + } +} + +void ScintillaEditView::defineDocType(LangType typeDoc) +{ + StyleArray & stylers = _pParameter->getMiscStylerArray(); + int iStyleDefault = stylers.getStylerIndexByID(STYLE_DEFAULT); + if (iStyleDefault != -1) + { + Style & styleDefault = stylers.getStyler(iStyleDefault); + styleDefault._colorStyle = COLORSTYLE_ALL; //override transparency + setStyle(styleDefault); + } + + execute(SCI_STYLECLEARALL); + int oldBits = execute(SCI_GETSTYLEBITSNEEDED); + + Style *pStyle; + Style defaultIndicatorStyle; + + defaultIndicatorStyle._styleID = SCE_UNIVERSAL_FOUND_STYLE; + defaultIndicatorStyle._bgColor = red; + pStyle = &defaultIndicatorStyle; + int iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_FOUND_STYLE); + if (iFind != -1) + { + pStyle = &(stylers.getStyler(iFind)); + } + setSpecialIndicator(*pStyle); + + defaultIndicatorStyle._styleID = SCE_UNIVERSAL_FOUND_STYLE_2; + defaultIndicatorStyle._bgColor = liteGreen; + pStyle = &defaultIndicatorStyle; + iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_FOUND_STYLE_2); + if (iFind != -1) + { + pStyle = &(stylers.getStyler(iFind)); + } + setSpecialIndicator(*pStyle); + + defaultIndicatorStyle._styleID = SCE_UNIVERSAL_FOUND_STYLE_INC; + defaultIndicatorStyle._bgColor = blue; + pStyle = &defaultIndicatorStyle; + iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_FOUND_STYLE_INC); + if (iFind != -1) + { + pStyle = &(stylers.getStyler(iFind)); + } + setSpecialIndicator(*pStyle); + + defaultIndicatorStyle._styleID = SCE_UNIVERSAL_TAGMATCH; + defaultIndicatorStyle._bgColor = RGB(0x80, 0x00, 0xFF); + pStyle = &defaultIndicatorStyle; + iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_TAGMATCH); + if (iFind != -1) + { + pStyle = &(stylers.getStyler(iFind)); + } + setSpecialIndicator(*pStyle); + + defaultIndicatorStyle._styleID = SCE_UNIVERSAL_TAGATTR; + defaultIndicatorStyle._bgColor = yellow; + pStyle = &defaultIndicatorStyle; + iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_TAGATTR); + if (iFind != -1) + { + pStyle = &(stylers.getStyler(iFind)); + } + setSpecialIndicator(*pStyle); + + + defaultIndicatorStyle._styleID = SCE_UNIVERSAL_FOUND_STYLE_EXT1; + defaultIndicatorStyle._bgColor = cyan; + pStyle = &defaultIndicatorStyle; + iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_FOUND_STYLE_EXT1); + if (iFind != -1) + { + pStyle = &(stylers.getStyler(iFind)); + } + setSpecialIndicator(*pStyle); + + defaultIndicatorStyle._styleID = SCE_UNIVERSAL_FOUND_STYLE_EXT2; + defaultIndicatorStyle._bgColor = orange; + pStyle = &defaultIndicatorStyle; + iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_FOUND_STYLE_EXT2); + if (iFind != -1) + { + pStyle = &(stylers.getStyler(iFind)); + } + setSpecialIndicator(*pStyle); + + defaultIndicatorStyle._styleID = SCE_UNIVERSAL_FOUND_STYLE_EXT3; + defaultIndicatorStyle._bgColor = yellow; + pStyle = &defaultIndicatorStyle; + iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_FOUND_STYLE_EXT3); + if (iFind != -1) + { + pStyle = &(stylers.getStyler(iFind)); + } + setSpecialIndicator(*pStyle); + + defaultIndicatorStyle._styleID = SCE_UNIVERSAL_FOUND_STYLE_EXT4; + defaultIndicatorStyle._bgColor = purple; + pStyle = &defaultIndicatorStyle; + iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_FOUND_STYLE_EXT4); + if (iFind != -1) + { + pStyle = &(stylers.getStyler(iFind)); + } + setSpecialIndicator(*pStyle); + + defaultIndicatorStyle._styleID = SCE_UNIVERSAL_FOUND_STYLE_EXT5; + defaultIndicatorStyle._bgColor = darkGreen; + pStyle = &defaultIndicatorStyle; + iFind = stylers.getStylerIndexByID(SCE_UNIVERSAL_FOUND_STYLE_EXT5); + if (iFind != -1) + { + pStyle = &(stylers.getStyler(iFind)); + } + setSpecialIndicator(*pStyle); + int caretWidth = 1; + + // Il faut surtout faire un test ici avant d'exécuter SCI_SETCODEPAGE + // Sinon y'aura un soucis de performance! + if (isCJK()) + { + if (getCurrentBuffer()->getUnicodeMode() == uni8Bit) + { + if (typeDoc != L_CSS || typeDoc != L_CAML || typeDoc != L_ASM || typeDoc != L_MATLAB) + execute(SCI_SETCODEPAGE, _codepage); + else + execute(SCI_SETCODEPAGE, CP_ACP); + } + } + + showMargin(_SC_MARGE_FOLDER, isNeededFolderMarge(typeDoc)); + switch (typeDoc) + { + case L_C : + case L_CPP : + case L_JS: + case L_JAVA : + case L_RC : + case L_CS : + case L_TCL : + setCppLexer(typeDoc); break; + + case L_FLASH : + case L_OBJC : + setObjCLexer(typeDoc); break; + + case L_PHP : + case L_ASP : + case L_HTML : + case L_XML : + setXmlLexer(typeDoc); break; + + case L_CSS : + setCssLexer(); break; + + case L_LUA : + setLuaLexer(); break; + + case L_MAKEFILE : + setMakefileLexer(); break; + + case L_INI : + setIniLexer(); break; + + case L_USER : { + const TCHAR * langExt = _currentBuffer->getUserDefineLangName(); + if (langExt[0]) + setUserLexer(langExt); + else + setUserLexer(); + break; } + + case L_NFO : + { + LexerStyler *pStyler = (_pParameter->getLStylerArray()).getLexerStylerByName(TEXT("nfo")); + COLORREF bg = black; + COLORREF fg = liteGrey; + Style nfoStyle; + nfoStyle._styleID = STYLE_DEFAULT; + nfoStyle._fontName = TEXT("MS LineDraw"); + + if (pStyler) + { + int i = pStyler->getStylerIndexByName(TEXT("DEFAULT")); + if (i != -1) + { + Style & style = pStyler->getStyler(i); + nfoStyle._bgColor = style._bgColor; + nfoStyle._fgColor = style._fgColor; + nfoStyle._colorStyle = style._colorStyle; + } + } + setStyle(nfoStyle); + execute(SCI_STYLECLEARALL); + + } + break; + + case L_SQL : + setSqlLexer(); break; + + case L_VB : + setVBLexer(); break; + + case L_PASCAL : + setPascalLexer(); break; + + case L_PERL : + setPerlLexer(); break; + + case L_PYTHON : + setPythonLexer(); break; + + case L_BATCH : + setBatchLexer(); break; + + case L_TEX : + setTeXLexer(); break; + + case L_NSIS : + setNsisLexer(); break; + + case L_BASH : + setBashLexer(); break; + + case L_FORTRAN : + setFortranLexer(); break; + + case L_LISP : + setLispLexer(); break; + + case L_SCHEME : + setSchemeLexer(); break; + + case L_ASM : + setAsmLexer(); break; + + case L_DIFF : + setDiffLexer(); break; + + case L_PROPS : + setPropsLexer(); break; + + case L_PS : + setPostscriptLexer(); break; + + case L_RUBY : + setRubyLexer(); break; + + case L_SMALLTALK : + setSmalltalkLexer(); break; + + case L_VHDL : + setVhdlLexer(); break; + + case L_KIX : + setKixLexer(); break; + + case L_CAML : + setCamlLexer(); break; + + case L_ADA : + setAdaLexer(); break; + + case L_VERILOG : + setVerilogLexer(); break; + + case L_AU3 : + setAutoItLexer(); break; + + case L_MATLAB : + setMatlabLexer(); break; + + case L_HASKELL : + setHaskellLexer(); break; + + case L_INNO : + setInnoLexer(); break; + + case L_CMAKE : + setCmakeLexer(); break; + + case L_YAML : + setYamlLexer(); break; + + case L_TXT : + default : + if (typeDoc >= L_EXTERNAL && typeDoc < NppParameters::getInstance()->L_END) + setExternalLexer(typeDoc); + else + execute(SCI_SETLEXER, (_codepage == CP_CHINESE_TRADITIONAL)?SCLEX_MAKEFILE:SCLEX_NULL); + break; + + } + //All the global styles should put here + int indexOfIndentGuide = stylers.getStylerIndexByID(STYLE_INDENTGUIDE); + if (indexOfIndentGuide != -1) + { + Style & styleIG = stylers.getStyler(indexOfIndentGuide); + setStyle(styleIG); + } + int indexOfBraceLight = stylers.getStylerIndexByID(STYLE_BRACELIGHT); + if (indexOfBraceLight != -1) + { + Style & styleBL = stylers.getStyler(indexOfBraceLight); + setStyle(styleBL); + } + //setStyle(STYLE_CONTROLCHAR, liteGrey); + int indexBadBrace = stylers.getStylerIndexByID(STYLE_BRACEBAD); + if (indexBadBrace != -1) + { + Style & styleBB = stylers.getStyler(indexBadBrace); + setStyle(styleBB); + } + int indexLineNumber = stylers.getStylerIndexByID(STYLE_LINENUMBER); + if (indexLineNumber != -1) + { + Style & styleLN = stylers.getStyler(indexLineNumber); + setSpecialStyle(styleLN); + } + execute(SCI_SETTABWIDTH, ((NppParameters::getInstance())->getNppGUI())._tabSize); + execute(SCI_SETUSETABS, !((NppParameters::getInstance())->getNppGUI())._tabReplacedBySpace); + int bitsNeeded = execute(SCI_GETSTYLEBITSNEEDED); + execute(SCI_SETSTYLEBITS, bitsNeeded); +} + +BufferID ScintillaEditView::attachDefaultDoc() +{ + // get the doc pointer attached (by default) on the view Scintilla + Document doc = execute(SCI_GETDOCPOINTER, 0, 0); + execute(SCI_ADDREFDOCUMENT, 0, doc); + BufferID id = MainFileManager->bufferFromDocument(doc, false, true);//true, true); //keep counter on 1 + Buffer * buf = MainFileManager->getBufferByID(id); + + MainFileManager->addBufferReference(id, this); //add a reference. Notepad only shows the buffer in tabbar + + _currentBufferID = id; + _currentBuffer = buf; + bufferUpdated(buf, BufferChangeMask); //make sure everything is in sync with the buffer, since no reference exists + + return id; +} + +void ScintillaEditView::saveCurrentPos() +{ + //Save data so, that the current topline becomes visible again after restoring. + int displayedLine = static_cast(execute(SCI_GETFIRSTVISIBLELINE)); + int docLine = execute(SCI_DOCLINEFROMVISIBLE, displayedLine); //linenumber of the line displayed in the top + //int offset = displayedLine - execute(SCI_VISIBLEFROMDOCLINE, docLine); //use this to calc offset of wrap. If no wrap this should be zero + + Buffer * buf = MainFileManager->getBufferByID(_currentBufferID); + + Position pos; + // the correct visible line number + pos._firstVisibleLine = docLine; + pos._startPos = static_cast(execute(SCI_GETANCHOR)); + pos._endPos = static_cast(execute(SCI_GETCURRENTPOS)); + pos._xOffset = static_cast(execute(SCI_GETXOFFSET)); + pos._selMode = execute(SCI_GETSELECTIONMODE); + pos._scrollWidth = execute(SCI_GETSCROLLWIDTH); + + buf->setPosition(pos, this); +} + +void ScintillaEditView::restoreCurrentPos() +{ + Buffer * buf = MainFileManager->getBufferByID(_currentBufferID); + Position & pos = buf->getPosition(this); + + execute(SCI_GOTOPOS, 0); //make sure first line visible by setting caret there, will scroll to top of document + + execute(SCI_SETSELECTIONMODE, pos._selMode); //enable + execute(SCI_SETANCHOR, pos._startPos); + execute(SCI_SETCURRENTPOS, pos._endPos); + execute(SCI_CANCEL); //disable + if (!isWrap()) { //only offset if not wrapping, otherwise the offset isnt needed at all + execute(SCI_SETSCROLLWIDTH, pos._scrollWidth); + execute(SCI_SETXOFFSET, pos._xOffset); + } + execute(SCI_CHOOSECARETX); // choose current x position + + int lineToShow = execute(SCI_VISIBLEFROMDOCLINE, pos._firstVisibleLine); + scroll(0, lineToShow); +} + +void ScintillaEditView::restyleBuffer() { + //int end = execute(SCI_GETENDSTYLED); //style up to the last styled byte. + //if (end == 0) + // return; + execute(SCI_CLEARDOCUMENTSTYLE); + execute(SCI_COLOURISE, 0, -1); + _currentBuffer->setNeedsLexing(false); +} + +void ScintillaEditView::styleChange() { + defineDocType(_currentBuffer->getLangType()); + restyleBuffer(); +} + +void ScintillaEditView::activateBuffer(BufferID buffer) +{ + if (buffer == BUFFER_INVALID) + return; + if (buffer == _currentBuffer) + return; + Buffer * newBuf = MainFileManager->getBufferByID(buffer); + + // before activating another document, we get the current position + // from the Scintilla view then save it to the current document + saveCurrentPos(); + + // get foldStateInfo of current doc + std::vector lineStateVector; + + int maxLine = execute(SCI_GETLINECOUNT); + + for (int line = 0; line < maxLine; line++) + { + int level = execute(SCI_GETFOLDLEVEL, line); + if (level & SC_FOLDLEVELHEADERFLAG) + { + bool expanded = (execute(SCI_GETFOLDEXPANDED, line) != 0); + lineStateVector.push_back(HeaderLineState(line, expanded)); + } + } + + // 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 + // 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()); + + // Due to execute(SCI_CLEARDOCUMENTSTYLE); in defineDocType() function + // defineDocType() function should be called here, but not be after the fold info loop + defineDocType(_currentBuffer->getLangType()); + + if (_currentBuffer->getNeedsLexing()) { + restyleBuffer(); + } + + // restore the collapsed info + std::vector & lineStateVectorNew = newBuf->getHeaderLineState(this); + int nbLineState = lineStateVectorNew.size(); + for (int i = 0 ; i < nbLineState ; i++) + { + HeaderLineState & hls = lineStateVectorNew.at(i); + bool expanded = (execute(SCI_GETFOLDEXPANDED, hls._headerLineNumber) != 0); + // set line to state folded + if (hls._isExpanded != expanded) + execute(SCI_TOGGLEFOLD, hls._headerLineNumber); + } + + restoreCurrentPos(); + + bufferUpdated(_currentBuffer, (BufferChangeMask & ~BufferChangeLanguage)); //everything should be updated, but the language (which undoes some operations done here like folding) + + //setup line number margin + int numLines = execute(SCI_GETLINECOUNT); + + char numLineStr[32]; + itoa(numLines, numLineStr, 10); + int nbDigit = strlen(numLineStr); + + runMarkers(true, 0, true, false); + return; //all done +} +void ScintillaEditView::bufferUpdated(Buffer * buffer, int mask) { + //actually only care about language and lexing etc + if (buffer == _currentBuffer) + { + if (mask & BufferChangeLanguage) + { + defineDocType(buffer->getLangType()); + foldAll(fold_uncollapse); + } + + if (mask & BufferChangeLexing) + { + if (buffer->getNeedsLexing()) + { + restyleBuffer(); //sets to false, this will apply to any other view aswell + } //else nothing, otherwise infinite loop + } + + if (mask & BufferChangeFormat) + { + execute(SCI_SETEOLMODE, _currentBuffer->getFormat()); + } + if (mask & BufferChangeReadonly) + { + execute(SCI_SETREADONLY, _currentBuffer->isReadOnly()); + } + if (mask & BufferChangeUnicode) + { + if (buffer->getUnicodeMode() == uni8Bit) + { //either 0 or CJK codepage + LangType typeDoc = buffer->getLangType(); + if (isCJK() && (typeDoc != L_CSS || typeDoc != L_CAML || typeDoc != L_ASM || typeDoc != L_MATLAB)) + { + execute(SCI_SETCODEPAGE, _codepage); //you may also want to set charsets here, not yet implemented + } + else + execute(SCI_SETCODEPAGE, 0); + } + else //CP UTF8 for all unicode + execute(SCI_SETCODEPAGE, SC_CP_UTF8); + } + } +} + +void ScintillaEditView::collapse(int level2Collapse, bool mode) +{ + // The following code is needed : + execute(SCI_COLOURISE, 0, -1); + // according to the Scitilla document : + // This requests the current lexer or the container (if the lexer is set to SCLEX_CONTAINER) + // to style the document between startPos and endPos. If endPos is -1, the document is styled from startPos to the end. + // If the "fold" property is set to "1" and your lexer or container supports folding, fold levels are also set. + // This message causes a redraw. + + int maxLine = execute(SCI_GETLINECOUNT); + + for (int line = 0; line < maxLine; line++) + { + int level = execute(SCI_GETFOLDLEVEL, line); + if (level & SC_FOLDLEVELHEADERFLAG) + { + level -= SC_FOLDLEVELBASE; + if (level2Collapse == (level & SC_FOLDLEVELNUMBERMASK)) + if ((execute(SCI_GETFOLDEXPANDED, line) != 0) != mode) + execute(SCI_TOGGLEFOLD, line); + } + } + + runMarkers(true, 0, true, false); +} + +void ScintillaEditView::foldCurrentPos(bool mode) +{ + // The following code is needed : + execute(SCI_COLOURISE, 0, -1); + // according to the Scitilla document : + // This requests the current lexer or the container (if the lexer is set to SCLEX_CONTAINER) + // to style the document between startPos and endPos. If endPos is -1, the document is styled from startPos to the end. + // If the "fold" property is set to "1" and your lexer or container supports folding, fold levels are also set. + // This message causes a redraw. + + int currentLine = this->getCurrentLineNumber(); + + int headerLine; + int level = execute(SCI_GETFOLDLEVEL, currentLine); + + if (level & SC_FOLDLEVELHEADERFLAG) + headerLine = currentLine; + else + { + headerLine = execute(SCI_GETFOLDPARENT, currentLine); + if (headerLine == -1) + return; + } + if ((execute(SCI_GETFOLDEXPANDED, headerLine) != 0) != mode) + execute(SCI_TOGGLEFOLD, headerLine); + +} + +void ScintillaEditView::foldAll(bool mode) +{ + // The following code is needed : + execute(SCI_COLOURISE, 0, -1); + // according to the Scitilla document : + // This requests the current lexer or the container (if the lexer is set to SCLEX_CONTAINER) + // to style the document between startPos and endPos. If endPos is -1, the document is styled from startPos to the end. + // If the "fold" property is set to "1" and your lexer or container supports folding, fold levels are also set. + // This message causes a redraw. + + int maxLine = execute(SCI_GETLINECOUNT); + + for (int line = 0; line < maxLine; line++) + { + int level = execute(SCI_GETFOLDLEVEL, line); + if (level & SC_FOLDLEVELHEADERFLAG) + if ((execute(SCI_GETFOLDEXPANDED, line) != 0) != mode) + execute(SCI_TOGGLEFOLD, line); + } +} + +void ScintillaEditView::getText(char *dest, int start, int end) const +{ + TextRange tr; + tr.chrg.cpMin = start; + tr.chrg.cpMax = end; + tr.lpstrText = dest; + execute(SCI_GETTEXTRANGE, 0, reinterpret_cast(&tr)); +} + +void ScintillaEditView::getGenericText(TCHAR *dest, int start, int end) const +{ +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + char *destA = new char[end - start + 1]; + getText(destA, start, end); + unsigned int cp = execute(SCI_GETCODEPAGE); + const TCHAR *destW = wmc->char2wchar(destA, cp); + lstrcpy(dest, destW); + delete [] destA; +#else + getText(dest, start, end); +#endif +} + +// "mstart" and "mend" are pointers to indexes in the read string, +// which are converted to the corresponding indexes in the returned TCHAR string. +void ScintillaEditView::getGenericText(TCHAR *dest, int start, int end, int *mstart, int *mend) const +{ +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + char *destA = new char[end - start + 1]; + getText(destA, start, end); + unsigned int cp = execute(SCI_GETCODEPAGE); + const TCHAR *destW = wmc->char2wchar(destA, cp, mstart, mend); + lstrcpy(dest, destW); + delete [] destA; +#else + getText(dest, start, end); +#endif +} + +void ScintillaEditView::insertGenericTextFrom(int position, const TCHAR *text2insert) const +{ +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + unsigned int cp = execute(SCI_GETCODEPAGE); + const char *text2insertA = wmc->wchar2char(text2insert, cp); + execute(SCI_INSERTTEXT, position, (WPARAM)text2insertA); +#else + execute(SCI_INSERTTEXT, position, (WPARAM)text2insert); +#endif +} + +void ScintillaEditView::replaceSelWith(const char * replaceText) +{ + execute(SCI_REPLACESEL, 0, (WPARAM)replaceText); +} + +char * ScintillaEditView::getSelectedText(char * txt, int size, bool expand) +{ + if (!size) + return NULL; + CharacterRange range = getSelection(); + if (range.cpMax == range.cpMin && expand) + { + expandWordSelection(); + range = getSelection(); + } + if (!(size > (range.cpMax - range.cpMin))) //there must be atleast 1 byte left for zero terminator + { + range.cpMax = range.cpMin+size-1; //keep room for zero terminator + } + getText(txt, range.cpMin, range.cpMax); + return txt; +} + +TCHAR * ScintillaEditView::getGenericSelectedText(TCHAR * txt, int size, bool expand) +{ + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + unsigned int cp = execute(SCI_GETCODEPAGE); +#ifdef UNICODE + char *txtA = new char[size + 1]; + getSelectedText(txtA, size, expand); + + const TCHAR * txtW = wmc->char2wchar(txtA, cp); + lstrcpy(txt, txtW); + delete [] txtA; + return txt; +#else + return getSelectedText(txt, size, expand); +#endif +} + +int ScintillaEditView::searchInTarget(const TCHAR * text2Find, int fromPos, int toPos) const +{ + execute(SCI_SETTARGETSTART, fromPos); + execute(SCI_SETTARGETEND, toPos); +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + unsigned int cp = execute(SCI_GETCODEPAGE); + const char *text2FindA = wmc->wchar2char(text2Find, cp); + int targetFound = execute(SCI_SEARCHINTARGET, (WPARAM)strlen(text2FindA), (LPARAM)text2FindA); + return targetFound; +#else + return execute(SCI_SEARCHINTARGET, (WPARAM)strlen(text2Find), (LPARAM)text2Find); +#endif +} + +void ScintillaEditView::appandGenericText(const TCHAR * text2Append) const +{ +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + unsigned int cp = execute(SCI_GETCODEPAGE); + const char *text2AppendA =wmc->wchar2char(text2Append, cp); + execute(SCI_APPENDTEXT, strlen(text2AppendA), (LPARAM)text2AppendA); +#else + execute(SCI_APPENDTEXT, strlen(text2Append), (LPARAM)text2Append); +#endif +} + +void ScintillaEditView::addGenericText(const TCHAR * text2Append) const +{ +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + unsigned int cp = execute(SCI_GETCODEPAGE); + const char *text2AppendA =wmc->wchar2char(text2Append, cp); + execute(SCI_ADDTEXT, strlen(text2AppendA), (LPARAM)text2AppendA); +#else + execute(SCI_ADDTEXT, strlen(text2Append), (LPARAM)text2Append); +#endif +} + +void ScintillaEditView::addGenericText(const TCHAR * text2Append, long *mstart, long *mend) const +{ +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + unsigned int cp = execute(SCI_GETCODEPAGE); + const char *text2AppendA =wmc->wchar2char(text2Append, cp, mstart, mend); + execute(SCI_ADDTEXT, strlen(text2AppendA), (LPARAM)text2AppendA); +#else + execute(SCI_ADDTEXT, strlen(text2Append), (LPARAM)text2Append); +#endif +} + +int ScintillaEditView::replaceTarget(const TCHAR * str2replace, int fromTargetPos, int toTargetPos) const +{ + if (fromTargetPos != -1 || toTargetPos != -1) + { + execute(SCI_SETTARGETSTART, fromTargetPos); + execute(SCI_SETTARGETEND, toTargetPos); + } +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + unsigned int cp = execute(SCI_GETCODEPAGE); + const char *str2replaceA = wmc->wchar2char(str2replace, cp); + return execute(SCI_REPLACETARGET, -1, (LPARAM)str2replaceA); +#else + return execute(SCI_REPLACETARGET, -1, (LPARAM)str2replace); +#endif +} + +int ScintillaEditView::replaceTargetRegExMode(const TCHAR * re, int fromTargetPos, int toTargetPos) const +{ + if (fromTargetPos != -1 || toTargetPos != -1) + { + execute(SCI_SETTARGETSTART, fromTargetPos); + execute(SCI_SETTARGETEND, toTargetPos); + } +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + unsigned int cp = execute(SCI_GETCODEPAGE); + const char *reA = wmc->wchar2char(re, cp); + return execute(SCI_REPLACETARGETRE, -1, (LPARAM)reA); +#else + return execute(SCI_REPLACETARGETRE, -1, (LPARAM)re); +#endif +} + +void ScintillaEditView::showAutoComletion(int lenEntered, const TCHAR * list) +{ +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + unsigned int cp = execute(SCI_GETCODEPAGE); + const char *listA = wmc->wchar2char(list, cp); + execute(SCI_AUTOCSHOW, lenEntered, WPARAM(listA)); +#else + execute(SCI_AUTOCSHOW, lenEntered, WPARAM(list)); +#endif +} + +void ScintillaEditView::showCallTip(int startPos, const TCHAR * def) +{ +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + unsigned int cp = execute(SCI_GETCODEPAGE); + const char *defA = wmc->wchar2char(def, cp); + execute(SCI_CALLTIPSHOW, startPos, LPARAM(defA)); +#else + execute(SCI_CALLTIPSHOW, startPos, (LPARAM)def); +#endif +} + + +void ScintillaEditView::getLine(int lineNumber, TCHAR * line, int lineBufferLen) +{ +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + unsigned int cp = execute(SCI_GETCODEPAGE); + char *lineA = new char[lineBufferLen]; + execute(SCI_GETLINE, lineNumber, (LPARAM)lineA); + const TCHAR *lineW = wmc->char2wchar(lineA, cp); + lstrcpy(line, lineW); + delete [] lineA; +#else + execute(SCI_GETLINE, lineNumber, (LPARAM)line); +#endif +} + + +void ScintillaEditView::addText(int length, const char *buf) +{ + execute(SCI_ADDTEXT, length, (LPARAM)buf); +} + +void ScintillaEditView::marginClick(int position, int modifiers) +{ + int lineClick = int(execute(SCI_LINEFROMPOSITION, position, 0)); + int levelClick = int(execute(SCI_GETFOLDLEVEL, lineClick, 0)); + if (levelClick & SC_FOLDLEVELHEADERFLAG) + { + if (modifiers & SCMOD_SHIFT) + { + // Ensure all children visible + execute(SCI_SETFOLDEXPANDED, lineClick, 1); + expand(lineClick, true, true, 100, levelClick); + } + else if (modifiers & SCMOD_CTRL) + { + if (execute(SCI_GETFOLDEXPANDED, lineClick, 0)) + { + // Contract this line and all children + execute(SCI_SETFOLDEXPANDED, lineClick, 0); + expand(lineClick, false, true, 0, levelClick); + } + else + { + // Expand this line and all children + execute(SCI_SETFOLDEXPANDED, lineClick, 1); + expand(lineClick, true, true, 100, levelClick); + } + } + else + { + // Toggle this line + execute(SCI_TOGGLEFOLD, lineClick, 0); + runMarkers(true, lineClick, true, false); + } + } +} + +void ScintillaEditView::expand(int &line, bool doExpand, bool force, int visLevels, int level) +{ + int lineMaxSubord = int(execute(SCI_GETLASTCHILD, line, level & SC_FOLDLEVELNUMBERMASK)); + line++; + while (line <= lineMaxSubord) + { + if (force) + { + if (visLevels > 0) + execute(SCI_SHOWLINES, line, line); + else + execute(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 (visLevels > 1) + execute(SCI_SETFOLDEXPANDED, line, 1); + else + execute(SCI_SETFOLDEXPANDED, line, 0); + expand(line, doExpand, force, visLevels - 1); + } + else + { + if (doExpand) + { + if (!execute(SCI_GETFOLDEXPANDED, line, 0)) + execute(SCI_SETFOLDEXPANDED, line, 1); + + expand(line, true, force, visLevels - 1); + } + else + { + expand(line, false, force, visLevels - 1); + } + } + } + else + { + line++; + } + } + + runMarkers(true, 0, true, false); +} + +void ScintillaEditView::performGlobalStyles() +{ + StyleArray & stylers = _pParameter->getMiscStylerArray(); + + int i = stylers.getStylerIndexByName(TEXT("Current line background colour")); + if (i != -1) + { + Style & style = stylers.getStyler(i); + execute(SCI_SETCARETLINEBACK, style._bgColor); + } +/* + i = stylers.getStylerIndexByName(TEXT("Mark colour")); + if (i != -1) + { + Style & style = stylers.getStyler(i); + execute(SCI_MARKERSETFORE, 1, style._fgColor); + execute(SCI_MARKERSETBACK, 1, style._bgColor); + } +*/ + COLORREF selectColorBack = grey; + + i = stylers.getStylerIndexByName(TEXT("Selected text colour")); + if (i != -1) + { + Style & style = stylers.getStyler(i); + selectColorBack = style._bgColor; + } + execute(SCI_SETSELBACK, 1, selectColorBack); + + COLORREF caretColor = black; + i = stylers.getStylerIndexByID(SCI_SETCARETFORE); + if (i != -1) + { + Style & style = stylers.getStyler(i); + caretColor = style._fgColor; + } + execute(SCI_SETCARETFORE, caretColor); + + COLORREF edgeColor = liteGrey; + i = stylers.getStylerIndexByName(TEXT("Edge colour")); + if (i != -1) + { + Style & style = stylers.getStyler(i); + edgeColor = style._fgColor; + } + execute(SCI_SETEDGECOLOUR, edgeColor); + + COLORREF foldMarginColor = grey; + COLORREF foldMarginHiColor = white; + i = stylers.getStylerIndexByName(TEXT("Fold margin")); + if (i != -1) + { + Style & style = stylers.getStyler(i); + foldMarginHiColor = style._fgColor; + foldMarginColor = style._bgColor; + } + execute(SCI_SETFOLDMARGINCOLOUR, true, foldMarginColor); + execute(SCI_SETFOLDMARGINHICOLOUR, true, foldMarginHiColor); + + COLORREF foldfgColor = white; + COLORREF foldbgColor = grey; + i = stylers.getStylerIndexByName(TEXT("Fold")); + + if (i != -1) + { + Style & style = stylers.getStyler(i); + foldfgColor = style._bgColor; + foldbgColor = style._fgColor; + } + for (int j = 0 ; j < NB_FOLDER_STATE ; j++) + defineMarker(_markersArray[FOLDER_TYPE][j], _markersArray[_folderStyle][j], foldfgColor, foldbgColor); +/* + COLORREF unsavedChangebgColor = liteRed; + i = stylers.getStylerIndexByName(TEXT("Unsaved change marker")); + if (i != -1) + { + Style & style = stylers.getStyler(i); + unsavedChangebgColor = style._bgColor; + } + execute(SCI_MARKERSETBACK, MARK_LINEMODIFIEDUNSAVED, unsavedChangebgColor); + + COLORREF savedChangebgColor = liteBlueGreen; + i = stylers.getStylerIndexByName(TEXT("Saved change marker")); + if (i != -1) + { + Style & style = stylers.getStyler(i); + savedChangebgColor = style._bgColor; + } + execute(SCI_MARKERSETBACK, MARK_LINEMODIFIEDSAVED, savedChangebgColor); +*/ + COLORREF wsSymbolFgColor = black; + i = stylers.getStylerIndexByName(TEXT("White space symbol")); + if (i != -1) + { + Style & style = stylers.getStyler(i); + wsSymbolFgColor = style._fgColor; + } + execute(SCI_SETWHITESPACEFORE, true, wsSymbolFgColor); +} + +void ScintillaEditView::setLineIndent(int line, int indent) const { + if (indent < 0) + return; + CharacterRange crange = getSelection(); + int posBefore = execute(SCI_GETLINEINDENTPOSITION, line); + execute(SCI_SETLINEINDENTATION, line, indent); + int posAfter = execute(SCI_GETLINEINDENTPOSITION, line); + int posDifference = posAfter - posBefore; + if (posAfter > posBefore) { + // Move selection on + if (crange.cpMin >= posBefore) { + crange.cpMin += posDifference; + } + if (crange.cpMax >= posBefore) { + crange.cpMax += posDifference; + } + } else if (posAfter < posBefore) { + // Move selection back + if (crange.cpMin >= posAfter) { + if (crange.cpMin >= posBefore) + crange.cpMin += posDifference; + else + crange.cpMin = posAfter; + } + if (crange.cpMax >= posAfter) { + if (crange.cpMax >= posBefore) + crange.cpMax += posDifference; + else + crange.cpMax = posAfter; + } + } + execute(SCI_SETSEL, crange.cpMin, crange.cpMax); +} + +const char * ScintillaEditView::getCompleteKeywordList(std::basic_string & kwl, LangType langType, int keywordIndex) +{ + kwl += " "; + const TCHAR *defKwl_generic = _pParameter->getWordList(langType, keywordIndex); + +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + const char * defKwl = wmc->wchar2char(defKwl_generic, CP_ACP); + kwl += defKwl?defKwl:""; +#else + kwl += defKwl_generic?defKwl_generic:""; +#endif + + return kwl.c_str(); +} + + +void ScintillaEditView::convertSelectedTextTo(bool Case) +{ + unsigned int codepage = _codepage; + UniMode um = getCurrentBuffer()->getUnicodeMode(); + if (um != uni8Bit) + codepage = CP_UTF8; + + if (execute(SCI_SELECTIONISRECTANGLE)) + { + execute(SCI_BEGINUNDOACTION); + + int selStart = execute(SCI_GETSELECTIONSTART); + int selEnd = execute(SCI_GETSELECTIONEND); + + ColumnModeInfo cmi = getColumnModeSelectInfo(); + const int len = cmi[0].second - cmi[0].first; + char *srcStr = new char[len+1]; + wchar_t *destStr = new wchar_t[len+3]; + for (size_t i = 0 ; i < cmi.size() ; i++) + { + int start = cmi[i].first; + int end = cmi[i].second; + getText(srcStr, start, end); + + int nbChar = ::MultiByteToWideChar(codepage, 0, srcStr, len, destStr, len); + + for (int j = 0 ; j < nbChar ; j++) + { + if (Case == UPPERCASE) + destStr[j] = (wchar_t)::CharUpperW((LPWSTR)destStr[j]); + else + destStr[j] = (wchar_t)::CharLowerW((LPWSTR)destStr[j]); + } + ::WideCharToMultiByte(codepage, 0, destStr, len, srcStr, len, NULL, NULL); + + execute(SCI_SETTARGETSTART, start); + execute(SCI_SETTARGETEND, end); + execute(SCI_REPLACETARGET, -1, (LPARAM)srcStr); + } + + delete [] srcStr; + delete [] destStr; + + execute(SCI_SETSELECTIONSTART, selStart); + execute(SCI_SETSELECTIONEND, selEnd); + + execute(SCI_ENDUNDOACTION); + return; + } + + size_t selectionStart = execute(SCI_GETSELECTIONSTART); + size_t selectionEnd = execute(SCI_GETSELECTIONEND); + + int strSize = ((selectionEnd > selectionStart)?(selectionEnd - selectionStart):(selectionStart - selectionEnd))+1; + if (strSize) + { + char *selectedStr = new char[strSize+1]; + int strWSize = strSize * 2; + wchar_t *selectedStrW = new wchar_t[strWSize+3]; + + execute(SCI_GETSELTEXT, 0, (LPARAM)selectedStr); + + int nbChar = ::MultiByteToWideChar(codepage, 0, selectedStr, strSize, selectedStrW, strWSize); + + for (int i = 0 ; i < nbChar ; i++) + { + if (Case == UPPERCASE) + selectedStrW[i] = (WCHAR)::CharUpperW((LPWSTR)selectedStrW[i]); + else + selectedStrW[i] = (WCHAR)::CharLowerW((LPWSTR)selectedStrW[i]); + } + ::WideCharToMultiByte(codepage, 0, selectedStrW, strWSize, selectedStr, strSize, NULL, NULL); + + execute(SCI_REPLACESEL, strSize, (LPARAM)selectedStr); + execute(SCI_SETSEL, selectionStart, selectionEnd); + delete [] selectedStr; + delete [] selectedStrW; + } +} + + +bool ScintillaEditView::expandWordSelection() +{ + int caretPos = execute(SCI_GETCURRENTPOS, 0, 0); + int startPos = static_cast(execute(SCI_WORDSTARTPOSITION, caretPos, true)); + int endPos = static_cast(execute(SCI_WORDENDPOSITION, caretPos, true)); + if (startPos != endPos) { + execute(SCI_SETSELECTIONSTART, startPos); + execute(SCI_SETSELECTIONEND, endPos); + return true; + } + return false; +} + +TCHAR * int2str(TCHAR *str, int strLen, int number, int base, int nbChiffre, bool isZeroLeading) +{ + if (nbChiffre >= strLen) return NULL; + TCHAR f[64]; + TCHAR fStr[2] = TEXT("d"); + if (base == 16) + fStr[0] = 'X'; + else if (base == 8) + fStr[0] = 'o'; + else if (base == 2) + { + const unsigned int MASK_ULONG_BITFORT = 0x80000000; + int nbBits = sizeof(unsigned int) * 8; + int nbBit2Shift = (nbChiffre >= nbBits)?nbBits:(nbBits - nbChiffre); + unsigned long mask = MASK_ULONG_BITFORT >> nbBit2Shift; + int i = 0; + for (; mask > 0 ; i++) + { + str[i] = (mask & number)?'1':'0'; + mask >>= 1; + } + str[i] = '\0'; + } + + if (!isZeroLeading) + { + if (base == 2) + { + TCHAR *j = str; + for ( ; *j != '\0' ; j++) + if (*j == '1') + break; + lstrcpy(str, j); + } + else + { + wsprintf(f, TEXT("%%%s"), fStr); + wsprintf(str, f, number); + } + int i = lstrlen(str); + for ( ; i < nbChiffre ; i++) + str[i] = ' '; + str[i] = '\0'; + } + else + { + if (base != 2) + { + wsprintf(f, TEXT("%%.%d%s"), nbChiffre, fStr); + wsprintf(str, f, number); + } + // else already done. + } + return str; +} + +ColumnModeInfo ScintillaEditView::getColumnModeSelectInfo() +{ + ColumnModeInfo columnModeInfo; + if (execute(SCI_SELECTIONISRECTANGLE)) + { + int selStartAbsPos = execute(SCI_GETSELECTIONSTART); + int selEndAbsPos = execute(SCI_GETSELECTIONEND); + + int startCol = execute(SCI_GETCOLUMN, selStartAbsPos); + int endCol = execute(SCI_GETCOLUMN, selEndAbsPos); + + int startLine = execute(SCI_LINEFROMPOSITION, selStartAbsPos); + int endLine = execute(SCI_LINEFROMPOSITION, selEndAbsPos); + + if (endCol < startCol)// another way of selection + { + int tmp = startCol; + startCol = endCol; + endCol = tmp; + + selStartAbsPos = execute(SCI_FINDCOLUMN, startLine, startCol); + selEndAbsPos = execute(SCI_FINDCOLUMN, endLine, endCol); + } + + bool zeroCharSelMode = true; + for (int i = startLine ; i <= endLine ; i++) + { + int absPosSelStartPerLine = execute(SCI_FINDCOLUMN, i, startCol); + int absPosSelEndPerLine = execute(SCI_FINDCOLUMN, i, endCol); + + if (absPosSelStartPerLine != absPosSelEndPerLine) + { + zeroCharSelMode = false; + } + columnModeInfo.push_back(pair(absPosSelStartPerLine, absPosSelEndPerLine)); + } + + if (!zeroCharSelMode) + { + for (int i = columnModeInfo.size() - 1 ; i >= 0 ; i--) + { + ColumnModeInfo::iterator it = columnModeInfo.begin() + i; + if (it->first == it->second) + columnModeInfo.erase(it); + } + } + } + return columnModeInfo; +} + +void ScintillaEditView::columnReplace(ColumnModeInfo & cmi, const TCHAR *str) +{ + //for (int i = (int)cmi.size() - 1 ; i >= 0 ; i--) + int totalDiff = 0; + for (size_t i = 0 ; i < cmi.size() ; i++) + { + int len2beReplace = cmi[i].second - cmi[i].first; + int diff = lstrlen(str) - len2beReplace; + + cmi[i].first += totalDiff; + cmi[i].second += totalDiff; + + execute(SCI_SETTARGETSTART, cmi[i].first); + execute(SCI_SETTARGETEND, cmi[i].second); +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + unsigned int cp = execute(SCI_GETCODEPAGE); + const char *strA = wmc->wchar2char(str, cp); + execute(SCI_REPLACETARGET, -1, (LPARAM)strA); +#else + execute(SCI_REPLACETARGET, -1, (LPARAM)str); +#endif + totalDiff += diff; + cmi[i].second += diff; + } +} + + +void ScintillaEditView::columnReplace(ColumnModeInfo & cmi, int initial, int incr, UCHAR format) +{ + // 0000 00 00 : Dec BASE_10 + // 0000 00 01 : Hex BASE_16 + // 0000 00 10 : Oct BASE_08 + // 0000 00 11 : Bin BASE_02 + + // 0000 01 00 : 0 leading + + //Defined in ScintillaEditView.h : + //const UCHAR MASK_FORMAT = 0x03; + //const UCHAR MASK_ZERO_LEADING = 0x04; + + UCHAR f = format & MASK_FORMAT; + bool isZeroLeading = (MASK_ZERO_LEADING & format) != 0; + + int base = 10; + if (f == BASE_16) + base = 16; + else if (f == BASE_08) + base = 8; + else if (f == BASE_02) + base = 2; + + int endNumber = initial + incr * (cmi.size() - 1); + int nbEnd = getNbChiffre(endNumber, base); + int nbInit = getNbChiffre(initial, base); + int nb = max(nbInit, nbEnd); + + const int stringSize = 512; + TCHAR str[stringSize]; + + int totalDiff = 0; + for (size_t i = 0 ; i < cmi.size() ; i++) + { + int len2beReplace = cmi[i].second - cmi[i].first; + int diff = nb - len2beReplace; + + cmi[i].first += totalDiff; + cmi[i].second += totalDiff; + + int2str(str, stringSize, initial, base, nb, isZeroLeading); + + execute(SCI_SETTARGETSTART, cmi[i].first); + execute(SCI_SETTARGETEND, cmi[i].second); +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + unsigned int cp = execute(SCI_GETCODEPAGE); + const char *strA = wmc->wchar2char(str, cp); + execute(SCI_REPLACETARGET, -1, (LPARAM)strA); +#else + execute(SCI_REPLACETARGET, -1, (LPARAM)str); +#endif + initial += incr; + totalDiff += diff; + cmi[i].second += diff; + } +} + + +void ScintillaEditView::foldChanged(int line, int levelNow, int levelPrev) +{ + if (levelNow & SC_FOLDLEVELHEADERFLAG) //line can be folded + { + if (!(levelPrev & SC_FOLDLEVELHEADERFLAG)) //but previously couldnt + { + // Adding a fold point. + execute(SCI_SETFOLDEXPANDED, line, 1); + expand(line, true, false, 0, levelPrev); + } + } + else if (levelPrev & SC_FOLDLEVELHEADERFLAG) + { + if (!execute(SCI_GETFOLDEXPANDED, line)) + { + // Removing the fold from one that has been contracted so should expand + // otherwise lines are left invisible with no way to make them visible + execute(SCI_SETFOLDEXPANDED, line, 1); + expand(line, true, false, 0, levelPrev); + } + } + else if (!(levelNow & SC_FOLDLEVELWHITEFLAG) && + ((levelPrev & SC_FOLDLEVELNUMBERMASK) > (levelNow & SC_FOLDLEVELNUMBERMASK))) + { + // See if should still be hidden + int parentLine = execute(SCI_GETFOLDPARENT, line); + if ((parentLine < 0) || (execute(SCI_GETFOLDEXPANDED, parentLine) && execute(SCI_GETLINEVISIBLE, parentLine))) + execute(SCI_SHOWLINES, line, line); + } +} + +void ScintillaEditView::hideLines() { + //Folding can screw up hide lines badly if it unfolds a hidden section. + //Adding runMarkers(hide, foldstart) directly (folding on single document) can help + + //Special func on buffer. If markers are added, create notification with location of start, and hide bool set to true + int startLine = execute(SCI_LINEFROMPOSITION, execute(SCI_GETSELECTIONSTART)); + int endLine = execute(SCI_LINEFROMPOSITION, execute(SCI_GETSELECTIONEND)); + //perform range check: cannot hide very first and very last lines + //Offset them one off the edges, and then check if they are within the reasonable + int nrLines = execute(SCI_GETLINECOUNT); + if (nrLines < 3) + return; //cannot possibly hide anything + if (!startLine) + startLine++; + if (endLine == (nrLines-1)) + endLine--; + + if (startLine > endLine) + return; //tried to hide line at edge + + //Hide the lines. We add marks on the outside of the hidden section and hide the lines + //execute(SCI_HIDELINES, startLine, endLine); + //Add markers + execute(SCI_MARKERADD, startLine-1, MARK_HIDELINESBEGIN); + execute(SCI_MARKERADD, endLine+1, MARK_HIDELINESEND); + + //remove any markers in between + int scope = 0; + for(int i = startLine; i <= endLine; i++) { + int state = execute(SCI_MARKERGET, i); + bool closePresent = ((state & (1 << MARK_HIDELINESEND)) != 0); //check close first, then open, since close closes scope + bool openPresent = ((state & (1 << MARK_HIDELINESBEGIN)) != 0); + if (closePresent) { + execute(SCI_MARKERDELETE, i, MARK_HIDELINESEND); + if (scope > 0) scope--; + } + if (openPresent) { + execute(SCI_MARKERDELETE, i, MARK_HIDELINESBEGIN); + scope++; + } + } + if (scope != 0) { //something went wrong + //Someone managed to make overlapping hidelines sections. + //We cant do anything since this isnt supposed to happen + } + + _currentBuffer->setHideLineChanged(true, startLine-1); +} + +void ScintillaEditView::setHiLiteResultWords(const TCHAR *keywords) +{ +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + const char * word2search = wmc->wchar2char(keywords, CP_ACP); + setKeywords(L_SEARCHRESULT, word2search, 0); +#else + setKeywords(L_SEARCHRESULT, keywords, 0); +#endif +} + +bool ScintillaEditView::markerMarginClick(int lineNumber) { + + int state = execute(SCI_MARKERGET, lineNumber); + bool openPresent = ((state & (1 << MARK_HIDELINESBEGIN)) != 0); + bool closePresent = ((state & (1 << MARK_HIDELINESEND)) != 0); + + if (!openPresent && !closePresent) + return false; + + //Special func on buffer. First call show with location of opening marker. Then remove the marker manually + if (openPresent) { + _currentBuffer->setHideLineChanged(false, lineNumber); + } + if (closePresent) { + openPresent = false; + for(lineNumber--; lineNumber >= 0 && !openPresent; lineNumber--) { + state = execute(SCI_MARKERGET, lineNumber); + openPresent = ((state & (1 << MARK_HIDELINESBEGIN)) != 0); + } + if (openPresent) { + _currentBuffer->setHideLineChanged(false, lineNumber); + } + } + + return true; +} + +void ScintillaEditView::notifyMarkers(Buffer * buf, bool isHide, int location, bool del) { + if (buf != _currentBuffer) //if not visible buffer dont do a thing + return; + runMarkers(isHide, location, false, del); +} +//Run through full document. When switching in or opening folding +//hide is false only when user click on margin +void ScintillaEditView::runMarkers(bool doHide, int searchStart, bool endOfDoc, bool doDelete) { + //Removes markers if opening + /* + AllLines = (start,ENDOFDOCUMENT) + Hide: + Run through all lines. + Find open hiding marker: + set hiding start + Find closing: + if (hiding): + Hide lines between now and start + if (endOfDoc = false) + return + else + search for other hidden sections + + Show: + Run through all lines + Find open hiding marker + set last start + Find closing: + Show from last start. Stop. + Find closed folding header: + Show from last start to folding header + Skip to LASTCHILD + Set last start to lastchild + */ + int maxLines = execute(SCI_GETLINECOUNT); + if (doHide) { + int startHiding = searchStart; + bool isInSection = false; + for(int i = searchStart; i < maxLines; i++) { + int state = execute(SCI_MARKERGET, i); + if ( ((state & (1 << MARK_HIDELINESEND)) != 0) ) { + if (isInSection) { + execute(SCI_HIDELINES, startHiding, i-1); + if (!endOfDoc) { + return; //done, only single section requested + } //otherwise keep going + } + isInSection = false; + } + if ( ((state & (1 << MARK_HIDELINESBEGIN)) != 0) ) { + isInSection = true; + startHiding = i+1; + } + + } + } else { + int startShowing = searchStart; + bool isInSection = false; + for(int i = searchStart; i < maxLines; i++) { + int state = execute(SCI_MARKERGET, i); + if ( ((state & (1 << MARK_HIDELINESEND)) != 0) ) { + if (doDelete) + execute(SCI_MARKERDELETE, i, MARK_HIDELINESEND); + else if (isInSection) { + if (startShowing >= i) { //because of fold skipping, we passed the close tag. In that case we cant do anything + if (!endOfDoc) { + return; + } else { + continue; + } + } + execute(SCI_SHOWLINES, startShowing, i-1); + if (!endOfDoc) { + return; //done, only single section requested + } //otherwise keep going + isInSection = false; + } + } + if ( ((state & (1 << MARK_HIDELINESBEGIN)) != 0) ) { + if (doDelete) + execute(SCI_MARKERDELETE, i, MARK_HIDELINESBEGIN); + else { + isInSection = true; + startShowing = i+1; + } + } + + int levelLine = execute(SCI_GETFOLDLEVEL, i, 0); + if (levelLine & SC_FOLDLEVELHEADERFLAG) { //fold section. Dont show lines if fold is closed + if (isInSection && execute(SCI_GETFOLDEXPANDED, i) == 0) { + execute(SCI_SHOWLINES, startShowing, i); + startShowing = execute(SCI_GETLASTCHILD, i, (levelLine & SC_FOLDLEVELNUMBERMASK)); + } + } + } + } +} diff --git a/PowerEditor/src/ScitillaComponent/ScintillaEditView.h b/PowerEditor/src/ScitillaComponent/ScintillaEditView.h new file mode 100644 index 00000000..a1ba1388 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/ScintillaEditView.h @@ -0,0 +1,821 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef SCINTILLA_EDIT_VIEW_H +#define SCINTILLA_EDIT_VIEW_H + +#include +#include "Window.h" +#include "Scintilla.h" +#include "ScintillaRef.h" +#include "SciLexer.h" +#include "Buffer.h" +#include "colors.h" +#include "UserDefineDialog.h" +#include "xpm_icons.h" +#include "resource.h" + +#ifndef WM_MOUSEWHEEL +#define WM_MOUSEWHEEL 0x020A +#endif //WM_MOUSEWHEEL + +#ifndef WM_MOUSEHWHEEL +#define WM_MOUSEHWHEEL 0x020E +#endif //WM_MOUSEHWHEEL + +#ifndef WM_APPCOMMAND +#define WM_APPCOMMAND 0x0319 +#define APPCOMMAND_BROWSER_BACKWARD 1 +#define APPCOMMAND_BROWSER_FORWARD 2 +#define FAPPCOMMAND_MASK 0xF000 +#define GET_APPCOMMAND_LPARAM(lParam) ((short)(HIWORD(lParam) & ~FAPPCOMMAND_MASK)) +#endif //WM_APPCOMMAND + +class NppParameters; + +#define NB_WORD_LIST 4 +#define WORD_LIST_LEN 256 + +typedef int (* SCINTILLA_FUNC) (void*, int, int, int); +typedef void * SCINTILLA_PTR; + +#define WM_DOCK_USERDEFINE_DLG (SCINTILLA_USER + 1) +#define WM_UNDOCK_USERDEFINE_DLG (SCINTILLA_USER + 2) +#define WM_CLOSE_USERDEFINE_DLG (SCINTILLA_USER + 3) +#define WM_REMOVE_USERLANG (SCINTILLA_USER + 4) +#define WM_RENAME_USERLANG (SCINTILLA_USER + 5) +#define WM_REPLACEALL_INOPENEDDOC (SCINTILLA_USER + 6) +#define WM_FINDALL_INOPENEDDOC (SCINTILLA_USER + 7) +#define WM_DOOPEN (SCINTILLA_USER + 8) +#define WM_FINDINFILES (SCINTILLA_USER + 9) +#define WM_REPLACEINFILES (SCINTILLA_USER + 10) +#define WM_FINDALL_INCURRENTDOC (SCINTILLA_USER + 11) + +const int NB_FOLDER_STATE = 7; + +// Codepage +const int CP_CHINESE_TRADITIONAL = 950; +const int CP_CHINESE_SIMPLIFIED = 936; +const int CP_JAPANESE = 932; +const int CP_KOREAN = 949; +const int CP_GREEK = 1253; + +//wordList +#define LIST_NONE 0 +#define LIST_0 1 +#define LIST_1 2 +#define LIST_2 4 +#define LIST_3 8 +#define LIST_4 16 +#define LIST_5 32 +#define LIST_6 64 + +const bool fold_uncollapse = true; +const bool fold_collapse = false; + +const bool UPPERCASE = true; +const bool LOWERCASE = false; + +typedef vector > ColumnModeInfo; +const UCHAR MASK_FORMAT = 0x03; +const UCHAR MASK_ZERO_LEADING = 0x04; +const UCHAR BASE_10 = 0x00; // Dec +const UCHAR BASE_16 = 0x01; // Hex +const UCHAR BASE_08 = 0x02; // Oct +const UCHAR BASE_02 = 0x03; // Bin + + +const int MARK_BOOKMARK = 24; +const int MARK_HIDELINESBEGIN = 23; +const int MARK_HIDELINESEND = 22; +//const int MARK_LINEMODIFIEDUNSAVED = 21; +//const int MARK_LINEMODIFIEDSAVED = 20; +// 24 - 16 reserved for Notepad++ internal used +// 15 - 0 are free to use for plugins + + +static int getNbChiffre(int aNum, int base) +{ + int nbChiffre = 1; + int diviseur = base; + + for (;;) + { + int result = aNum / diviseur; + if (!result) + break; + else + { + diviseur *= base; + nbChiffre++; + } + } + if ((base == 16) && (nbChiffre % 2 != 0)) + nbChiffre += 1; + + return nbChiffre; +}; + +TCHAR * int2str(TCHAR *str, int strLen, int number, int base, int nbChiffre, bool isZeroLeading); + +typedef LRESULT (WINAPI *CallWindowProcFunc) (WNDPROC,HWND,UINT,WPARAM,LPARAM); + +struct LanguageName { + const TCHAR * lexerName; + const TCHAR * shortName; + const TCHAR * longName; + LangType LangID; + int lexerID; +}; + +class ScintillaEditView : public Window +{ + friend class Notepad_plus; + friend class Finder; +public: + ScintillaEditView() + : Window(), _pScintillaFunc(NULL),_pScintillaPtr(NULL), + _folderStyle(FOLDER_STYLE_BOX), _lineNumbersShown(false), _wrapRestoreNeeded(false) + { + ++_refCount; + }; + + virtual ~ScintillaEditView() + { + --_refCount; + + if ((!_refCount)&&(_hLib)) + { + ::FreeLibrary(_hLib); + } + }; + virtual void destroy() + { + ::DestroyWindow(_hSelf); + _hSelf = NULL; + }; + + virtual void init(HINSTANCE hInst, HWND hPere); + + LRESULT execute(UINT Msg, WPARAM wParam=0, LPARAM lParam=0) const { + return _pScintillaFunc(_pScintillaPtr, static_cast(Msg), static_cast(wParam), static_cast(lParam)); + }; + + void activateBuffer(BufferID buffer); + + void getText(char *dest, int start, int end) const; + void getGenericText(TCHAR *dest, int start, int end) const; + void getGenericText(TCHAR *dest, int start, int end, int *mstart, int *mend) const; + void insertGenericTextFrom(int position, const TCHAR *text2insert) const; + void replaceSelWith(const char * replaceText); + + int getSelectedTextCount() { + CharacterRange range = getSelection(); + return (range.cpMax - range.cpMin); + }; + + char * getSelectedText(char * txt, int size, bool expand = true); + TCHAR * getGenericSelectedText(TCHAR * txt, int size, bool expand = true); + int searchInTarget(const TCHAR * Text2Find, int fromPos, int toPos) const; + void appandGenericText(const TCHAR * text2Append) const; + void addGenericText(const TCHAR * text2Append) const; + void addGenericText(const TCHAR * text2Append, long *mstart, long *mend) const; + int replaceTarget(const TCHAR * str2replace, int fromTargetPos = -1, int toTargetPos = -1) const; + int replaceTargetRegExMode(const TCHAR * re, int fromTargetPos = -1, int toTargetPos = -1) const; + void showAutoComletion(int lenEntered, const TCHAR * list); + void showCallTip(int startPos, const TCHAR * def); + void getLine(int lineNumber, TCHAR * line, int lineBufferLen); + void addText(int length, const char *buf); + + void saveCurrentPos(); + void restoreCurrentPos(); + void saveCurrentFold(); + void restoreCurrentFold(); + + int getCurrentDocLen() const { + return int(execute(SCI_GETLENGTH)); + }; + + CharacterRange getSelection() const { + CharacterRange crange; + crange.cpMin = long(execute(SCI_GETSELECTIONSTART)); + crange.cpMax = long(execute(SCI_GETSELECTIONEND)); + return crange; + }; + + 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, startPos, caretPos); + }; + + void doUserDefineDlg(bool willBeShown = true, bool isRTL = false) { + _userDefineDlg.doDialog(willBeShown, isRTL); + }; + + static UserDefineDialog * getUserDefineDlg() {return &_userDefineDlg;}; + + void setCaretColorWidth(int color, int width = 1) const { + execute(SCI_SETCARETFORE, color); + execute(SCI_SETCARETWIDTH, width); + }; + + void beSwitched() { + _userDefineDlg.setScintilla(this); + }; + + //Marge member and method + static const int _SC_MARGE_LINENUMBER; + static const int _SC_MARGE_SYBOLE; + static const int _SC_MARGE_FOLDER; + //static const int _SC_MARGE_MODIFMARKER; + + void showMargin(int whichMarge, bool willBeShowed = true) { + if (whichMarge == _SC_MARGE_LINENUMBER) + showLineNumbersMargin(willBeShowed); + else + { + int width = 3; + if (whichMarge == _SC_MARGE_SYBOLE || whichMarge == _SC_MARGE_FOLDER) + width = 14; + execute(SCI_SETMARGINWIDTHN, whichMarge, willBeShowed?width:0); + } + }; + + bool hasMarginShowed(int witchMarge) { + return (execute(SCI_GETMARGINWIDTHN, witchMarge, 0) != 0); + }; + + void marginClick(int position, int modifiers); + + void setMakerStyle(folderStyle style) { + if (_folderStyle == style) + return; + _folderStyle = style; + for (int i = 0 ; i < NB_FOLDER_STATE ; i++) + defineMarker(_markersArray[FOLDER_TYPE][i], _markersArray[style][i], white, grey); + }; + + folderStyle getFolderStyle() {return _folderStyle;}; + + void showWSAndTab(bool willBeShowed = true) { + execute(SCI_SETVIEWWS, willBeShowed?SCWS_VISIBLEALWAYS:SCWS_INVISIBLE); + }; + + void showEOL(bool willBeShowed = true) { + execute(SCI_SETVIEWEOL, willBeShowed); + }; + + bool isEolVisible() { + return (execute(SCI_GETVIEWEOL) != 0); + }; + void showInvisibleChars(bool willBeShowed = true) { + showWSAndTab(willBeShowed); + showEOL(willBeShowed); + }; + + bool isInvisibleCharsShown() { + return (execute(SCI_GETVIEWWS) != 0); + }; + + void showIndentGuideLine(bool willBeShowed = true) { + execute(SCI_SETINDENTATIONGUIDES, (WPARAM)willBeShowed); + }; + + bool isShownIndentGuide() const { + return (execute(SCI_GETINDENTATIONGUIDES) != 0); + }; + + void wrap(bool willBeWrapped = true) { + execute(SCI_SETWRAPMODE, (WPARAM)willBeWrapped); + }; + + bool isWrap() const { + return (execute(SCI_GETWRAPMODE) == SC_WRAP_WORD); + }; + + bool isWrapSymbolVisible() const { + return (execute(SCI_GETWRAPVISUALFLAGS) != SC_WRAPVISUALFLAG_NONE); + }; + + void showWrapSymbol(bool willBeShown = true) { + execute(SCI_SETWRAPVISUALFLAGSLOCATION, SC_WRAPVISUALFLAGLOC_END_BY_TEXT); + execute(SCI_SETWRAPVISUALFLAGS, willBeShown?SC_WRAPVISUALFLAG_END:SC_WRAPVISUALFLAG_NONE); + }; + + long getCurrentLineNumber()const { + return long(execute(SCI_LINEFROMPOSITION, execute(SCI_GETCURRENTPOS))); + }; + + long lastZeroBasedLineNumber() const { + int endPos = execute(SCI_GETLENGTH); + return execute(SCI_LINEFROMPOSITION, endPos); + }; + + long getCurrentXOffset()const{ + return long(execute(SCI_GETXOFFSET)); + }; + + void setCurrentXOffset(long xOffset){ + execute(SCI_SETXOFFSET,xOffset); + }; + + void scroll(int column, int line){ + execute(SCI_LINESCROLL, column, line); + }; + + long getCurrentPointX()const{ + return long (execute(SCI_POINTXFROMPOSITION, 0, execute(SCI_GETCURRENTPOS))); + }; + + long getCurrentPointY()const{ + return long (execute(SCI_POINTYFROMPOSITION, 0, execute(SCI_GETCURRENTPOS))); + }; + + long getTextHeight()const{ + return long(execute(SCI_TEXTHEIGHT)); + }; + + void gotoLine(int line){ + if (line < execute(SCI_GETLINECOUNT)) + execute(SCI_GOTOLINE,line); + }; + + long getCurrentColumnNumber() const { + return long(execute(SCI_GETCOLUMN, execute(SCI_GETCURRENTPOS))); + }; + + long getSelectedByteNumber() const { + long start = long(execute(SCI_GETSELECTIONSTART)); + long end = long(execute(SCI_GETSELECTIONEND)); + return (start < end)?end-start:start-end; + }; + + long getLineLength(int line) const { + return long(execute(SCI_GETLINEENDPOSITION, line) - execute(SCI_POSITIONFROMLINE, line)); + }; + + long getLineIndent(int line) const { + return long(execute(SCI_GETLINEINDENTATION, line)); + }; + + void setLineIndent(int line, int indent) const; + + void showLineNumbersMargin(bool show){ + if (show == _lineNumbersShown) return; + _lineNumbersShown = show; + if (show) + { + updateLineNumberWidth(); + } + else + { + execute(SCI_SETMARGINWIDTHN, _SC_MARGE_LINENUMBER, 0); + } + } + + void updateLineNumberWidth() { + if (_lineNumbersShown) + { + int linesVisible = (int) execute(SCI_LINESONSCREEN); + if (linesVisible) + { + int firstVisibleLineVis = (int) execute(SCI_GETFIRSTVISIBLELINE); + int lastVisibleLineVis = linesVisible + firstVisibleLineVis + 1; + int i = 0; + while (lastVisibleLineVis) + { + lastVisibleLineVis /= 10; + i++; + } + i = max(i, 3); + { + int pixelWidth = int(8 + i * execute(SCI_TEXTWIDTH, STYLE_LINENUMBER, (LPARAM)"8")); + execute(SCI_SETMARGINWIDTHN, _SC_MARGE_LINENUMBER, pixelWidth); + } + } + } + }; + + void setCurrentLineHiLiting(bool isHiliting, COLORREF bgColor) const { + execute(SCI_SETCARETLINEVISIBLE, isHiliting); + if (!isHiliting) + return; + execute(SCI_SETCARETLINEBACK, bgColor); + }; + + bool isCurrentLineHiLiting() const { + return (execute(SCI_GETCARETLINEVISIBLE) != 0); + }; + + void performGlobalStyles(); + + void expand(int &line, bool doExpand, bool force = false, int visLevels = 0, int level = -1); + + void currentLineUp() const { + int currentLine = getCurrentLineNumber(); + if (currentLine != 0) + { + execute(SCI_BEGINUNDOACTION); + currentLine--; + execute(SCI_LINETRANSPOSE); + execute(SCI_GOTOLINE, currentLine); + execute(SCI_ENDUNDOACTION); + } + }; + + void currentLineDown() const { + int currentLine = getCurrentLineNumber(); + if (currentLine != (execute(SCI_GETLINECOUNT) - 1)) + { + execute(SCI_BEGINUNDOACTION); + currentLine++; + execute(SCI_GOTOLINE, currentLine); + execute(SCI_LINETRANSPOSE); + execute(SCI_ENDUNDOACTION); + } + }; + + void convertSelectedTextTo(bool Case); + + void convertSelectedTextToLowerCase() { + // if system is w2k or xp + if ((NppParameters::getInstance())->isTransparentAvailable()) + convertSelectedTextTo(LOWERCASE); + else + execute(SCI_LOWERCASE); + }; + + void convertSelectedTextToUpperCase() { + // if system is w2k or xp + if ((NppParameters::getInstance())->isTransparentAvailable()) + convertSelectedTextTo(UPPERCASE); + else + execute(SCI_UPPERCASE); + }; + + void collapse(int level2Collapse, bool mode); + void foldAll(bool mode); + void foldCurrentPos(bool mode); + int getCodepage() const {return _codepage;}; + + NppParameters * getParameter() { + return _pParameter; + }; + + ColumnModeInfo getColumnModeSelectInfo(); + + void columnReplace(ColumnModeInfo & cmi, const TCHAR *str); + void columnReplace(ColumnModeInfo & cmi, int initial, int incr, UCHAR format); + + void foldChanged(int line, int levelNow, int levelPrev); + void clearIndicator(int indicatorNumber) { + int docStart = 0; + int docEnd = getCurrentDocLen(); + execute(SCI_SETINDICATORCURRENT, indicatorNumber); + execute(SCI_INDICATORCLEARRANGE, docStart, docEnd-docStart); + }; + + static LanguageName ScintillaEditView::langNames[L_EXTERNAL+1]; + + void bufferUpdated(Buffer * buffer, int mask); + BufferID getCurrentBufferID() { return _currentBufferID; }; + Buffer * getCurrentBuffer() { return _currentBuffer; }; + void styleChange(); + + void hideLines(); + + bool markerMarginClick(int lineNumber); //true if it did something + void notifyMarkers(Buffer * buf, bool isHide, int location, bool del); + void runMarkers(bool doHide, int searchStart, bool endOfDoc, bool doDelete); + + bool isSelecting() const { + static CharacterRange previousSelRange = getSelection(); + CharacterRange currentSelRange = getSelection(); + + if (currentSelRange.cpMin == currentSelRange.cpMax) + { + previousSelRange = currentSelRange; + return false; + } + + if ((previousSelRange.cpMin == currentSelRange.cpMin) || (previousSelRange.cpMax == currentSelRange.cpMax)) + { + previousSelRange = currentSelRange; + return true; + } + + previousSelRange = currentSelRange; + return false; + }; + void setHiLiteResultWords(const TCHAR *keywords); +/* + pair getLineUndoState(size_t currentLine) { + Buffer * buf = getCurrentBuffer(); + return buf->getLineUndoState(currentLine); + }; + void setLineUndoState(size_t currentLine, size_t undoLevel, bool isSaved = false) { + Buffer * buf = getCurrentBuffer(); + buf->setLineUndoState(currentLine, undoLevel, isSaved); + }; + + void markSavedLines() { + for (int i = 0 ; i <= lastZeroBasedLineNumber() ; i++) + { + if ((execute(SCI_MARKERGET, i) & (1 << MARK_LINEMODIFIEDUNSAVED)) != 0) + { + execute(SCI_MARKERDELETE, i, MARK_LINEMODIFIEDUNSAVED); + execute(SCI_MARKERADD, i, MARK_LINEMODIFIEDSAVED); + //pair st = getLineUndoState(i); + setLineUndoState(i, 0, true); + } + } + }; +*/ +protected: + static HINSTANCE _hLib; + static int _refCount; + + static UserDefineDialog _userDefineDlg; + + static const int _markersArray[][NB_FOLDER_STATE]; + + static LRESULT CALLBACK scintillaStatic_Proc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { + ScintillaEditView *pScint = (ScintillaEditView *)(::GetWindowLongPtr(hwnd, GWL_USERDATA)); + // + if (Message == WM_MOUSEWHEEL || Message == WM_MOUSEHWHEEL) + { + POINT pt; + POINTS pts = MAKEPOINTS(lParam); + POINTSTOPOINT(pt, pts); + HWND hwndOnMouse = WindowFromPoint(pt); + ScintillaEditView *pScintillaOnMouse = (ScintillaEditView *)(::GetWindowLongPtr(hwndOnMouse, GWL_USERDATA)); + if (pScintillaOnMouse != pScint) + return ::SendMessage(hwndOnMouse, Message, wParam, lParam); + } + if (pScint) + return (pScint->scintillaNew_Proc(hwnd, Message, wParam, lParam)); + else + return ::DefWindowProc(hwnd, Message, wParam, lParam); + // + }; + + LRESULT scintillaNew_Proc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); + + SCINTILLA_FUNC _pScintillaFunc; + SCINTILLA_PTR _pScintillaPtr; + + static WNDPROC _scintillaDefaultProc; + CallWindowProcFunc _callWindowProc; + + BufferID attachDefaultDoc(); + + //Store the current buffer so it can be retrieved later + BufferID _currentBufferID; + Buffer * _currentBuffer; + + folderStyle _folderStyle; + + NppParameters *_pParameter; + + int _codepage; + int _oemCodepage; + + bool _lineNumbersShown; + + bool _wrapRestoreNeeded; + +//Lexers and Styling + void defineDocType(LangType typeDoc); //setup stylers for active document + void restyleBuffer(); + const char * getCompleteKeywordList(std::basic_string & kwl, LangType langType, int keywordIndex); + void setKeywords(LangType langType, const char *keywords, int index); + void setLexer(int lexerID, LangType langType, int whichList); + inline void makeStyle(LangType langType, const TCHAR **keywordArray = NULL); + void setStyle(Style styleToSet); //NOT by reference (style edited) + void setSpecialStyle(Style & styleToSet); //by reference + void setSpecialIndicator(Style & styleToSet) { + execute(SCI_INDICSETFORE, styleToSet._styleID, styleToSet._bgColor); + }; + + //Complex lexers (same lexer, different language) + void setXmlLexer(LangType type); + void setCppLexer(LangType type); + void setObjCLexer(LangType type); + void setUserLexer(const TCHAR *userLangName = NULL); + void setExternalLexer(LangType typeDoc); + void setEmbeddedJSLexer(); + void setPhpEmbeddedLexer(); + void setEmbeddedAspLexer(); + //Simple lexers + void setCssLexer() { + setLexer(SCLEX_CSS, L_CSS, LIST_0 | LIST_1); + }; + + void setLuaLexer() { + setLexer(SCLEX_LUA, L_LUA, LIST_0 | LIST_1 | LIST_2 | LIST_3); + }; + + void setMakefileLexer() { + execute(SCI_SETLEXER, SCLEX_MAKEFILE); + makeStyle(L_MAKEFILE); + }; + + void setIniLexer() { + execute(SCI_SETLEXER, SCLEX_PROPERTIES); + execute(SCI_STYLESETEOLFILLED, SCE_PROPS_SECTION, true); + makeStyle(L_INI); + }; + + + void setSqlLexer() { + setLexer(SCLEX_SQL, L_SQL, LIST_0); + }; + + void setBashLexer() { + setLexer(SCLEX_BASH, L_BASH, LIST_0); + }; + + void setVBLexer() { + setLexer(SCLEX_VB, L_VB, LIST_0); + }; + + void setPascalLexer() { + setLexer(SCLEX_PASCAL, L_PASCAL, LIST_0); + }; + + void setPerlLexer() { + setLexer(SCLEX_PERL, L_PERL, LIST_0); + }; + + void setPythonLexer() { + setLexer(SCLEX_PYTHON, L_PYTHON, LIST_0); + }; + + void setBatchLexer() { + setLexer(SCLEX_BATCH, L_BATCH, LIST_0); + }; + + void setTeXLexer() { + for (int i = 0 ; i < 4 ; i++) + execute(SCI_SETKEYWORDS, i, reinterpret_cast(TEXT(""))); + setLexer(SCLEX_TEX, L_TEX, 0); + }; + + void setNsisLexer() { + setLexer(SCLEX_NSIS, L_NSIS, LIST_0 | LIST_1 | LIST_2 | LIST_3); + }; + + void setFortranLexer() { + setLexer(SCLEX_F77, L_FORTRAN, LIST_0 | LIST_1 | LIST_2); + }; + + void setLispLexer(){ + setLexer(SCLEX_LISP, L_LISP, LIST_0); + }; + + void setSchemeLexer(){ + setLexer(SCLEX_LISP, L_SCHEME, LIST_0); + }; + + void setAsmLexer(){ + setLexer(SCLEX_ASM, L_ASM, LIST_0 | LIST_1 | LIST_2 | LIST_3 | LIST_4 | LIST_5); + }; + + void setDiffLexer(){ + setLexer(SCLEX_DIFF, L_DIFF, LIST_NONE); + }; + + void setPropsLexer(){ + setLexer(SCLEX_PROPERTIES, L_PROPS, LIST_NONE); + }; + + void setPostscriptLexer(){ + setLexer(SCLEX_PS, L_PS, LIST_0 | LIST_1 | LIST_2 | LIST_3); + }; + + void setRubyLexer(){ + setLexer(SCLEX_RUBY, L_RUBY, LIST_0); + execute(SCI_STYLESETEOLFILLED, SCE_RB_POD, true); + }; + + void setSmalltalkLexer(){ + setLexer(SCLEX_SMALLTALK, L_SMALLTALK, LIST_0); + }; + + void setVhdlLexer(){ + setLexer(SCLEX_VHDL, L_VHDL, LIST_0 | LIST_1 | LIST_2 | LIST_3 | LIST_4 | LIST_5 | LIST_6); + }; + + void setKixLexer(){ + setLexer(SCLEX_KIX, L_KIX, LIST_0 | LIST_1 | LIST_2); + }; + + void setAutoItLexer(){ + setLexer(SCLEX_AU3, L_AU3, LIST_0 | LIST_1 | LIST_2 | LIST_3 | LIST_4 | LIST_5 | LIST_6); + }; + + void setCamlLexer(){ + setLexer(SCLEX_CAML, L_CAML, LIST_0 | LIST_1 | LIST_2); + }; + + void setAdaLexer(){ + setLexer(SCLEX_ADA, L_ADA, LIST_0); + }; + + void setVerilogLexer(){ + setLexer(SCLEX_VERILOG, L_VERILOG, LIST_0 | LIST_1); + }; + + void setMatlabLexer(){ + setLexer(SCLEX_MATLAB, L_MATLAB, LIST_0); + }; + + void setHaskellLexer(){ + setLexer(SCLEX_HASKELL, L_HASKELL, LIST_0); + }; + + void setInnoLexer() { + setLexer(SCLEX_INNOSETUP, L_INNO, LIST_0 | LIST_1 | LIST_2 | LIST_3 | LIST_4 | LIST_5); + }; + + void setCmakeLexer() { + setLexer(SCLEX_CMAKE, L_CMAKE, LIST_0 | LIST_1 | LIST_2); + }; + + void setYamlLexer() { + setLexer(SCLEX_YAML, L_YAML, LIST_0); + }; + + void setSearchResultLexer() { + execute(SCI_STYLESETEOLFILLED, SCE_SEARCHRESULT_FILE_HEADER, true); + execute(SCI_STYLESETEOLFILLED, SCE_SEARCHRESULT_SEARCH_HEADER, true); + setLexer(SCLEX_SEARCHRESULT, L_SEARCHRESULT, 0); + }; + + bool isNeededFolderMarge(LangType typeDoc) const { + switch (typeDoc) + { + case L_NFO: + case L_BATCH: + case L_TXT: + case L_MAKEFILE: + case L_SQL: + case L_ASM: + //case L_TEX: + case L_HASKELL: + case L_PROPS: + case L_SMALLTALK: + case L_KIX: + case L_ADA: + return false; + default: + return true; + } + }; +//END: Lexers and Styling + + void defineMarker(int marker, int markerType, COLORREF fore, COLORREF back) { + execute(SCI_MARKERDEFINE, marker, markerType); + execute(SCI_MARKERSETFORE, marker, fore); + execute(SCI_MARKERSETBACK, marker, back); + }; + + bool isCJK() const { + return ((_codepage == CP_CHINESE_TRADITIONAL) || (_codepage == CP_CHINESE_SIMPLIFIED) || + (_codepage == CP_JAPANESE) || (_codepage == CP_KOREAN) || (_codepage == CP_GREEK)); + }; + + int codepage2CharSet() const { + switch (_codepage) + { + case CP_CHINESE_TRADITIONAL : return SC_CHARSET_CHINESEBIG5; + case CP_CHINESE_SIMPLIFIED : return SC_CHARSET_GB2312; + case CP_KOREAN : return SC_CHARSET_HANGUL; + case CP_JAPANESE : return SC_CHARSET_SHIFTJIS; + case CP_GREEK : return SC_CHARSET_GREEK; + default : return 0; + } + }; + + bool expandWordSelection(); +}; + +#endif //SCINTILLA_EDIT_VIEW_H diff --git a/PowerEditor/src/ScitillaComponent/ScintillaRef.h b/PowerEditor/src/ScitillaComponent/ScintillaRef.h new file mode 100644 index 00000000..0581e045 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/ScintillaRef.h @@ -0,0 +1,6 @@ +#ifndef SCINTILLA_REF_H +#define SCINTILLA_REF_H + +enum folderStyle {FOLDER_TYPE, FOLDER_STYLE_SIMPLE, FOLDER_STYLE_ARROW, FOLDER_STYLE_CIRCLE, FOLDER_STYLE_BOX}; + +#endif //SCINTILLA_REF_H diff --git a/PowerEditor/src/ScitillaComponent/SmartHighlighter.cpp b/PowerEditor/src/ScitillaComponent/SmartHighlighter.cpp new file mode 100644 index 00000000..938f2b39 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/SmartHighlighter.cpp @@ -0,0 +1,177 @@ +//this file is part of notepad++ +//Copyright (C)2003 Harry +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "SmartHighlighter.h" +//#include "Parameters.h" + +#define MAXLINEHIGHLIGHT 400 //prevent highlighter from doing too much work when a lot is visible + +SmartHighlighter::SmartHighlighter(FindReplaceDlg * pFRDlg) +: _pFRDlg(pFRDlg) +{ + //Nothing to do +} + +void SmartHighlighter::highlightView(ScintillaEditView * pHighlightView) +{ + //Get selection + CharacterRange range = pHighlightView->getSelection(); + + //Clear marks + pHighlightView->clearIndicator(SCE_UNIVERSAL_FOUND_STYLE_2); + + //If nothing selected, dont mark anything + if (range.cpMin == range.cpMax) + { + return; + } + + int textlen = range.cpMax - range.cpMin + 1; + + char * text2Find = new char[textlen]; + pHighlightView->getSelectedText(text2Find, textlen, false); //do not expand selection (false) + + bool valid = true; + //The word has to consist if wordChars only, and the characters before and after something else + if (!isQualifiedWord(text2Find)) + valid = false; + else + { + UCHAR c = (UCHAR)pHighlightView->execute(SCI_GETCHARAT, range.cpMax); + if (c) + { + if (isWordChar(char(c))) + valid = false; + } + c = (UCHAR)pHighlightView->execute(SCI_GETCHARAT, range.cpMin-1); + if (c) + { + if (isWordChar(char(c))) + valid = false; + } + } + if (!valid) { + delete [] text2Find; + return; + } + + // save target locations for other search functions + int originalStartPos = (int)pHighlightView->execute(SCI_GETTARGETSTART); + int originalEndPos = (int)pHighlightView->execute(SCI_GETTARGETEND); + + // Get the range of text visible and highlight everything in it + int firstLine = (int)pHighlightView->execute(SCI_GETFIRSTVISIBLELINE); + int nrLines = min((int)pHighlightView->execute(SCI_LINESONSCREEN), MAXLINEHIGHLIGHT ) + 1; + int lastLine = firstLine+nrLines; + int startPos = 0;//(int)pHighlightView->execute(SCI_POSITIONFROMLINE, firstLine); + int endPos = 0;//(int)pHighlightView->execute(SCI_POSITIONFROMLINE, lastLine); + //if (endPos == -1) { //past EOF + // endPos = (int)pHighlightView->getCurrentDocLen() - 1; + //} + int currentLine = firstLine; + int prevDocLineChecked = -1; //invalid start + + FindOption fo; + fo._isMatchCase = false; + fo._isWholeWord = true; + + const TCHAR * searchText = NULL; +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + unsigned int cp = pHighlightView->execute(SCI_GETCODEPAGE); + const TCHAR * text2FindW = wmc->char2wchar(text2Find, cp); + searchText = text2FindW; +#else + searchText = text2Find; +#endif + + for(; currentLine < lastLine; currentLine++) { + int docLine = (int)pHighlightView->execute(SCI_DOCLINEFROMVISIBLE, currentLine); + if (docLine == prevDocLineChecked) + continue; //still on same line (wordwrap) + prevDocLineChecked = docLine; + startPos = (int)pHighlightView->execute(SCI_POSITIONFROMLINE, docLine); + endPos = (int)pHighlightView->execute(SCI_POSITIONFROMLINE, docLine+1); + if (endPos == -1) { //past EOF + endPos = (int)pHighlightView->getCurrentDocLen() - 1; + _pFRDlg->processRange(ProcessMarkAll_2, searchText, NULL, startPos, endPos, NULL, &fo); + break; + } else { + _pFRDlg->processRange(ProcessMarkAll_2, searchText, NULL, startPos, endPos, NULL, &fo); + } + } + + // restore the original targets to avoid conflicts with the search/replace functions + pHighlightView->execute(SCI_SETTARGETSTART, originalStartPos); + pHighlightView->execute(SCI_SETTARGETEND, originalEndPos); +} + +bool SmartHighlighter::isQualifiedWord(const char *str) const +{ + for (size_t i = 0 ; i < strlen(str) ; i++) + { + if (!isWordChar(str[i])) + return false; + } + return true; +}; + +bool SmartHighlighter::isWordChar(char ch) const +{ + if ((UCHAR)ch < 0x20) + return false; + + switch(ch) + { + case ' ': + case ' ': + case '\n': + case '\r': + case '.': + case ',': + case '?': + case ';': + case ':': + case '!': + case '(': + case ')': + case '[': + case ']': + case '+': + case '-': + case '*': + case '/': + case '#': + case '@': + case '^': + case '%': + case '$': + case '"': + case '\'': + case '~': + case '&': + case '{': + case '}': + case '|': + case '=': + case '<': + case '>': + case '\\': + return false; + } + return true; +}; diff --git a/PowerEditor/src/ScitillaComponent/SmartHighlighter.h b/PowerEditor/src/ScitillaComponent/SmartHighlighter.h new file mode 100644 index 00000000..fe72055d --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/SmartHighlighter.h @@ -0,0 +1,35 @@ +//this file is part of notepad++ +//Copyright (C)2003 Harry +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef SMARTHIGHLIGHTER_H +#define SMARTHIGHLIGHTER_H + +#include "ScintillaEditView.h" +#include "FindReplaceDlg.h" + +class SmartHighlighter { +public: + SmartHighlighter(FindReplaceDlg * pFRDlg); + void highlightView(ScintillaEditView * pHighlightView); +private: + FindReplaceDlg * _pFRDlg; + + bool isQualifiedWord(const char *str) const; + bool isWordChar(char ch) const; +}; + +#endif //SMARTHIGHLIGHTER_H \ No newline at end of file diff --git a/PowerEditor/src/ScitillaComponent/UserDefineDialog.cpp b/PowerEditor/src/ScitillaComponent/UserDefineDialog.cpp new file mode 100644 index 00000000..8ae03652 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/UserDefineDialog.cpp @@ -0,0 +1,1611 @@ +//this file is part of Notepad++ +//Copyright (C)2003 Don HO +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "UserDefineDialog.h" +#include "ScintillaEditView.h" +#include "Parameters.h" +#include "resource.h" +#include "Notepad_plus_msgs.h" + +UserLangContainer * SharedParametersDialog::_pUserLang = NULL; +ScintillaEditView * SharedParametersDialog::_pScintilla = NULL; + +void SharedParametersDialog::initControls() +{ + NppParameters *pNppParam = NppParameters::getInstance(); + for (int i = 0 ; i < _nbGroup ; i++) + { + HWND hFgColourStaticText = ::GetDlgItem(_hSelf, _fgStatic[i]); + HWND hBgColourStaticText = ::GetDlgItem(_hSelf, _bgStatic[i]); + + _pFgColour[i] = new ColourPicker; + _pFgColour[i]->init(_hInst, _hSelf); + _pFgColour[i]->setColour(black); + + _pBgColour[i] = new ColourPicker; + _pBgColour[i]->init(_hInst, _hSelf); + _pBgColour[i]->setColour(white); + + POINT p1, p2; + + alignWith(hFgColourStaticText, _pFgColour[i]->getHSelf(), ALIGNPOS_RIGHT, p1); + alignWith(hBgColourStaticText, _pBgColour[i]->getHSelf(), ALIGNPOS_RIGHT, p2); + + p1.x = p2.x = ((p1.x > p2.x)?p1.x:p2.x) + 10; + p1.y -= 4; p2.y -= 4; + + ::MoveWindow(_pFgColour[i]->getHSelf(), p1.x, p1.y, 25, 25, TRUE); + ::MoveWindow(_pBgColour[i]->getHSelf(), p2.x, p2.y, 25, 25, TRUE); + _pFgColour[i]->display(); + _pBgColour[i]->display(); + + //for the font size combos + for(int j = 0 ; j < int(sizeof(fontSizeStrs))/(3*sizeof(TCHAR)) ; j++) + { + ::SendDlgItemMessage(_hSelf, _fontSizeCombo[i], CB_ADDSTRING, 0, (LPARAM)fontSizeStrs[j]); + } + + //for the font name combos + HWND hFontNameCombo = ::GetDlgItem(_hSelf, _fontNameCombo[i]); + + const std::vector & fontlist = pNppParam->getFontList(); + for (int j = 0 ; j < int(fontlist.size()) ; j++) + { + int k = ::SendMessage(hFontNameCombo, CB_ADDSTRING, 0, (LPARAM)fontlist[j].c_str()); + ::SendMessage(hFontNameCombo, CB_SETITEMDATA, k, (LPARAM)fontlist[j].c_str()); + } +/* + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + { + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + redraw(); + } +*/ + } +} + +bool SharedParametersDialog::setPropertyByCheck(HWND hwnd, WPARAM id, bool & bool2set) +{ + bool2set = (BST_CHECKED == ::SendMessage(::GetDlgItem(hwnd, id), BM_GETCHECK, 0, 0)); + + if (_pScintilla->getCurrentBuffer()->getLangType() == L_USER) + _pScintilla->styleChange(); + return TRUE; +} + +void SharedParametersDialog::styleUpdate(const Style & style, ColourPicker *pFgColourPicker, ColourPicker *pBgColourPicker, + int fontComboId, int fontSizeComboId, int boldCheckId, int italicCheckId, int underlineCheckId) +{ + pFgColourPicker->setColour((style._fgColor == COLORREF(-1))?black:style._fgColor); + pFgColourPicker->setEnabled((style._colorStyle & COLORSTYLE_FOREGROUND) != 0); + pFgColourPicker->redraw(); + pBgColourPicker->setColour((style._bgColor == COLORREF(-1))?white:style._bgColor); + pBgColourPicker->setEnabled((style._colorStyle & COLORSTYLE_BACKGROUND) != 0); + pBgColourPicker->redraw(); + + HWND hFontCombo = ::GetDlgItem(_hSelf, fontComboId); + int i = ::SendMessage(hFontCombo, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)style._fontName); + if (i == CB_ERR) + i = 0; + ::SendMessage(hFontCombo, CB_SETCURSEL, i, 0); + + TCHAR size[10]; + if (style._fontSize == -1) + size[0] = '\0'; + else + wsprintf(size, TEXT("%d"), style._fontSize); + + hFontCombo = ::GetDlgItem(_hSelf, fontSizeComboId); + i = ::SendMessage(hFontCombo, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)size); + if (i != CB_ERR) + ::SendMessage(hFontCombo, CB_SETCURSEL, i, 0); + int isBold = 0; + int isItalic = 0; + int isUnderline = 0; + if (style._fontStyle != -1) + { + isBold = (style._fontStyle & FONTSTYLE_BOLD)?BST_CHECKED:BST_UNCHECKED; + isItalic = (style._fontStyle & FONTSTYLE_ITALIC)?BST_CHECKED:BST_UNCHECKED; + isUnderline = (style._fontStyle & FONTSTYLE_UNDERLINE)?BST_CHECKED:BST_UNCHECKED; + } + ::SendDlgItemMessage(_hSelf, boldCheckId, BM_SETCHECK, isBold, 0); + ::SendDlgItemMessage(_hSelf, italicCheckId, BM_SETCHECK, isItalic, 0); + ::SendDlgItemMessage(_hSelf, underlineCheckId, BM_SETCHECK, isUnderline, 0); +} + +int fgStatic[] = {IDC_DEFAULT_FG_STATIC, IDC_FOLDEROPEN_FG_STATIC, IDC_FOLDERCLOSE_FG_STATIC}; +int bgStatic[] = {IDC_DEFAULT_BG_STATIC, IDC_FOLDEROPEN_BG_STATIC, IDC_FOLDERCLOSE_BG_STATIC}; +int fontSizeCombo[] = {IDC_DEFAULT_FONTSIZE_COMBO, IDC_FOLDEROPEN_FONTSIZE_COMBO, IDC_FOLDERCLOSE_FONTSIZE_COMBO}; +int fontNameCombo[] = {IDC_DEFAULT_FONT_COMBO, IDC_FOLDEROPEN_FONT_COMBO, IDC_FOLDERCLOSE_FONT_COMBO}; + +FolderStyleDialog::FolderStyleDialog() : SharedParametersDialog(3) +{ + memcpy(_fgStatic, fgStatic, sizeof(fgStatic)); + memcpy(_bgStatic, bgStatic, sizeof(bgStatic)); + memcpy(_fontSizeCombo, fontSizeCombo, sizeof(fontSizeCombo)); + memcpy(_fontNameCombo, fontNameCombo, sizeof(fontNameCombo)); +} + +void FolderStyleDialog::setKeywords2List(int ctrlID) +{ + int index; + if (ctrlID == IDC_FOLDEROPEN_EDIT) + index = 1; + else if (ctrlID == IDC_FOLDERCLOSE_EDIT) + index = 2; + else + index = -1; + + if (index != -1) + ::GetDlgItemText(_hSelf, ctrlID, _pUserLang->_keywordLists[index], max_char); +} + +BOOL CALLBACK SharedParametersDialog::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_INITDIALOG : + { + initControls(); + return TRUE; + } + + case WM_COMMAND : + { + if (HIWORD(wParam) == EN_CHANGE) + { + setKeywords2List(LOWORD(wParam)); + + if (_pScintilla->getCurrentBuffer()->getLangType() == L_USER) + _pScintilla->styleChange(); + + return TRUE; + } + else if (HIWORD(wParam) == CBN_SELCHANGE) + { + bool isFontSize; + int k = getGroupIndexFromCombo(LOWORD(wParam), isFontSize); + + if (k != -1) + { + int i = ::SendDlgItemMessage(_hSelf, LOWORD(wParam), CB_GETCURSEL, 0, 0); + Style & style = _pUserLang->_styleArray.getStyler(k); + if (isFontSize) + { + TCHAR intStr[5]; + if (i != 0) + { + ::SendDlgItemMessage(_hSelf, LOWORD(wParam), CB_GETLBTEXT, i, (LPARAM)intStr); + if ((!intStr) || (!intStr[0])) + style._fontSize = -1; + else + { + TCHAR *finStr; + style._fontSize = generic_strtol(intStr, &finStr, 10); + if (*finStr != '\0') + style._fontSize = -1; + } + } + } + else + { + style._fontName = (TCHAR *)::SendDlgItemMessage(_hSelf, LOWORD(wParam), CB_GETITEMDATA, i, 0); + } + if (_pScintilla->getCurrentBuffer()->getLangType() == L_USER) + _pScintilla->styleChange(); + return TRUE; + } + } + else if (HIWORD(wParam) == CPN_COLOURPICKED) + { + bool isFG; + ColourPicker *pCP; + int index = getStylerIndexFromCP((HWND)lParam, isFG, &pCP); + if (index != -1) + { + Style & style = _pUserLang->_styleArray.getStyler(index); + if (isFG) { + style._fgColor = pCP->getColour(); + if (pCP->isEnabled()) + style._colorStyle |= COLORSTYLE_FOREGROUND; + else + style._colorStyle &= ~COLORSTYLE_FOREGROUND; + } else { + style._bgColor = pCP->getColour(); + if (pCP->isEnabled()) + style._colorStyle |= COLORSTYLE_BACKGROUND; + else + style._colorStyle &= ~COLORSTYLE_BACKGROUND; + } + } + // A cause de "#define CPN_COLOURPICKED (BN_CLICKED)" + // Nous sommes obligés de mettre ce bloc ici !!! + // A modifier !!! + else + { + int fontStyleMask; + int k = getGroupeIndexFromCheck(wParam, fontStyleMask); + + if (k != -1) + { + Style & style = _pUserLang->_styleArray.getStyler(k); + if (style._fontStyle == -1) + style._fontStyle = 0; + style._fontStyle ^= fontStyleMask; + //::MessageBox(NULL, TEXT("Bingo!!!"), TEXT(""), MB_OK); + } + } + if (_pScintilla->getCurrentBuffer()->getLangType() == L_USER) + _pScintilla->styleChange(); + return TRUE; + } + return FALSE; + } + /* + case WM_SIZE : + { + redraw(); + return TRUE; + } + */ + case WM_DESTROY: + { + for (int i = 0 ; i < _nbGroup ; i++) + { + _pFgColour[i]->destroy(); + _pBgColour[i]->destroy(); + + delete _pFgColour[i]; + delete _pBgColour[i]; + } + return TRUE; + } + } + return FALSE; +} + +void FolderStyleDialog::updateDlg() +{ + ::SendDlgItemMessage(_hSelf, IDC_FOLDEROPEN_EDIT, WM_SETTEXT, 0, (LPARAM)(_pUserLang->_keywordLists[KWL_FOLDER_OPEN_INDEX])); + ::SendDlgItemMessage(_hSelf, IDC_FOLDERCLOSE_EDIT, WM_SETTEXT, 0, (LPARAM)(_pUserLang->_keywordLists[KWL_FOLDER_CLOSE_INDEX])); + + Style & defaultStyle = _pUserLang->_styleArray.getStyler(STYLE_DEFAULT_INDEX); + styleUpdate(defaultStyle, _pFgColour[0], _pBgColour[0], IDC_DEFAULT_FONT_COMBO, IDC_DEFAULT_FONTSIZE_COMBO, + IDC_DEFAULT_BOLD_CHECK, IDC_DEFAULT_ITALIC_CHECK, IDC_DEFAULT_UNDERLINE_CHECK); + + Style & foStyle = _pUserLang->_styleArray.getStyler(STYLE_BLOCK_OPEN_INDEX); + styleUpdate(foStyle, _pFgColour[1], _pBgColour[1], IDC_FOLDEROPEN_FONT_COMBO, IDC_FOLDEROPEN_FONTSIZE_COMBO, + IDC_FOLDEROPEN_BOLD_CHECK, IDC_FOLDEROPEN_ITALIC_CHECK, IDC_FOLDEROPEN_UNDERLINE_CHECK); + + Style & fcStyle = _pUserLang->_styleArray.getStyler(STYLE_BLOCK_CLOSE_INDEX); + styleUpdate(fcStyle, _pFgColour[2], _pBgColour[2], IDC_FOLDERCLOSE_FONT_COMBO, IDC_FOLDERCLOSE_FONTSIZE_COMBO, + IDC_FOLDERCLOSE_BOLD_CHECK, IDC_FOLDERCLOSE_ITALIC_CHECK, IDC_FOLDERCLOSE_UNDERLINE_CHECK); +} + +int FolderStyleDialog::getStylerIndexFromCP(HWND hWnd, bool & isFG, ColourPicker **ppCP) const +{ + for (int i = 0 ; i < _nbGroup ; i++) + { + if (hWnd == _pFgColour[i]->getHSelf()) + { + *ppCP = _pFgColour[i]; + isFG = true; + return i; + } + if (hWnd == _pBgColour[i]->getHSelf()) + { + *ppCP = _pBgColour[i]; + isFG = false; + return i; + } + } + return -1; +} + +int FolderStyleDialog::getGroupeIndexFromCheck(int ctrlID, int & fontStyleMask) const +{ + switch (ctrlID) + { + case IDC_DEFAULT_BOLD_CHECK : + fontStyleMask = FONTSTYLE_BOLD; + return STYLE_DEFAULT_INDEX; + + case IDC_DEFAULT_ITALIC_CHECK : + fontStyleMask = FONTSTYLE_ITALIC; + return STYLE_DEFAULT_INDEX; + + case IDC_DEFAULT_UNDERLINE_CHECK : + fontStyleMask = FONTSTYLE_UNDERLINE; + return STYLE_DEFAULT_INDEX; + + case IDC_FOLDEROPEN_BOLD_CHECK : + fontStyleMask = FONTSTYLE_BOLD; + return STYLE_BLOCK_OPEN_INDEX; + + case IDC_FOLDEROPEN_ITALIC_CHECK : + fontStyleMask = FONTSTYLE_ITALIC; + return STYLE_BLOCK_OPEN_INDEX; + + case IDC_FOLDEROPEN_UNDERLINE_CHECK : + fontStyleMask = FONTSTYLE_UNDERLINE; + return STYLE_BLOCK_OPEN_INDEX; + + case IDC_FOLDERCLOSE_BOLD_CHECK : + fontStyleMask = FONTSTYLE_BOLD; + return STYLE_BLOCK_CLOSE_INDEX; + + case IDC_FOLDERCLOSE_ITALIC_CHECK : + fontStyleMask = FONTSTYLE_ITALIC; + return STYLE_BLOCK_CLOSE_INDEX; + + case IDC_FOLDERCLOSE_UNDERLINE_CHECK : + fontStyleMask = FONTSTYLE_UNDERLINE; + return STYLE_BLOCK_CLOSE_INDEX; + + default : + return -1; + } +} + +int fgStatic2[] = {IDC_KEYWORD1_FG_STATIC, IDC_KEYWORD2_FG_STATIC, IDC_KEYWORD3_FG_STATIC, IDC_KEYWORD4_FG_STATIC}; +int bgStatic2[] = {IDC_KEYWORD1_BG_STATIC, IDC_KEYWORD2_BG_STATIC, IDC_KEYWORD3_BG_STATIC, IDC_KEYWORD4_BG_STATIC}; +int fontSizeCombo2[] = {IDC_KEYWORD1_FONTSIZE_COMBO, IDC_KEYWORD2_FONTSIZE_COMBO, IDC_KEYWORD3_FONTSIZE_COMBO, IDC_KEYWORD4_FONTSIZE_COMBO}; +int fontNameCombo2[] = {IDC_KEYWORD1_FONT_COMBO, IDC_KEYWORD2_FONT_COMBO, IDC_KEYWORD3_FONT_COMBO, IDC_KEYWORD4_FONT_COMBO}; + +KeyWordsStyleDialog::KeyWordsStyleDialog() : SharedParametersDialog(4) +{ + memcpy(_fgStatic, fgStatic2, sizeof(fgStatic2)); + memcpy(_bgStatic, bgStatic2, sizeof(bgStatic2)); + memcpy(_fontSizeCombo, fontSizeCombo2, sizeof(fontSizeCombo2)); + memcpy(_fontNameCombo, fontNameCombo2, sizeof(fontNameCombo2)); +} + + +BOOL CALLBACK KeyWordsStyleDialog::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + + case WM_COMMAND : + { + switch (wParam) + { + case IDC_KEYWORD1_PREFIX_CHECK : + return setPropertyByCheck(_hSelf, wParam, _pUserLang->_isPrefix[0]); + + case IDC_KEYWORD2_PREFIX_CHECK : + return setPropertyByCheck(_hSelf, wParam, _pUserLang->_isPrefix[1]); + + case IDC_KEYWORD3_PREFIX_CHECK : + return setPropertyByCheck(_hSelf, wParam, _pUserLang->_isPrefix[2]); + + case IDC_KEYWORD4_PREFIX_CHECK : + return setPropertyByCheck(_hSelf, wParam, _pUserLang->_isPrefix[3]); + } + } + default : + return SharedParametersDialog::run_dlgProc(Message, wParam, lParam); + } +} + +void KeyWordsStyleDialog::setKeywords2List(int id) +{ + int index; + switch (id) + { + case IDC_KEYWORD1_EDIT : index = 5; break; + case IDC_KEYWORD2_EDIT : index = 6; break; + case IDC_KEYWORD3_EDIT : index = 7; break; + case IDC_KEYWORD4_EDIT : index = 8; break; + default : index = -1; + } + if (index != -1) + ::GetDlgItemText(_hSelf, id, _pUserLang->_keywordLists[index], max_char); +} + +int KeyWordsStyleDialog::getStylerIndexFromCP(HWND hWnd, bool & isFG, ColourPicker **ppCP) const +{ + for (int i = 0 ; i < _nbGroup ; i++) + { + if (hWnd == _pFgColour[i]->getHSelf()) + { + *ppCP = _pFgColour[i]; + isFG = true; + return i+3; + } + if (hWnd == _pBgColour[i]->getHSelf()) + { + *ppCP = _pBgColour[i]; + isFG = false; + return i+3; + } + } + return -1; +} + +int KeyWordsStyleDialog::getGroupeIndexFromCheck(int ctrlID, int & fontStyleMask) const +{ + switch (ctrlID) + { + case IDC_KEYWORD1_BOLD_CHECK : + fontStyleMask = FONTSTYLE_BOLD; + return STYLE_WORD1_INDEX; + + case IDC_KEYWORD1_ITALIC_CHECK : + fontStyleMask = FONTSTYLE_ITALIC; + return STYLE_WORD1_INDEX; + + case IDC_KEYWORD1_UNDERLINE_CHECK : + fontStyleMask = FONTSTYLE_UNDERLINE; + return STYLE_WORD1_INDEX; + + case IDC_KEYWORD2_BOLD_CHECK : + fontStyleMask = FONTSTYLE_BOLD; + return STYLE_WORD2_INDEX; + + case IDC_KEYWORD2_ITALIC_CHECK : + fontStyleMask = FONTSTYLE_ITALIC; + return STYLE_WORD2_INDEX; + + case IDC_KEYWORD2_UNDERLINE_CHECK : + fontStyleMask = FONTSTYLE_UNDERLINE; + return STYLE_WORD2_INDEX; + + case IDC_KEYWORD3_BOLD_CHECK : + fontStyleMask = FONTSTYLE_BOLD; + return STYLE_WORD3_INDEX; + + case IDC_KEYWORD3_ITALIC_CHECK : + fontStyleMask = FONTSTYLE_ITALIC; + return STYLE_WORD3_INDEX; + + case IDC_KEYWORD3_UNDERLINE_CHECK : + fontStyleMask = FONTSTYLE_UNDERLINE; + return STYLE_WORD3_INDEX; + + case IDC_KEYWORD4_BOLD_CHECK : + fontStyleMask = FONTSTYLE_BOLD; + return STYLE_WORD4_INDEX; + + case IDC_KEYWORD4_ITALIC_CHECK : + fontStyleMask = FONTSTYLE_ITALIC; + return STYLE_WORD4_INDEX; + + case IDC_KEYWORD4_UNDERLINE_CHECK : + fontStyleMask = FONTSTYLE_UNDERLINE; + return STYLE_WORD4_INDEX; + + default : + return -1; + } +} + +void KeyWordsStyleDialog::updateDlg() +{ + ::SendDlgItemMessage(_hSelf, IDC_KEYWORD1_EDIT, WM_SETTEXT, 0, (LPARAM)(_pUserLang->_keywordLists[KWL_KW1_INDEX])); + ::SendDlgItemMessage(_hSelf, IDC_KEYWORD2_EDIT, WM_SETTEXT, 0, (LPARAM)(_pUserLang->_keywordLists[KWL_KW2_INDEX])); + ::SendDlgItemMessage(_hSelf, IDC_KEYWORD3_EDIT, WM_SETTEXT, 0, (LPARAM)(_pUserLang->_keywordLists[KWL_KW3_INDEX])); + ::SendDlgItemMessage(_hSelf, IDC_KEYWORD4_EDIT, WM_SETTEXT, 0, (LPARAM)(_pUserLang->_keywordLists[KWL_KW4_INDEX])); + + Style & w1Style = _pUserLang->_styleArray.getStyler(STYLE_WORD1_INDEX); + styleUpdate(w1Style, _pFgColour[0], _pBgColour[0], IDC_KEYWORD1_FONT_COMBO, IDC_KEYWORD1_FONTSIZE_COMBO, + IDC_KEYWORD1_BOLD_CHECK, IDC_KEYWORD1_ITALIC_CHECK, IDC_KEYWORD1_UNDERLINE_CHECK); + + Style & w2Style = _pUserLang->_styleArray.getStyler(STYLE_WORD2_INDEX); + styleUpdate(w2Style, _pFgColour[1], _pBgColour[1], IDC_KEYWORD2_FONT_COMBO, IDC_KEYWORD2_FONTSIZE_COMBO, + IDC_KEYWORD2_BOLD_CHECK, IDC_KEYWORD2_ITALIC_CHECK, IDC_KEYWORD2_UNDERLINE_CHECK); + + Style & w3Style = _pUserLang->_styleArray.getStyler(STYLE_WORD3_INDEX); + styleUpdate(w3Style, _pFgColour[2], _pBgColour[2], IDC_KEYWORD3_FONT_COMBO, IDC_KEYWORD3_FONTSIZE_COMBO, + IDC_KEYWORD3_BOLD_CHECK, IDC_KEYWORD3_BOLD_CHECK, IDC_KEYWORD3_UNDERLINE_CHECK); + + Style & w4Style = _pUserLang->_styleArray.getStyler(STYLE_WORD4_INDEX); + styleUpdate(w4Style, _pFgColour[3], _pBgColour[3], IDC_KEYWORD4_FONT_COMBO, IDC_KEYWORD4_FONTSIZE_COMBO, + IDC_KEYWORD4_BOLD_CHECK, IDC_KEYWORD4_ITALIC_CHECK, IDC_KEYWORD4_UNDERLINE_CHECK); + + ::SendDlgItemMessage(_hSelf, IDC_KEYWORD1_PREFIX_CHECK, BM_SETCHECK, _pUserLang->_isPrefix[0], 0); + ::SendDlgItemMessage(_hSelf, IDC_KEYWORD2_PREFIX_CHECK, BM_SETCHECK, _pUserLang->_isPrefix[1], 0); + ::SendDlgItemMessage(_hSelf, IDC_KEYWORD3_PREFIX_CHECK, BM_SETCHECK, _pUserLang->_isPrefix[2], 0); + ::SendDlgItemMessage(_hSelf, IDC_KEYWORD4_PREFIX_CHECK, BM_SETCHECK, _pUserLang->_isPrefix[3], 0); +} + +int fgStatic3[] = {IDC_COMMENT_FG_STATIC, IDC_COMMENTLINE_FG_STATIC, IDC_NUMBER_FG_STATIC}; +int bgStatic3[] = {IDC_COMMENT_BG_STATIC, IDC_COMMENTLINE_BG_STATIC, IDC_NUMBER_BG_STATIC}; +int fontSizeCombo3[] = {IDC_COMMENT_FONTSIZE_COMBO, IDC_COMMENTLINE_FONTSIZE_COMBO, IDC_NUMBER_FONTSIZE_COMBO}; +int fontNameCombo3[] = {IDC_COMMENT_FONT_COMBO, IDC_COMMENTLINE_FONT_COMBO, IDC_NUMBER_FONT_COMBO}; + +CommentStyleDialog::CommentStyleDialog() : SharedParametersDialog(3) +{ + memcpy(_fgStatic, fgStatic3, sizeof(fgStatic3)); + memcpy(_bgStatic, bgStatic3, sizeof(bgStatic3)); + memcpy(_fontSizeCombo, fontSizeCombo3, sizeof(fontSizeCombo3)); + memcpy(_fontNameCombo, fontNameCombo3, sizeof(fontNameCombo3)); +} + +BOOL CALLBACK CommentStyleDialog::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_COMMAND : + { + switch (wParam) + { + case IDC_COMMENTLINESYMBOL_CHECK : + return setPropertyByCheck(_hSelf, wParam, _pUserLang->_isCommentLineSymbol);; + + case IDC_COMMENTSYMBOL_CHECK : + return setPropertyByCheck(_hSelf, wParam, _pUserLang->_isCommentSymbol);; + + } + } + default : + return SharedParametersDialog::run_dlgProc(Message, wParam, lParam); + } +} + + +void CommentStyleDialog::setKeywords2List(int id) +{ + int i; + switch (id) + { + case IDC_COMMENTOPEN_EDIT : + case IDC_COMMENTCLOSE_EDIT : + case IDC_COMMENTLINE_EDIT : + i = 4; + break; + default : i = -1; + } + if (i != -1) + { + TCHAR commentOpen[max_char]; + TCHAR commentClose[max_char]; + TCHAR commentLine[max_char]; + TCHAR newList[max_char] = TEXT(""); + ::GetDlgItemText(_hSelf, IDC_COMMENTOPEN_EDIT, commentOpen, max_char); + ::GetDlgItemText(_hSelf, IDC_COMMENTCLOSE_EDIT, commentClose, max_char); + ::GetDlgItemText(_hSelf, IDC_COMMENTLINE_EDIT, commentLine, max_char); + convertTo(newList, commentOpen, '1'); + convertTo(newList, commentClose, '2'); + convertTo(newList, commentLine, '0'); + lstrcpy(_pUserLang->_keywordLists[i], newList); + } +} + +int CommentStyleDialog::getStylerIndexFromCP(HWND hWnd, bool & isFG, ColourPicker **ppCP) const +{ + for (int i = 0 ; i < _nbGroup ; i++) + { + if (hWnd == _pFgColour[i]->getHSelf()) + { + *ppCP = _pFgColour[i]; + isFG = true; + return i+7; + } + if (hWnd == _pBgColour[i]->getHSelf()) + { + *ppCP = _pBgColour[i]; + isFG = false; + return i+7; + } + } + return -1; +} +int CommentStyleDialog::getGroupeIndexFromCheck(int ctrlID, int & fontStyleMask) const +{ + switch (ctrlID) + { + case IDC_COMMENT_BOLD_CHECK : + fontStyleMask = FONTSTYLE_BOLD; + return STYLE_COMMENT_INDEX; + + case IDC_COMMENT_ITALIC_CHECK : + fontStyleMask = FONTSTYLE_ITALIC; + return STYLE_COMMENT_INDEX; + + case IDC_COMMENT_UNDERLINE_CHECK : + fontStyleMask = FONTSTYLE_UNDERLINE; + return STYLE_COMMENT_INDEX; + + case IDC_COMMENTLINE_BOLD_CHECK : + fontStyleMask = FONTSTYLE_BOLD; + return STYLE_COMMENTLINE_INDEX; + + case IDC_COMMENTLINE_ITALIC_CHECK : + fontStyleMask = FONTSTYLE_ITALIC; + return STYLE_COMMENTLINE_INDEX; + + case IDC_COMMENTLINE_UNDERLINE_CHECK : + fontStyleMask = FONTSTYLE_UNDERLINE; + return STYLE_COMMENTLINE_INDEX; + + case IDC_NUMBER_BOLD_CHECK : + fontStyleMask = FONTSTYLE_BOLD; + return STYLE_NUMBER_INDEX; + + case IDC_NUMBER_ITALIC_CHECK : + fontStyleMask = FONTSTYLE_ITALIC; + return STYLE_NUMBER_INDEX; + + case IDC_NUMBER_UNDERLINE_CHECK : + fontStyleMask = FONTSTYLE_UNDERLINE; + return STYLE_NUMBER_INDEX; + + default : + return -1; + } +} + +void CommentStyleDialog::convertTo(TCHAR *dest, const TCHAR *toConvert, TCHAR prefix) const +{ + int index = lstrlen(dest); + dest[index++] = ' '; + dest[index++] = prefix; + for (int i = 0 ; i < int(lstrlen(toConvert)) ; i++) + { + if (toConvert[i] == ' ') + { + if (toConvert[i+1] != ' ') + { + dest[index++] = ' '; + dest[index++] = prefix; + } + } + else + { + dest[index++] = toConvert[i]; + } + } + dest[index] = '\0'; +} + +void CommentStyleDialog::retrieve(TCHAR *dest, const TCHAR *toRetrieve, TCHAR prefix) const +{ + int j = 0; + bool begin2Copy = false; + + for (int i = 0 ; i < int(lstrlen(toRetrieve)) ; i++) + { + if (((i == 0) || toRetrieve[i-1] == ' ') && (toRetrieve[i] == prefix)) + { + begin2Copy = true; + continue; + } + else if (((toRetrieve[i] == ' ') && begin2Copy == true)) + { + dest[j++] = toRetrieve[i]; + begin2Copy = false; + } + if (begin2Copy) + dest[j++] = toRetrieve[i]; + } + dest[j++] = '\0'; +} + +void CommentStyleDialog::updateDlg() +{ + TCHAR commentOpen[256] = TEXT(""); + TCHAR commentClose[256] = TEXT(""); + TCHAR commentLine[256] = TEXT(""); + + retrieve(commentOpen, _pUserLang->_keywordLists[KWL_COMMENT_INDEX], '1'); + retrieve(commentClose, _pUserLang->_keywordLists[KWL_COMMENT_INDEX], '2'); + retrieve(commentLine, _pUserLang->_keywordLists[KWL_COMMENT_INDEX], '0'); + + ::SendDlgItemMessage(_hSelf, IDC_COMMENTOPEN_EDIT, WM_SETTEXT, 0, (LPARAM)commentOpen); + ::SendDlgItemMessage(_hSelf, IDC_COMMENTCLOSE_EDIT, WM_SETTEXT, 0, (LPARAM)commentClose); + ::SendDlgItemMessage(_hSelf, IDC_COMMENTLINE_EDIT, WM_SETTEXT, 0, (LPARAM)commentLine); + + Style & commentStyle = _pUserLang->_styleArray.getStyler(STYLE_COMMENT_INDEX); + styleUpdate(commentStyle, _pFgColour[0], _pBgColour[0], IDC_COMMENT_FONT_COMBO, IDC_COMMENT_FONTSIZE_COMBO, + IDC_COMMENT_BOLD_CHECK, IDC_COMMENT_ITALIC_CHECK, IDC_COMMENT_UNDERLINE_CHECK); + + Style & commentLineStyle = _pUserLang->_styleArray.getStyler(STYLE_COMMENTLINE_INDEX); + styleUpdate(commentLineStyle, _pFgColour[1], _pBgColour[1], IDC_COMMENTLINE_FONT_COMBO, IDC_COMMENTLINE_FONTSIZE_COMBO, + IDC_COMMENTLINE_BOLD_CHECK, IDC_COMMENTLINE_ITALIC_CHECK, IDC_COMMENTLINE_UNDERLINE_CHECK); + + Style & numberStyle = _pUserLang->_styleArray.getStyler(STYLE_NUMBER_INDEX); + styleUpdate(numberStyle, _pFgColour[2], _pBgColour[2], IDC_NUMBER_FONT_COMBO, IDC_NUMBER_FONTSIZE_COMBO, + IDC_NUMBER_BOLD_CHECK, IDC_NUMBER_ITALIC_CHECK, IDC_NUMBER_UNDERLINE_CHECK); + + ::SendDlgItemMessage(_hSelf, IDC_COMMENTLINESYMBOL_CHECK, BM_SETCHECK, _pUserLang->_isCommentLineSymbol, 0); + ::SendDlgItemMessage(_hSelf, IDC_COMMENTSYMBOL_CHECK, BM_SETCHECK, _pUserLang->_isCommentSymbol, 0); +} + +TCHAR symbolesArray[] = TEXT("+-*/.?!:;,%^$&\"'(_)=}]@\\`|[{#~<>"); +const bool SymbolsStyleDialog::ADD = true; +const bool SymbolsStyleDialog::REMOVE = false; + +int fgStatic4[] = {IDC_SYMBOL_FG_STATIC, IDC_SYMBOL_FG2_STATIC, IDC_SYMBOL_FG3_STATIC}; +int bgStatic4[] = {IDC_SYMBOL_BG_STATIC, IDC_SYMBOL_BG2_STATIC, IDC_SYMBOL_BG3_STATIC}; +int fontSizeCombo4[] = {IDC_SYMBOL_FONTSIZE_COMBO, IDC_SYMBOL_FONTSIZE2_COMBO, IDC_SYMBOL_FONTSIZE3_COMBO}; +int fontNameCombo4[] = {IDC_SYMBOL_FONT_COMBO, IDC_SYMBOL_FONT2_COMBO, IDC_SYMBOL_FONT3_COMBO}; + +// 2 static const TCHAR * to have the compatibility with the old xml +const TCHAR *SymbolsStyleDialog::_delimTag1 = TEXT("DELIMINER1"); +const TCHAR *SymbolsStyleDialog::_delimTag2 = TEXT("DELIMINER2"); + +SymbolsStyleDialog::SymbolsStyleDialog() : SharedParametersDialog(3) +{ + memcpy(_fgStatic, fgStatic4, sizeof(fgStatic4)); + memcpy(_bgStatic, bgStatic4, sizeof(bgStatic4)); + memcpy(_fontSizeCombo, fontSizeCombo4, sizeof(fontSizeCombo4)); + memcpy(_fontNameCombo, fontNameCombo4, sizeof(fontNameCombo4)); +} + +int SymbolsStyleDialog::getStylerIndexFromCP(HWND hWnd, bool & isFG, ColourPicker **ppCP) const +{ + for (int i = 0 ; i < _nbGroup ; i++) + { + if (hWnd == _pFgColour[i]->getHSelf()) + { + *ppCP = _pFgColour[i]; + isFG = true; + return i+10; + } + if (hWnd == _pBgColour[i]->getHSelf()) + { + *ppCP = _pBgColour[i]; + isFG = false; + return i+10; + } + } + return -1; +} +void SymbolsStyleDialog::symbolAction(bool action) +{ + int id2Add, id2Remove; + int idButton2Disable, idButton2Enable; + if (action == ADD) + { + id2Add = IDC_ACTIVATED_SYMBOL_LIST; + id2Remove = IDC_AVAILABLE_SYMBOLS_LIST; + idButton2Enable = IDC_REMOVE_BUTTON; + idButton2Disable = IDC_ADD_BUTTON; + + } + else + { + id2Add = IDC_AVAILABLE_SYMBOLS_LIST; + id2Remove = IDC_ACTIVATED_SYMBOL_LIST; + idButton2Enable = IDC_ADD_BUTTON; + idButton2Disable = IDC_REMOVE_BUTTON; + } + int i = ::SendDlgItemMessage(_hSelf, id2Remove, LB_GETCURSEL, 0, 0); + TCHAR s[2]; + ::SendDlgItemMessage(_hSelf, id2Remove, LB_GETTEXT, i, (LPARAM)s); + + ::SendDlgItemMessage(_hSelf, id2Add, LB_ADDSTRING, 0, (LPARAM)s); + ::SendDlgItemMessage(_hSelf, id2Remove, LB_DELETESTRING, i, 0); + int count = ::SendDlgItemMessage(_hSelf, id2Remove, LB_GETCOUNT, 0, 0); + if (i == count) + i -= 1; + + ::SendDlgItemMessage(_hSelf, id2Remove, LB_SETCURSEL, i, 0); + count = ::SendDlgItemMessage(_hSelf, id2Remove, LB_GETCOUNT, 0, 0); + + // If there's no symbol, we activate another side + if (!count) + { + ::SendDlgItemMessage(_hSelf, id2Add, LB_SETCURSEL, 0, 0); + ::EnableWindow(::GetDlgItem(_hSelf, idButton2Enable), TRUE); + ::EnableWindow(::GetDlgItem(_hSelf, idButton2Disable), FALSE); + } + + // Get the operators list + count = ::SendDlgItemMessage(_hSelf, IDC_ACTIVATED_SYMBOL_LIST, LB_GETCOUNT, 0, 0); + + int j = 0; + for (int i = 0 ; i < count ; i++) + { + ::SendDlgItemMessage(_hSelf, IDC_ACTIVATED_SYMBOL_LIST, LB_GETTEXT, i, (LPARAM)s); + _pUserLang->_keywordLists[3][j++] = s[0]; + _pUserLang->_keywordLists[3][j++] = ' '; + } + _pUserLang->_keywordLists[3][--j] = '\0'; + + if (_pScintilla->getCurrentBuffer()->getLangType() == L_USER) + _pScintilla->styleChange(); +} + +void SymbolsStyleDialog::listboxsRemoveAll() +{ + int count = ::SendDlgItemMessage(_hSelf, IDC_AVAILABLE_SYMBOLS_LIST, LB_GETCOUNT, 0, 0); + for (int i = count-1 ; i >= 0 ; i--) + { + ::SendDlgItemMessage(_hSelf, IDC_AVAILABLE_SYMBOLS_LIST, LB_DELETESTRING, i, 0); + } + count = ::SendDlgItemMessage(_hSelf, IDC_ACTIVATED_SYMBOL_LIST, LB_GETCOUNT, 0, 0); + for (int i = count-1 ; i >= 0 ; i--) + { + ::SendDlgItemMessage(_hSelf, IDC_ACTIVATED_SYMBOL_LIST, LB_DELETESTRING, i, 0); + } +} +void SymbolsStyleDialog::updateDlg() +{ + listboxsReInit(); + + const TCHAR *symbols = _pUserLang->_keywordLists[KWL_OPERATOR_INDEX]; + + for (int i = 0 ; i < int(lstrlen(symbols)) ; i++) + { + if (symbols[i] != ' ') + { + TCHAR s[2]; + s[0] = symbols[i]; + s[1] = '\0'; + int index = ::SendDlgItemMessage(_hSelf, IDC_AVAILABLE_SYMBOLS_LIST, LB_FINDSTRING, (WPARAM)-1, (LPARAM)s); + if (index == LB_ERR) + continue; + + int id2Add = IDC_ACTIVATED_SYMBOL_LIST; + int id2Remove = IDC_AVAILABLE_SYMBOLS_LIST; + int idButton2Enable = IDC_REMOVE_BUTTON; + int idButton2Disable = IDC_ADD_BUTTON; + + ::SendDlgItemMessage(_hSelf, id2Add, LB_ADDSTRING, 0, (LPARAM)s); + ::SendDlgItemMessage(_hSelf, id2Remove, LB_DELETESTRING, index, 0); + int count = ::SendDlgItemMessage(_hSelf, id2Remove, LB_GETCOUNT, 0, 0); + if (index == count) + index -= 1; + + ::SendDlgItemMessage(_hSelf, id2Remove, LB_SETCURSEL, index, 0); + count = ::SendDlgItemMessage(_hSelf, id2Remove, LB_GETCOUNT, 0, 0); + + // If there's no symbol, we activate another side + if (!count) + { + ::SendDlgItemMessage(_hSelf, id2Add, LB_SETCURSEL, 0, 0); + ::EnableWindow(::GetDlgItem(_hSelf, idButton2Enable), TRUE); + ::EnableWindow(::GetDlgItem(_hSelf, idButton2Disable), FALSE); + } + } + } + + const TCHAR *delims = _pUserLang->_keywordLists[KWL_DELIM_INDEX]; + // ICI LE TRAITEMENT POUR REMPLIR LES 4 COMBO BOX + TCHAR dOpen1[2], dClose1[2], dOpen2[2], dClose2[2], dOpen3[2], dClose3[2]; + dOpen1[0] = dClose1[0] = dOpen2[0] = dClose2[0] = dOpen3[0] = dClose3[0] = '\0'; + dOpen1[1] = dClose1[1] = dOpen2[1] = dClose2[1] = dOpen3[1] = dClose3[1] = '\0'; + if (lstrlen(delims) >= 6) + { + if (delims[0] != '0') + dOpen1[0] = delims[0]; + + int i = ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BO2_COMBO, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)dOpen1); + if (i == CB_ERR) + i = 0; + ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BO2_COMBO,CB_SETCURSEL, i, 0); + + if (delims[1] != '0') + dOpen2[0] = delims[1]; + + i = ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BO3_COMBO, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)dOpen2); + if (i == CB_ERR) + i = 0; + ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BO3_COMBO,CB_SETCURSEL, i, 0); + + //if (delims[2] != '0') + //dOpen3 = delims[2]; + if (delims[3] != '0') + dClose1[0] = delims[3]; + + i = ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BC2_COMBO, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)dClose1); + if (i == CB_ERR) + i = 0; + ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BC2_COMBO,CB_SETCURSEL, i, 0); + + if (delims[4] != '0') + dClose2[0] = delims[4]; + + i = ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BC3_COMBO, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)dClose2); + if (i == CB_ERR) + i = 0; + ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BC3_COMBO,CB_SETCURSEL, i, 0); + //if (delims[5] != '0') + //dClose3 = delims[5]; + } + + + Style & opStyle = _pUserLang->_styleArray.getStyler(STYLE_OPERATOR_INDEX); + + styleUpdate(opStyle, _pFgColour[0], _pBgColour[0], IDC_SYMBOL_FONT_COMBO, IDC_SYMBOL_FONTSIZE_COMBO, + IDC_SYMBOL_BOLD_CHECK, IDC_SYMBOL_ITALIC_CHECK, IDC_SYMBOL_UNDERLINE_CHECK); + + Style & delim2Style = _pUserLang->_styleArray.getStyler(STYLE_DELIM2_INDEX); + + // the compatibility with the old xml + if (delim2Style._styleID = -1) + { + delim2Style._styleID = SCE_USER_DELIMITER1; + delim2Style._styleDesc = SymbolsStyleDialog::_delimTag1; + } + styleUpdate(delim2Style, _pFgColour[1], _pBgColour[1], IDC_SYMBOL_FONT2_COMBO, IDC_SYMBOL_FONTSIZE2_COMBO, + IDC_SYMBOL_BOLD2_CHECK, IDC_SYMBOL_ITALIC2_CHECK, IDC_SYMBOL_UNDERLINE2_CHECK); + + Style & delim3Style = _pUserLang->_styleArray.getStyler(STYLE_DELIM3_INDEX); + + // the compatibility with the old xml + if (delim3Style._styleID = -1) + { + delim3Style._styleID = SCE_USER_DELIMITER2; + delim3Style._styleDesc = SymbolsStyleDialog::_delimTag2; + } + styleUpdate(delim3Style, _pFgColour[2], _pBgColour[2], IDC_SYMBOL_FONT3_COMBO, IDC_SYMBOL_FONTSIZE3_COMBO, + IDC_SYMBOL_BOLD3_CHECK, IDC_SYMBOL_ITALIC3_CHECK, IDC_SYMBOL_UNDERLINE3_CHECK); + + // the compatibility with the old xml + if (_pUserLang->_styleArray.getNbStyler() < 13) + _pUserLang->_styleArray.setNbStyler(13); +} + +void SymbolsStyleDialog::listboxsInit() +{ + ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BO2_COMBO, CB_ADDSTRING, 0, (LPARAM)TEXT("")); + ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BC2_COMBO, CB_ADDSTRING, 0, (LPARAM)TEXT("")); + ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BO3_COMBO, CB_ADDSTRING, 0, (LPARAM)TEXT("")); + ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BC3_COMBO, CB_ADDSTRING, 0, (LPARAM)TEXT("")); + + for (int i = 0 ; i < int((sizeof(symbolesArray)/sizeof(TCHAR))-1) ; i++) + { + TCHAR s[2]; + s[0] = symbolesArray[i]; + s[1] = '\0'; + ::SendDlgItemMessage(_hSelf, IDC_AVAILABLE_SYMBOLS_LIST, LB_ADDSTRING, 0, (LPARAM)s); + ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BO2_COMBO, CB_ADDSTRING, 0, (LPARAM)s); + ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BC2_COMBO, CB_ADDSTRING, 0, (LPARAM)s); + ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BO3_COMBO, CB_ADDSTRING, 0, (LPARAM)s); + ::SendDlgItemMessage(_hSelf, IDC_SYMBOL_BC3_COMBO, CB_ADDSTRING, 0, (LPARAM)s); + } +} + +BOOL CALLBACK SymbolsStyleDialog::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_INITDIALOG : + { + // 2 listBoxes et 4 combobox + listboxsInit(); + + ::SendDlgItemMessage(_hSelf, IDC_AVAILABLE_SYMBOLS_LIST, LB_SETCURSEL, 0, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_REMOVE_BUTTON), FALSE); + + return SharedParametersDialog::run_dlgProc(Message, wParam, lParam); + } + + case WM_COMMAND : + { + //int toto = HIWORD(wParam); + if ((wParam == IDC_ADD_BUTTON) || (wParam == IDC_REMOVE_BUTTON)) + { + symbolAction((wParam == IDC_ADD_BUTTON)?ADD:REMOVE); + if (_pScintilla->getCurrentBuffer()->getLangType() == L_USER) + _pScintilla->styleChange(); + return TRUE; + } + // car LBN_SELCHANGE == CBN_SELCHANGE == 1 + else if ((HIWORD(wParam) == LBN_SELCHANGE) ||(HIWORD(wParam) == CBN_SELCHANGE)) + { + if ((LOWORD(wParam) == IDC_ACTIVATED_SYMBOL_LIST) || (LOWORD(wParam) == IDC_AVAILABLE_SYMBOLS_LIST)) + { + int idButton2Enable; + int idButton2Disable; + + if (LOWORD(wParam) == IDC_AVAILABLE_SYMBOLS_LIST) + { + idButton2Enable = IDC_ADD_BUTTON; + idButton2Disable = IDC_REMOVE_BUTTON; + } + else + { + idButton2Enable = IDC_REMOVE_BUTTON; + idButton2Disable = IDC_ADD_BUTTON; + } + + int i = ::SendDlgItemMessage(_hSelf, LOWORD(wParam), LB_GETCURSEL, 0, 0); + if (i != LB_ERR) + { + ::EnableWindow(::GetDlgItem(_hSelf, idButton2Enable), TRUE); + int idListbox2Disable = (LOWORD(wParam)== IDC_AVAILABLE_SYMBOLS_LIST)?IDC_ACTIVATED_SYMBOL_LIST:IDC_AVAILABLE_SYMBOLS_LIST; + ::SendDlgItemMessage(_hSelf, idListbox2Disable, LB_SETCURSEL, (WPARAM)-1, 0); + ::EnableWindow(::GetDlgItem(_hSelf, idButton2Disable), FALSE); + } + return TRUE; + } + else if ((LOWORD(wParam) == IDC_SYMBOL_BO2_COMBO) || (LOWORD(wParam) == IDC_SYMBOL_BC2_COMBO) || + (LOWORD(wParam) == IDC_SYMBOL_BO3_COMBO) || (LOWORD(wParam) == IDC_SYMBOL_BC3_COMBO)) + { + TCHAR charStr[5] = TEXT(""); + int i = ::SendDlgItemMessage(_hSelf, LOWORD(wParam), CB_GETCURSEL, 0, 0); + ::SendDlgItemMessage(_hSelf, LOWORD(wParam), CB_GETLBTEXT, i, (LPARAM)charStr); + int symbIndex; + + if (LOWORD(wParam) == IDC_SYMBOL_BO2_COMBO) + symbIndex = 0; + else if (LOWORD(wParam) == IDC_SYMBOL_BO3_COMBO) + symbIndex = 1; + else if (LOWORD(wParam) == IDC_SYMBOL_BC2_COMBO) + symbIndex = 3; + else // (LOWORD(wParam) == IDC_SYMBOL_BC3_COMBO) + symbIndex = 4; + + TCHAR *delims = _pUserLang->_keywordLists[KWL_DELIM_INDEX]; + delims[symbIndex] = charStr[0]?charStr[0]:'0'; + + if (_pScintilla->getCurrentBuffer()->getLangType() == L_USER) + _pScintilla->styleChange(); + return TRUE; + } + else + return SharedParametersDialog::run_dlgProc(Message, wParam, lParam); + } + } + default : + return SharedParametersDialog::run_dlgProc(Message, wParam, lParam); + } + return FALSE; +} + +int SymbolsStyleDialog::getGroupeIndexFromCheck(int ctrlID, int & fontStyleMask) const +{ + switch (ctrlID) + { + case IDC_SYMBOL_BOLD_CHECK : + { + fontStyleMask = FONTSTYLE_BOLD; + return STYLE_OPERATOR_INDEX; + } + case IDC_SYMBOL_ITALIC_CHECK : + { + fontStyleMask = FONTSTYLE_ITALIC; + return STYLE_OPERATOR_INDEX; + } + case IDC_SYMBOL_UNDERLINE_CHECK : + { + fontStyleMask = FONTSTYLE_UNDERLINE; + return STYLE_OPERATOR_INDEX; + } + + case IDC_SYMBOL_BOLD2_CHECK : + { + fontStyleMask = FONTSTYLE_BOLD; + return STYLE_DELIM2_INDEX; + } + case IDC_SYMBOL_ITALIC2_CHECK : + { + fontStyleMask = FONTSTYLE_ITALIC; + return STYLE_DELIM2_INDEX; + } + case IDC_SYMBOL_UNDERLINE2_CHECK : + { + fontStyleMask = FONTSTYLE_UNDERLINE; + return STYLE_DELIM2_INDEX; + } + + case IDC_SYMBOL_BOLD3_CHECK : + { + fontStyleMask = FONTSTYLE_BOLD; + return STYLE_DELIM3_INDEX; + } + case IDC_SYMBOL_ITALIC3_CHECK : + { + fontStyleMask = FONTSTYLE_ITALIC; + return STYLE_DELIM3_INDEX; + } + case IDC_SYMBOL_UNDERLINE3_CHECK : + { + fontStyleMask = FONTSTYLE_UNDERLINE; + return STYLE_DELIM3_INDEX; + } + + default : + return -1; + } +} + +TCHAR styleName[][32] = {TEXT("DEFAULT"), TEXT("FOLDEROPEN"), TEXT("FOLDERCLOSE"), TEXT("KEYWORD1"), TEXT("KEYWORD2"), TEXT("KEYWORD3"), TEXT("KEYWORD4"), TEXT("COMMENT"), TEXT("COMMENT LINE"), TEXT("NUMBER"), TEXT("OPERATOR"), TEXT("DELIMINER1"), TEXT("DELIMINER2"), TEXT("DELIMINER3")}; + + +UserDefineDialog::UserDefineDialog(): SharedParametersDialog(), _status(UNDOCK), _yScrollPos(0), _prevHightVal(0), _isDirty(false) +{ + _pCurrentUserLang = new UserLangContainer(); + + // @REF #01 NE CHANGER PAS D'ORDRE !!! + _pCurrentUserLang->_styleArray.addStyler(SCE_USER_IDENTIFIER, styleName[0]); + _pCurrentUserLang->_styleArray.addStyler(SCE_USER_BLOCK_OPERATOR_OPEN, styleName[1]); + _pCurrentUserLang->_styleArray.addStyler(SCE_USER_BLOCK_OPERATOR_CLOSE, styleName[2]); + _pCurrentUserLang->_styleArray.addStyler(SCE_USER_WORD1, styleName[3]); + _pCurrentUserLang->_styleArray.addStyler(SCE_USER_WORD2, styleName[4]); + _pCurrentUserLang->_styleArray.addStyler(SCE_USER_WORD3, styleName[5]); + _pCurrentUserLang->_styleArray.addStyler(SCE_USER_WORD4, styleName[6]); + _pCurrentUserLang->_styleArray.addStyler(SCE_USER_COMMENT, styleName[7]); + _pCurrentUserLang->_styleArray.addStyler(SCE_USER_COMMENTLINE, styleName[8]); + _pCurrentUserLang->_styleArray.addStyler(SCE_USER_NUMBER, styleName[9]); + _pCurrentUserLang->_styleArray.addStyler(SCE_USER_OPERATOR, styleName[10]); + _pCurrentUserLang->_styleArray.addStyler(SCE_USER_DELIMITER1, styleName[11]); + _pCurrentUserLang->_styleArray.addStyler(SCE_USER_DELIMITER2, styleName[12]); + _pCurrentUserLang->_styleArray.addStyler(SCE_USER_DELIMITER3, styleName[13]); +} + +UserDefineDialog::~UserDefineDialog() +{ + delete _pCurrentUserLang; +} + +void UserDefineDialog::changeStyle() +{ + display(false); + _status = !_status; + ::SetDlgItemText(_hSelf, IDC_DOCK_BUTTON, (_status == DOCK)?TEXT("Undock"):TEXT("Dock")); + + long style = ::GetWindowLongPtr(_hSelf, GWL_STYLE); + if (!style) + ::MessageBox(NULL, TEXT("echou GetWindowLongPtr"), TEXT(""), MB_OK); + + style = (_status == DOCK)? + ((style & ~WS_POPUP) & ~DS_MODALFRAME & ~WS_CAPTION) | WS_CHILD : + (style & ~WS_CHILD) | WS_POPUP | DS_MODALFRAME | WS_CAPTION; + + long result = ::SetWindowLongPtr(_hSelf, GWL_STYLE, style); + if (!result) + ::MessageBox(NULL, TEXT("echou SetWindowLongPtr"), TEXT(""), MB_OK); + + if (_status == DOCK) + getActualPosSize(); + else + restorePosSize(); + + ::SetWindowPos(_hSelf, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOOWNERZORDER | SWP_FRAMECHANGED | SWP_NOREPOSITION); + ::SetParent(_hSelf, (_status == DOCK)?_hParent:NULL); +} + +void UserDefineDialog::enableLangAndControlsBy(int index) +{ + _pUserLang = (index == 0)?_pCurrentUserLang:&((NppParameters::getInstance())->getULCFromIndex(index - 1)); + if (index != 0) + ::SetWindowText(::GetDlgItem(_hSelf, IDC_EXT_EDIT), _pUserLang->_ext.c_str()); + + ::ShowWindow(::GetDlgItem(_hSelf, IDC_EXT_STATIC), (index == 0)?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_EXT_EDIT), (index == 0)?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_RENAME_BUTTON), (index == 0)?SW_HIDE:SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_REMOVELANG_BUTTON), (index == 0)?SW_HIDE:SW_SHOW); +} + +void UserDefineDialog::updateDlg() +{ + if (!_isDirty) + { + int i = ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_GETCURSEL, 0, 0); + if (i > 0) + _isDirty = true; + } + ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_IGNORECASE_CHECK, BM_SETCHECK, _pUserLang->_isCaseIgnored, 0); + _folderStyleDlg.updateDlg(); + _keyWordsStyleDlg.updateDlg(); + _commentStyleDlg.updateDlg(); + _symbolsStyleDlg.updateDlg(); +} + +BOOL CALLBACK UserDefineDialog::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + NppParameters *pNppParam = NppParameters::getInstance(); + switch (message) + { + case WM_INITDIALOG : + { + _ctrlTab.init(_hInst, _hSelf, false); + _ctrlTab.setFont(TEXT("Tahoma"), 13); + + _folderStyleDlg.init(_hInst, _hSelf); + _folderStyleDlg.create(IDD_FOLDER_STYLE_DLG); + _folderStyleDlg.display(); + + _keyWordsStyleDlg.init(_hInst, _hSelf); + _keyWordsStyleDlg.create(IDD_KEYWORD_STYLE_DLG); + _keyWordsStyleDlg.display(false); + + _commentStyleDlg.init(_hInst, _hSelf); + _commentStyleDlg.create(IDD_COMMENT_STYLE_DLG); + _commentStyleDlg.display(false); + + _symbolsStyleDlg.init(_hInst, _hSelf); + _symbolsStyleDlg.create(IDD_SYMBOL_STYLE_DLG); + _symbolsStyleDlg.display(false); + + _wVector.push_back(DlgInfo(&_folderStyleDlg, TEXT("Folder && Default"))); + _wVector.push_back(DlgInfo(&_keyWordsStyleDlg, TEXT("Keywords Lists"))); + _wVector.push_back(DlgInfo(&_commentStyleDlg, TEXT("Comment && Number"))); + _wVector.push_back(DlgInfo(&_symbolsStyleDlg, TEXT("Operators"))); + + _ctrlTab.createTabs(_wVector); + _ctrlTab.display(); + + RECT arc; + ::GetWindowRect(::GetDlgItem(_hSelf, IDC_ADDNEW_BUTTON), &arc); + + POINT p; + p.x = arc.left; + p.y = arc.bottom; + ::ScreenToClient(_hSelf, &p); + + RECT rc; + getClientRect(rc); + rc.top = p.y + 10; + rc.bottom -= 100; + _ctrlTab.reSizeTo(rc); + + _folderStyleDlg.reSizeTo(rc); + _keyWordsStyleDlg.reSizeTo(rc); + _commentStyleDlg.reSizeTo(rc); + _symbolsStyleDlg.reSizeTo(rc); + + ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_ADDSTRING, 0, (LPARAM)TEXT("User Define Language")); + for (int i = 0 ; i < pNppParam->getNbUserLang() ; i++) + { + UserLangContainer & userLangContainer = pNppParam->getULCFromIndex(i); + ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_ADDSTRING, 0, (LPARAM)userLangContainer.getName()); + } + ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_SETCURSEL, 0, 0); + enableLangAndControlsBy(0); + + _pUserLang = _pCurrentUserLang; + + if (pNppParam->isTransparentAvailable()) + { + ::ShowWindow(::GetDlgItem(_hSelf, IDC_UD_TRANSPARENT_CHECK), SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_UD_PERCENTAGE_SLIDER), SW_SHOW); + + ::SendDlgItemMessage(_hSelf, IDC_UD_PERCENTAGE_SLIDER, TBM_SETRANGE, FALSE, MAKELONG(20, 200)); + ::SendDlgItemMessage(_hSelf, IDC_UD_PERCENTAGE_SLIDER, TBM_SETPOS, TRUE, 150); + if (!(BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_UD_PERCENTAGE_SLIDER, BM_GETCHECK, 0, 0))) + ::EnableWindow(::GetDlgItem(_hSelf, IDC_UD_PERCENTAGE_SLIDER), FALSE); + } + SCROLLINFO si; + si.cbSize = sizeof(si); + si.fMask = SIF_RANGE; //| SIF_PAGE; + si.nMin = 0; + si.nMax = 0; + //si.nPage = _currentHight; + //si.nPos = 0; + ::SetScrollInfo(_hSelf, SB_VERT, &si, TRUE); + + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + { + //enableDlgTheme(_hSelf, ETDT_ENABLETAB); + } + + return TRUE; + } + + case WM_NOTIFY : + { + NMHDR *nmhdr = (NMHDR *)lParam; + if (nmhdr->code == TCN_SELCHANGE) + { + if (nmhdr->hwndFrom == _ctrlTab.getHSelf()) + { + _ctrlTab.clickedUpdate(); + return TRUE; + } + } + break; + } + + case WM_HSCROLL : + { + if ((HWND)lParam == ::GetDlgItem(_hSelf, IDC_UD_PERCENTAGE_SLIDER)) + { + int percent = ::SendDlgItemMessage(_hSelf, IDC_UD_PERCENTAGE_SLIDER, TBM_GETPOS, 0, 0); + pNppParam->SetTransparent(_hSelf, percent/*HIWORD(wParam)*/); + } + return TRUE; + } + + case WM_COMMAND : + { + if (HIWORD(wParam) == EN_CHANGE) + { + TCHAR ext[extsLenMax]; + ::SendDlgItemMessage(_hSelf, IDC_EXT_EDIT, WM_GETTEXT, extsLenMax, (LPARAM)ext); + _pUserLang->_ext = ext; + return TRUE; + } + else if (HIWORD(wParam) == CBN_SELCHANGE) + { + if (LOWORD(wParam) == IDC_LANGNAME_COMBO) + { + int i = ::SendDlgItemMessage(_hSelf, LOWORD(wParam), CB_GETCURSEL, 0, 0); + enableLangAndControlsBy(i); + updateDlg(); + } + return TRUE; + } + else + { + switch (wParam) + { + case IDC_DOCK_BUTTON : + { + int msg = WM_UNDOCK_USERDEFINE_DLG; + + if (_status == UNDOCK) + { + if (pNppParam->isTransparentAvailable()) + { + pNppParam->removeTransparent(_hSelf); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_UD_TRANSPARENT_CHECK), SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_UD_PERCENTAGE_SLIDER), SW_HIDE); + } + msg = WM_DOCK_USERDEFINE_DLG; + } + + changeStyle(); + + if (_status == UNDOCK) + { + if (pNppParam->isTransparentAvailable()) + { + bool isChecked = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_UD_TRANSPARENT_CHECK, BM_GETCHECK, 0, 0)); + if (isChecked) + { + int percent = ::SendDlgItemMessage(_hSelf, IDC_UD_PERCENTAGE_SLIDER, TBM_GETPOS, 0, 0); + pNppParam->SetTransparent(_hSelf, percent); + } + ::ShowWindow(::GetDlgItem(_hSelf, IDC_UD_TRANSPARENT_CHECK), SW_SHOW); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_UD_PERCENTAGE_SLIDER), SW_SHOW); + } + } + ::SendMessage(_hParent, msg, 0, 0); + return TRUE; + } + case IDCANCEL : + ::SendMessage(_hParent, WM_CLOSE_USERDEFINE_DLG, 0, 0); + display(false); + return TRUE; + + case IDC_REMOVELANG_BUTTON : + { + int result = ::MessageBox(_hSelf, TEXT("Are you sure?"), TEXT("Remove the current language"), MB_YESNO); + if (result == IDYES) + { + int i = ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_GETCURSEL, 0, 0); + TCHAR langName[256]; + ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_GETLBTEXT, i, (LPARAM)langName); + + //remove current language from combobox + ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_DELETESTRING, i, 0); + ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_SETCURSEL, i-1, 0); + ::SendMessage(_hSelf, WM_COMMAND, MAKELONG(IDC_LANGNAME_COMBO, CBN_SELCHANGE), (LPARAM)::GetDlgItem(_hSelf, IDC_LANGNAME_COMBO)); + + //remove current language from userLangArray + pNppParam->removeUserLang(i-1); + + //remove current language from langMenu + HWND hNpp = ::GetParent(_hSelf); + ::RemoveMenu(::GetSubMenu((HMENU)::SendMessage(hNpp, NPPM_INTERNAL_GETMENU, 0, 0), MENUINDEX_LANGUAGE), IDM_LANG_USER + i, MF_BYCOMMAND); + ::DrawMenuBar(hNpp); + ::SendMessage(_hParent, WM_REMOVE_USERLANG, 0, (LPARAM)langName); + } + return TRUE; + } + case IDC_RENAME_BUTTON : + { + TCHAR langName[256]; + int i = ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_GETCURSEL, 0, 0); + ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_GETLBTEXT, i, (LPARAM)langName); + + StringDlg strDlg; + strDlg.init(_hInst, _hSelf, TEXT("Rename Current Language Name"), TEXT("Name : "), langName, langNameLenMax-1); + + TCHAR *newName = (TCHAR *)strDlg.doDialog(); + + if (newName) + { + if (pNppParam->isExistingUserLangName(newName)) + { + ::MessageBox(_hSelf, TEXT("This name is used by another language,\rplease give another one."), TEXT("Err"), MB_OK); + ::PostMessage(_hSelf, WM_COMMAND, IDC_RENAME_BUTTON, 0); + return TRUE; + } + //rename current language name in combobox + ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_DELETESTRING, i, 0); + ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_INSERTSTRING, i, (LPARAM)newName); + ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_SETCURSEL, i, 0); + + //rename current language name in userLangArray + UserLangContainer & userLangContainer = pNppParam->getULCFromIndex(i-1); + userLangContainer._name = newName; + + //rename current language name in langMenu + HWND hNpp = ::GetParent(_hSelf); + ::ModifyMenu(::GetSubMenu((HMENU)::SendMessage(hNpp, NPPM_INTERNAL_GETMENU, 0, 0), MENUINDEX_LANGUAGE), IDM_LANG_USER + i, MF_BYCOMMAND, IDM_LANG_USER + i, newName); + ::DrawMenuBar(hNpp); + ::SendMessage(_hParent, WM_RENAME_USERLANG, (WPARAM)newName, (LPARAM)langName); + } + + return TRUE; + } + + case IDC_ADDNEW_BUTTON : + case IDC_SAVEAS_BUTTON : + { + //TCHAR langName[256]; + int i = ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_GETCURSEL, 0, 0); + //::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_GETLBTEXT, i, (LPARAM)langName); + if (i == 0) + wParam = IDC_ADDNEW_BUTTON; + + StringDlg strDlg; + if (wParam == IDC_SAVEAS_BUTTON) + strDlg.init(_hInst, _hSelf, TEXT("Save Current Language Name As..."), TEXT("Name : "), TEXT(""), langNameLenMax-1); + else + strDlg.init(_hInst, _hSelf, TEXT("Create New Language..."), TEXT("Name : "), TEXT(""), langNameLenMax-1); + + TCHAR *tmpName = (TCHAR *)strDlg.doDialog(); + //const TCHAR *newName = newNameString.c_str(); + + if (tmpName) + { + generic_string newNameString(tmpName); + const TCHAR *newName = newNameString.c_str(); + + if (pNppParam->isExistingUserLangName(newName)) + { + ::MessageBox(_hSelf, TEXT("This name is used by another language,\rplease give another one."), TEXT("Err"), MB_OK); + ::PostMessage(_hSelf, WM_COMMAND, IDC_RENAME_BUTTON, 0); + return TRUE; + } + //add current language in userLangArray at the end as a new lang + UserLangContainer & userLang = (wParam == IDC_SAVEAS_BUTTON)?pNppParam->getULCFromIndex(i-1):*_pCurrentUserLang; + int newIndex = pNppParam->addUserLangToEnd(userLang, newName); + + //add new language name in combobox + ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_ADDSTRING, 0, LPARAM(newName)); + ::SendDlgItemMessage(_hSelf, IDC_LANGNAME_COMBO, CB_SETCURSEL, newIndex + 1, 0); + ::SendMessage(_hSelf, WM_COMMAND, MAKELONG(IDC_LANGNAME_COMBO, CBN_SELCHANGE), (LPARAM)::GetDlgItem(_hSelf, IDC_LANGNAME_COMBO)); + + //add new language name in langMenu + HWND hNpp = ::GetParent(_hSelf); + ::InsertMenu(::GetSubMenu((HMENU)::SendMessage(hNpp, NPPM_INTERNAL_GETMENU, 0, 0), MENUINDEX_LANGUAGE), IDM_LANG_USER + newIndex /*+ 1*/, MF_BYCOMMAND, IDM_LANG_USER + newIndex + 1, newName); + ::DrawMenuBar(hNpp); + } + + return TRUE; + } + + case IDC_UD_TRANSPARENT_CHECK : + { + bool isChecked = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_UD_TRANSPARENT_CHECK, BM_GETCHECK, 0, 0)); + if (isChecked) + { + int percent = ::SendDlgItemMessage(_hSelf, IDC_UD_PERCENTAGE_SLIDER, TBM_GETPOS, 0, 0); + pNppParam->SetTransparent(_hSelf, percent); + } + else + pNppParam->removeTransparent(_hSelf); + + ::EnableWindow(::GetDlgItem(_hSelf, IDC_UD_PERCENTAGE_SLIDER), isChecked); + return TRUE; + } + + case IDC_LANGNAME_IGNORECASE_CHECK : + return setPropertyByCheck(_hSelf, wParam, _pUserLang->_isCaseIgnored); + + default : + break; + } + } + return FALSE; + } + + case WM_DESTROY: + { + _folderStyleDlg.destroy(); + _keyWordsStyleDlg.destroy(); + _commentStyleDlg.destroy(); + _symbolsStyleDlg.destroy(); + + _ctrlTab.destroy(); + return TRUE; + } + + case WM_SIZE: + { + int originalHight = _dlgPos.bottom; //- ((_status == DOCK)?_dlgPos.top:0); + _currentHight = HIWORD (lParam); + + int diff = _currentHight - _prevHightVal; + _prevHightVal = _currentHight; + + int maxPos = originalHight - _currentHight; + // Set the vertical scrolling range and page size + SCROLLINFO si; + si.cbSize = sizeof(si); + si.fMask = SIF_RANGE | SIF_PAGE; + si.nMin = 0; + si.nMax = (_status == UNDOCK)?0:originalHight; + si.nPage = _currentHight; + //si.nPos = 0; + ::SetScrollInfo(_hSelf, SB_VERT, &si, TRUE); + + if ((_yScrollPos >= maxPos) && (_currentHight < originalHight)) + { + //int nDelta = min(max(maxPos/10,5), maxPos - _yScrollPos); + if (_yScrollPos > 0) + { + _yScrollPos -= diff; + ::SetScrollPos(_hSelf, SB_VERT, _yScrollPos, TRUE); + ::ScrollWindow(_hSelf, 0, diff, NULL, NULL); + } + } + return TRUE; + } + + case WM_VSCROLL : + { + int originalHight = _dlgPos.bottom; + int oldy = _yScrollPos; + int maxPos = originalHight - _currentHight; + + switch (LOWORD (wParam)) + { + // user clicked the top arrow + case SB_LINEUP: + if (_yScrollPos <= 0) + return FALSE; + _yScrollPos = 0; + break; + + // user clicked the bottom arrow + case SB_LINEDOWN: + if (_yScrollPos >= maxPos) + return FALSE; + _yScrollPos = maxPos; + break; + + case SB_PAGEDOWN: + if (_yScrollPos >= maxPos) + return FALSE; + _yScrollPos = maxPos; + break; + + case SB_PAGEUP: + if (_yScrollPos <= 0) + return FALSE; + _yScrollPos = 0; + break; + + case SB_THUMBTRACK: + case SB_THUMBPOSITION: + _yScrollPos = (int)HIWORD(wParam); + break; + + default : + return FALSE; + } + ::SetScrollPos(_hSelf, SB_VERT, _yScrollPos, TRUE); + ::ScrollWindow(_hSelf, 0, oldy-_yScrollPos, NULL, NULL); + } + case NPPM_MODELESSDIALOG : + return ::SendMessage(_hParent, NPPM_MODELESSDIALOG, wParam, lParam); + } + + return FALSE; +} diff --git a/PowerEditor/src/ScitillaComponent/UserDefineDialog.h b/PowerEditor/src/ScitillaComponent/UserDefineDialog.h new file mode 100644 index 00000000..ba4cef97 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/UserDefineDialog.h @@ -0,0 +1,505 @@ +/* +this file is part of Notepad++ +Copyright (C)2003 Don HO + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#ifndef USER_DEFINE_H +#define USER_DEFINE_H + +#include +#include + +#include "UserDefineResource.h" +#include "ControlsTab.h" +#include "ColourPicker.h" +#include "UserDefineLangReference.h" +//#include "Parameters.h" + +#ifdef __GNUC__ + +static int min(int a, int b) { + return (ab)?a:b; +}; + +#endif //__GNUC__ +class ScintillaEditView; +class UserLangContainer; +struct Style; + +#define WL_LEN_MAX 1024 + +#define BOLD_MASK 1 +#define ITALIC_MASK 2 + +const int nbWordList = 4; +const int nbBlockColor = 5; +const int nbBoolean = 5; + +const bool DOCK = true; +const bool UNDOCK = false; + +const int maxNbGroup = 10; + +const int KWL_FOLDER_OPEN_INDEX = 1; +const int KWL_FOLDER_CLOSE_INDEX = 2; +const int KWL_OPERATOR_INDEX = 3; +const int KWL_COMMENT_INDEX = 4; +const int KWL_KW1_INDEX = 5; +const int KWL_KW2_INDEX = 6; +const int KWL_KW3_INDEX = 7; +const int KWL_KW4_INDEX = 8; +const int KWL_DELIM_INDEX = 0; + +const int STYLE_DEFAULT_INDEX = 0; +const int STYLE_BLOCK_OPEN_INDEX = 1; +const int STYLE_BLOCK_CLOSE_INDEX = 2; +const int STYLE_WORD1_INDEX = 3; +const int STYLE_WORD2_INDEX = 4; +const int STYLE_WORD3_INDEX = 5; +const int STYLE_WORD4_INDEX = 6; +const int STYLE_COMMENT_INDEX = 7; +const int STYLE_COMMENTLINE_INDEX = 8; +const int STYLE_NUMBER_INDEX = 9; +const int STYLE_OPERATOR_INDEX = 10; +const int STYLE_DELIM2_INDEX = 11; +const int STYLE_DELIM3_INDEX = 12; + + + +class SharedParametersDialog : public StaticDialog +{ +public: + SharedParametersDialog() {}; + SharedParametersDialog(int nbGroup) : _nbGroup(nbGroup) {}; + virtual void updateDlg() = 0; + + +protected : + //Shared data + static UserLangContainer *_pUserLang; + static ScintillaEditView *_pScintilla; + + //data for per object + int _nbGroup; + ColourPicker *_pFgColour[maxNbGroup]; + ColourPicker *_pBgColour[maxNbGroup]; + int _fgStatic[maxNbGroup]; + int _bgStatic[maxNbGroup]; + int _fontSizeCombo[maxNbGroup]; + int _fontNameCombo[maxNbGroup]; + + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); + void initControls(); + void styleUpdate(const Style & style, ColourPicker *pFgColourPicker, ColourPicker *pBgColourPicker, + int fontComboId, int fontSizeComboId, int boldCheckId, int italicCheckId, int underlineCheckId); + + bool setPropertyByCheck(HWND hwnd, WPARAM id, bool & bool2set); + virtual void setKeywords2List(int ctrlID) = 0; + virtual int getGroupIndexFromCombo(int ctrlID, bool & isFontSize) const = 0; + virtual int getStylerIndexFromCP(HWND hWnd, bool & isFG, ColourPicker **ppCP) const = 0; + virtual int getGroupeIndexFromCheck(int ctrlID, int & fontStyleMask) const = 0; + + +}; + +class FolderStyleDialog : public SharedParametersDialog +{ +public: + FolderStyleDialog(); + void updateDlg(); +protected : + void setKeywords2List(int ctrlID); + + int getGroupIndexFromCombo(int ctrlID, bool & isFontSize) const { + switch (ctrlID) + { + case IDC_DEFAULT_FONT_COMBO : + isFontSize = false; + return STYLE_DEFAULT_INDEX; + + case IDC_DEFAULT_FONTSIZE_COMBO : + isFontSize = true; + return STYLE_DEFAULT_INDEX; + + case IDC_FOLDEROPEN_FONT_COMBO : + isFontSize = false; + return STYLE_BLOCK_OPEN_INDEX; + + case IDC_FOLDEROPEN_FONTSIZE_COMBO : + isFontSize = true; + return STYLE_BLOCK_OPEN_INDEX; + + case IDC_FOLDERCLOSE_FONT_COMBO : + isFontSize = false; + return STYLE_BLOCK_CLOSE_INDEX; + + case IDC_FOLDERCLOSE_FONTSIZE_COMBO : + isFontSize = true; + return STYLE_BLOCK_CLOSE_INDEX; + + default : + return -1; + } + }; + int getStylerIndexFromCP(HWND hWnd, bool & isFG, ColourPicker **ppCP) const; + int getGroupeIndexFromCheck(int ctrlID, int & fontStyleMask) const; +}; + +class KeyWordsStyleDialog : public SharedParametersDialog +{ +public: + KeyWordsStyleDialog() ; + void updateDlg(); + +protected : + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); + void setKeywords2List(int id); + + // SEE @REF #01 + int getGroupIndexFromCombo(int ctrlID, bool & isFontSize) const { + switch (ctrlID) + { + case IDC_KEYWORD1_FONT_COMBO : + isFontSize = false; + return STYLE_WORD1_INDEX; + + case IDC_KEYWORD1_FONTSIZE_COMBO : + isFontSize = true; + return STYLE_WORD1_INDEX; + + case IDC_KEYWORD2_FONT_COMBO : + isFontSize = false; + return STYLE_WORD2_INDEX; + + case IDC_KEYWORD2_FONTSIZE_COMBO : + isFontSize = true; + return STYLE_WORD2_INDEX; + + case IDC_KEYWORD3_FONT_COMBO : + isFontSize = false; + return STYLE_WORD3_INDEX; + + case IDC_KEYWORD3_FONTSIZE_COMBO : + isFontSize = true; + return STYLE_WORD3_INDEX; + + case IDC_KEYWORD4_FONT_COMBO : + isFontSize = false; + return STYLE_WORD4_INDEX; + + case IDC_KEYWORD4_FONTSIZE_COMBO : + isFontSize = true; + return STYLE_WORD4_INDEX; + + default : + return -1; + } + }; + int getStylerIndexFromCP(HWND hWnd, bool & isFG, ColourPicker **ppCP) const; + int getGroupeIndexFromCheck(int ctrlID, int & fontStyleMask) const; +}; + +class CommentStyleDialog : public SharedParametersDialog +{ +public : + CommentStyleDialog(); + void updateDlg(); +protected : + + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); + + void setKeywords2List(int id); + int getGroupIndexFromCombo(int ctrlID, bool & isFontSize) const { + switch (ctrlID) + { + case IDC_COMMENT_FONT_COMBO : + isFontSize = false; + return STYLE_COMMENT_INDEX; + + case IDC_COMMENT_FONTSIZE_COMBO : + isFontSize = true; + return STYLE_COMMENT_INDEX; + + case IDC_COMMENTLINE_FONT_COMBO : + isFontSize = false; + return STYLE_COMMENTLINE_INDEX; + + case IDC_COMMENTLINE_FONTSIZE_COMBO : + isFontSize = true; + return STYLE_COMMENTLINE_INDEX; + + case IDC_NUMBER_FONT_COMBO : + isFontSize = false; + return STYLE_NUMBER_INDEX; + + case IDC_NUMBER_FONTSIZE_COMBO : + isFontSize = true; + return STYLE_NUMBER_INDEX; + + + default : + return -1; + } + }; + + int getStylerIndexFromCP(HWND hWnd, bool & isFG, ColourPicker **ppCP) const; + int getGroupeIndexFromCheck(int ctrlID, int & fontStyleMask) const; + +private : + void convertTo(TCHAR *dest, const TCHAR *toConvert, TCHAR prefix) const; + void retrieve(TCHAR *dest, const TCHAR *toRetrieve, TCHAR prefix) const; +}; + +class SymbolsStyleDialog : public SharedParametersDialog +{ +public : + static const bool ADD; + static const bool REMOVE; + SymbolsStyleDialog(); + void updateDlg(); +protected : + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); + void setKeywords2List(int ctrlID) {}; + int getGroupIndexFromCombo(int ctrlID, bool & isFontSize) const { + switch (ctrlID) + { + case IDC_SYMBOL_FONT_COMBO : + isFontSize = false; + return STYLE_OPERATOR_INDEX; + + case IDC_SYMBOL_FONTSIZE_COMBO : + isFontSize = true; + return STYLE_OPERATOR_INDEX; + + case IDC_SYMBOL_FONT2_COMBO : + isFontSize = false; + return STYLE_DELIM2_INDEX; + + case IDC_SYMBOL_FONTSIZE2_COMBO : + isFontSize = true; + return STYLE_DELIM2_INDEX; + + case IDC_SYMBOL_FONT3_COMBO : + isFontSize = false; + return STYLE_DELIM3_INDEX; + + case IDC_SYMBOL_FONTSIZE3_COMBO : + isFontSize = true; + return STYLE_DELIM3_INDEX; + + default : + return -1; + } + }; + int getStylerIndexFromCP(HWND hWnd, bool & isFG, ColourPicker **ppCP) const; + int getGroupeIndexFromCheck(int ctrlID, int & fontStyleMask) const; + +private : + // 2 static const TCHAR * to have the compatibility with the old xml + static const TCHAR *_delimTag1; + static const TCHAR *_delimTag2; + + void symbolAction(bool action); + void listboxsRemoveAll(); + void listboxsInit(); + void listboxsReInit() { + listboxsRemoveAll(); + listboxsInit(); + }; +}; + +class UserDefineDialog : public SharedParametersDialog +{ +friend class ScintillaEditView; +public : + UserDefineDialog(); + ~UserDefineDialog(); + + void init(HINSTANCE hInst, HWND hPere, ScintillaEditView *pSev) { + if (!_pScintilla) + { + Window::init(hInst, hPere); + _pScintilla = pSev; + } + }; + + void setScintilla(ScintillaEditView *pScinView) { + _pScintilla = pScinView; + }; + + virtual void create(int dialogID, bool isRTL = false) { + StaticDialog::create(dialogID, isRTL); + } + + void destroy() { + // A Ajouter les fils... + }; + int getWidth() const { + return _dlgPos.right; + }; + + int getHeight() const { + return _dlgPos.bottom; + }; + void doDialog(bool willBeShown = true, bool isRTL = false) { + if (!isCreated()) + create(IDD_GLOBAL_USERDEFINE_DLG, isRTL); + display(willBeShown); + }; + + virtual void reSizeTo(RECT & rc) // should NEVER be const !!! + { + Window::reSizeTo(rc); + display(false); + display(); + }; + + void changeStyle(); + bool isDocked() const {return _status == DOCK;}; + void setDockStatus(bool isDocked) {_status = isDocked;}; + + int getNbKeywordList() {return nbKeywodList;}; + bool isDirty() const {return _isDirty;}; + HWND getFolderHandle() const { + return _folderStyleDlg.getHSelf(); + }; + + HWND getKeywordsHandle() const { + return _keyWordsStyleDlg.getHSelf(); + }; + + HWND getCommentHandle() const { + return _commentStyleDlg.getHSelf(); + }; + + HWND getSymbolHandle() const { + return _symbolsStyleDlg.getHSelf(); + }; + + void setTabName(int index, const TCHAR *name2set) { + _ctrlTab.renameTab(index, name2set); + }; +protected : + virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + +private : + ControlsTab _ctrlTab; + WindowVector _wVector; + UserLangContainer *_pCurrentUserLang; + + FolderStyleDialog _folderStyleDlg; + KeyWordsStyleDialog _keyWordsStyleDlg; + CommentStyleDialog _commentStyleDlg; + SymbolsStyleDialog _symbolsStyleDlg; + + bool _status; + RECT _dlgPos; + int _currentHight; + int _yScrollPos; + int _prevHightVal; + + bool _isDirty; + void getActualPosSize() { + ::GetWindowRect(_hSelf, &_dlgPos); + _dlgPos.right -= _dlgPos.left; + _dlgPos.bottom -= _dlgPos.top; + }; + void restorePosSize(){reSizeTo(_dlgPos);}; + void enableLangAndControlsBy(int index); + +protected : + void setKeywords2List(int ctrlID){}; + int getGroupIndexFromCombo(int ctrlID, bool & isFontSize) const {return -1;}; + int getStylerIndexFromCP(HWND hWnd, bool & isFG, ColourPicker **ppCP) const {return -1;}; + int getGroupeIndexFromCheck(int ctrlID, int & fontStyleMask) const {return -1;}; + void updateDlg(); +}; + +class StringDlg : public StaticDialog +{ +public : + StringDlg() : StaticDialog() {}; + void init(HINSTANCE hInst, HWND parent, TCHAR *title, TCHAR *staticName, TCHAR *text2Set, int txtLen = 0) { + Window::init(hInst, parent); + lstrcpy(_title, title); + lstrcpy(_static, staticName); + lstrcpy(_textValue, text2Set); + _txtLen = txtLen; + }; + + long doDialog() { + return long(::DialogBoxParam(_hInst, MAKEINTRESOURCE(IDD_STRING_DLG), _hParent, (DLGPROC)dlgProc, (LPARAM)this)); + }; + + virtual void destroy() {}; + +protected : + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) + { + + switch (Message) + { + case WM_INITDIALOG : + { + ::SetWindowText(_hSelf, _title); + ::SetDlgItemText(_hSelf, IDC_STRING_STATIC, _static); + ::SetDlgItemText(_hSelf, IDC_STRING_EDIT, _textValue); + if (_txtLen) + ::SendDlgItemMessage(_hSelf, IDC_STRING_EDIT, EM_SETLIMITTEXT, _txtLen, 0); + + return TRUE; + } + + case WM_COMMAND : + { + switch (wParam) + { + case IDOK : + { + ::GetDlgItemText(_hSelf, IDC_STRING_EDIT, _textValue, 256); + ::EndDialog(_hSelf, int(_textValue)); + return TRUE; + } + + case IDCANCEL : + ::EndDialog(_hSelf, 0); + return TRUE; + + default: + return FALSE; + } + } + default : + return FALSE; + } + + return FALSE; + } + +private : + TCHAR _title[64]; + TCHAR _textValue[256]; + TCHAR _static[32]; + int _txtLen; +}; + + +#endif //USER_DEFINE_H diff --git a/PowerEditor/src/ScitillaComponent/UserDefineDialog.rc b/PowerEditor/src/ScitillaComponent/UserDefineDialog.rc new file mode 100644 index 00000000..1d1b302a --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/UserDefineDialog.rc @@ -0,0 +1,270 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#ifndef USERDEFINEDIALOG_RC +#define USERDEFINEDIALOG_RC + +#include +#include "UserDefineResource.h" +IDD_FOLDER_STYLE_DLG DIALOGEX 36, 44, 320, 460 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x0 +BEGIN + GROUPBOX "Folder Open Keywords Setting", IDC_FOLDEROPEN_DESCGROUP_STATIC,5,114,300,127,BS_CENTER + LTEXT "Foreground color",IDC_FOLDEROPEN_FG_STATIC,27,144,58,8, 0,WS_EX_RIGHT + LTEXT "Background color",IDC_FOLDEROPEN_BG_STATIC,27,168,58,8, 0,WS_EX_RIGHT + COMBOBOX IDC_FOLDEROPEN_FONT_COMBO,185,140,104,78, CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FOLDEROPEN_FONTSIZE_COMBO,249,162,40,82, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_FOLDEROPEN_BOLD_CHECK,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,141,166,46,10 + CONTROL "Italic",IDC_FOLDEROPEN_ITALIC_CHECK,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,141,179,47,10 + GROUPBOX "Font style",IDC_FOLDEROPEN_FONTSTYLEGROUP_STATIC,133, 125,164,71 + GROUPBOX "Colour style",IDC_FOLDEROPEN_COLORSTYLEGROUP_STATIC,15, 125,111,71 + LTEXT "Font Name :",IDC_FOLDEROPEN_FONTNAME_STATIC,138,142,44, 8,0,WS_EX_RIGHT + LTEXT "Font size :",IDC_FOLDEROPEN_FONTSIZE_STATIC,212,164,35, 8,0,WS_EX_RIGHT + EDITTEXT IDC_FOLDEROPEN_EDIT,15,203,282,28,ES_MULTILINE | WS_VSCROLL + GROUPBOX "Folder Close Keywords Setting", IDC_FOLDERCLOSE_DESCGROUP_STATIC,5,246,300,125,BS_CENTER + LTEXT "Foreground color",IDC_FOLDERCLOSE_FG_STATIC,27,277,58,8,0,WS_EX_RIGHT + LTEXT "Background color",IDC_FOLDERCLOSE_BG_STATIC,27,301,58,8,0,WS_EX_RIGHT + COMBOBOX IDC_FOLDERCLOSE_FONT_COMBO,185,272,104,78,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FOLDERCLOSE_FONTSIZE_COMBO,249,292,40,82, CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_FOLDERCLOSE_BOLD_CHECK,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,141,298,45,10 + CONTROL "Italic",IDC_FOLDERCLOSE_ITALIC_CHECK,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,141,312,46,10 + GROUPBOX "Font style",IDC_FOLDERCLOSE_FONTSTYLEGROUP_STATIC,133,257,164,69 + GROUPBOX "Colour style",IDC_FOLDERCLOSE_COLORSTYLEGROUP_STATIC,15,257,111,69 + LTEXT "Font Name :",IDC_FOLDERCLOSE_FONTNAME_STATIC,138,273,45,8,0,WS_EX_RIGHT + LTEXT "Font size :",IDC_FOLDERCLOSE_FONTSIZE_STATIC,212,294,35, 8,0,WS_EX_RIGHT + EDITTEXT IDC_FOLDERCLOSE_EDIT,15,334,282,28,ES_MULTILINE | WS_VSCROLL + GROUPBOX "Default Style Setting",IDC_DEFAULT_DESCGROUP_STATIC,5,7, 300,92,BS_CENTER + LTEXT "Foreground color",IDC_DEFAULT_FG_STATIC,27,38,59,8,0, WS_EX_RIGHT + LTEXT "Background color",IDC_DEFAULT_BG_STATIC,27,62,59,8,0, WS_EX_RIGHT + COMBOBOX IDC_DEFAULT_FONT_COMBO,185,33,104,78,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_DEFAULT_FONTSIZE_COMBO,249,55,40,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_DEFAULT_BOLD_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,141,59,45,10 + CONTROL "Italic",IDC_DEFAULT_ITALIC_CHECK,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,141,73,46,10 + GROUPBOX "Font style",IDC_DEFAULT_FONTSTYLEGROUP_STATIC,133,17, 164,73 + GROUPBOX "Colour style",IDC_DEFAULT_COLORSTYLEGROUP_STATIC,15,17, 111,73 + LTEXT "Font Name :",IDC_DEFAULT_FONTNAME_STATIC,137,34,47,8,0, WS_EX_RIGHT + LTEXT "Font size :",IDC_DEFAULT_FONTSIZE_STATIC,212,57,36,8,0, WS_EX_RIGHT + CONTROL "Underline",IDC_DEFAULT_UNDERLINE_CHECK,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,214,73,59,10 + CONTROL "Underline",IDC_FOLDEROPEN_UNDERLINE_CHECK,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,213,179,59,10 + CONTROL "Underline",IDC_FOLDERCLOSE_UNDERLINE_CHECK,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,212,312,59,10 +END + +IDD_KEYWORD_STYLE_DLG DIALOGEX 36, 44, 320, 460 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x0 +BEGIN + LTEXT "Foreground color",IDC_KEYWORD1_FG_STATIC,26,25,56,8,0, WS_EX_RIGHT + LTEXT "Background color",IDC_KEYWORD1_BG_STATIC,26,45,56,8,0,WS_EX_RIGHT + COMBOBOX IDC_KEYWORD1_FONT_COMBO,184,26,104,78,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYWORD1_FONTSIZE_COMBO,248,42,40,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_KEYWORD1_BOLD_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,44,45,10 + CONTROL "Italic",IDC_KEYWORD1_ITALIC_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,59,41,10 + GROUPBOX "Font style",IDC_KEYWORD1_FONTSTYLEGROUP_STATIC,132,13,164,61 + GROUPBOX "Colour style",IDC_KEYWORD1_COLORSTYLEGROUP_STATIC,14,13,111,49 + LTEXT "Font Name :",IDC_KEYWORD1_FONTNAME_STATIC,136,27,44,8,0,WS_EX_RIGHT + LTEXT "Font size :",IDC_KEYWORD1_FONTSIZE_STATIC,212,44,34,8,0,WS_EX_RIGHT + EDITTEXT IDC_KEYWORD1_EDIT,14,78,282,28,ES_MULTILINE | WS_VSCROLL + GROUPBOX "1st Group",IDC_KEYWORD1_DESCGROUP_STATIC,4,3,300,109,BS_CENTER | BS_FLAT + LTEXT "Foreground color",IDC_KEYWORD2_FG_STATIC,26,136,56,8,0,WS_EX_RIGHT + LTEXT "Background color",IDC_KEYWORD2_BG_STATIC,26,157,56,8,0,WS_EX_RIGHT + COMBOBOX IDC_KEYWORD2_FONT_COMBO,184,138,104,78,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYWORD2_FONTSIZE_COMBO,248,154,40,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_KEYWORD2_BOLD_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,156,46,10 + CONTROL "Italic",IDC_KEYWORD2_ITALIC_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,172,43,10 + GROUPBOX "Font style",IDC_KEYWORD2_FONTSTYLEGROUP_STATIC,132,125,164,62 + GROUPBOX "Colour style",IDC_KEYWORD2_COLORSTYLEGROUP_STATIC,14,125,111,49 + LTEXT "Font Name :",IDC_KEYWORD2_FONTNAME_STATIC,136,139,44,8,0,WS_EX_RIGHT + LTEXT "Font size :",IDC_KEYWORD2_FONTSIZE_STATIC,212,156,34,8,0,WS_EX_RIGHT + EDITTEXT IDC_KEYWORD2_EDIT,14,192,282,28,ES_MULTILINE | WS_VSCROLL + GROUPBOX "2nd Group",IDC_KEYWORD2_DESCGROUP_STATIC,4,115,300,110,BS_CENTER | BS_FLAT + LTEXT "Foreground color",IDC_KEYWORD3_FG_STATIC,26,248,56,8,0,WS_EX_RIGHT + LTEXT "Background color",IDC_KEYWORD3_BG_STATIC,26,269,56,8,0,WS_EX_RIGHT + COMBOBOX IDC_KEYWORD3_FONT_COMBO,184,250,104,78,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYWORD3_FONTSIZE_COMBO,248,266,40,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_KEYWORD3_BOLD_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,268,45,10 + CONTROL "Italic",IDC_KEYWORD3_ITALIC_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,283,44,10 + GROUPBOX "Font style",IDC_KEYWORD3_FONTSTYLEGROUP_STATIC,132,237,164,61 + GROUPBOX "Colour style",IDC_KEYWORD3_COLORSTYLEGROUP_STATIC,14,237,111,49 + LTEXT "Font Name :",IDC_KEYWORD3_FONTNAME_STATIC,136,251,44,8,0,WS_EX_RIGHT + LTEXT "Font size :",IDC_KEYWORD3_FONTSIZE_STATIC,212,268,34,8,0,WS_EX_RIGHT + EDITTEXT IDC_KEYWORD3_EDIT,14,303,282,28,ES_MULTILINE | WS_VSCROLL + GROUPBOX "3rd Group",IDC_KEYWORD3_DESCGROUP_STATIC,4,227,300,110,BS_CENTER | BS_FLAT + LTEXT "Foreground color",IDC_KEYWORD4_FG_STATIC,26,362,57,8,0,WS_EX_RIGHT + LTEXT "Background color",IDC_KEYWORD4_BG_STATIC,26,383,57,8,0,WS_EX_RIGHT + COMBOBOX IDC_KEYWORD4_FONT_COMBO,184,363,104,78,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_KEYWORD4_FONTSIZE_COMBO,248,379,40,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_KEYWORD4_BOLD_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,381,44,10 + CONTROL "Italic",IDC_KEYWORD4_ITALIC_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,396,44,10 + GROUPBOX "Font style",IDC_KEYWORD4_FONTSTYLEGROUP_STATIC,132,350,164,60 + GROUPBOX "Colour style",IDC_KEYWORD4_COLORSTYLEGROUP_STATIC,14, 350,111,50 + LTEXT "Font Name :",IDC_KEYWORD4_FONTNAME_STATIC,136,364,44,8, 0,WS_EX_RIGHT + LTEXT "Font size :",IDC_KEYWORD4_FONTSIZE_STATIC,212,381,34,8, 0,WS_EX_RIGHT + EDITTEXT IDC_KEYWORD4_EDIT,14,416,282,28,ES_MULTILINE | WS_VSCROLL + GROUPBOX "4th Group",IDC_KEYWORD4_DESCGROUP_STATIC,4,340,300,111, BS_CENTER | BS_FLAT + CONTROL "Prefix mode",IDC_KEYWORD1_PREFIX_CHECK,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,14,67,64,10 + CONTROL "Prefix mode",IDC_KEYWORD2_PREFIX_CHECK,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,14,180,64,10 + CONTROL "Prefix mode",IDC_KEYWORD3_PREFIX_CHECK,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,14,291,64,10 + CONTROL "Prefix mode",IDC_KEYWORD4_PREFIX_CHECK,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,14,404,64,10 + CONTROL "Underline",IDC_KEYWORD4_UNDERLINE_CHECK,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,211,396,58,10 + CONTROL "Underline",IDC_KEYWORD3_UNDERLINE_CHECK,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,211,283,61,10 + CONTROL "Underline",IDC_KEYWORD1_UNDERLINE_CHECK,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,211,59,59,10 + CONTROL "Underline",IDC_KEYWORD2_UNDERLINE_CHECK,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,211,172,59,10 +END + +IDD_COMMENT_STYLE_DLG DIALOGEX 36, 44, 320, 460 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x0 +BEGIN + LTEXT "Foreground color ",IDC_COMMENTLINE_FG_STATIC,24,31,58,8,0,WS_EX_RIGHT + LTEXT "Background color",IDC_COMMENTLINE_BG_STATIC,24,52,58,8,0,WS_EX_RIGHT + COMBOBOX IDC_COMMENTLINE_FONT_COMBO,184,32,104,78,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMMENTLINE_FONTSIZE_COMBO,248,48,40,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_COMMENTLINE_BOLD_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,50,43,10 + CONTROL "Italic",IDC_COMMENTLINE_ITALIC_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,65,43,10 + GROUPBOX "Font style",IDC_COMMENTLINE_FONTSTYLEGROUP_STATIC,132,19,164,63 + GROUPBOX "Colour style",IDC_COMMENTLINE_COLORSTYLEGROUP_STATIC,14,19,111,50 + LTEXT "Font Name :",IDC_COMMENTLINE_FONTNAME_STATIC,140,33,40,8,0,WS_EX_RIGHT + LTEXT "Font size :",IDC_COMMENTLINE_FONTSIZE_STATIC,212,50,34,8,0,WS_EX_RIGHT + EDITTEXT IDC_COMMENTLINE_EDIT,14,90,282,28,ES_MULTILINE | WS_VSCROLL + GROUPBOX "Comment Line",IDC_COMMENTLINE_DESCGROUP_STATIC,4,7,300,119,BS_CENTER + LTEXT "Foreground color",IDC_NUMBER_FG_STATIC,24,302,58,8,0,WS_EX_RIGHT + LTEXT "Background color",IDC_NUMBER_BG_STATIC,24,325,58,8,0,WS_EX_RIGHT + COMBOBOX IDC_NUMBER_FONT_COMBO,183,300,104,78,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_NUMBER_FONTSIZE_COMBO,247,316,40,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_NUMBER_BOLD_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,139,317,44,10 + CONTROL "Italic",IDC_NUMBER_ITALIC_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,139,333,44,10 + GROUPBOX "Font style",IDC_NUMBER_FONTSTYLEGROUP_STATIC,131,288,164,60 + GROUPBOX "Colour style",IDC_NUMBER_COLORSTYLEGROUP_STATIC,13,288,111,60 + LTEXT "Font Name :",IDC_NUMBER_FONTNAME_STATIC,139,301,40,8,0,WS_EX_RIGHT + LTEXT "Font size :",IDC_NUMBER_FONTSIZE_STATIC,211,317,34,8,0,WS_EX_RIGHT + GROUPBOX "Number",IDC_NUMBER_DESCGROUP_STATIC,3,274,300,85,BS_CENTER + LTEXT "Foreground color",IDC_COMMENT_FG_STATIC,24,158,57,8,0,WS_EX_RIGHT + LTEXT "Background color",IDC_COMMENT_BG_STATIC,24,179,57,8,0,WS_EX_RIGHT + COMBOBOX IDC_COMMENT_FONT_COMBO,184,159,104,78,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMMENT_FONTSIZE_COMBO,248,175,40,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_COMMENT_BOLD_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,177,44,10 + CONTROL "Italic",IDC_COMMENT_ITALIC_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,193,43,10 + GROUPBOX "Font style",IDC_COMMENT_FONTSTYLEGROUP_STATIC,132,146,164,64 + GROUPBOX "Colour style",IDC_COMMENT_COLORSTYLEGROUP_STATIC,14,146,111,50 + LTEXT "Font Name :",IDC_COMMENT_FONTNAME_STATIC,140,160,40,8,0,WS_EX_RIGHT + LTEXT "Font size :",IDC_COMMENT_FONTSIZE_STATIC,212,177,34,8,0,WS_EX_RIGHT + EDITTEXT IDC_COMMENTOPEN_EDIT,14,229,133,28,ES_MULTILINE | WS_VSCROLL + GROUPBOX "Comment Block",IDC_COMMENT_DESCGROUP_STATIC,4,133,300,132,BS_CENTER + EDITTEXT IDC_COMMENTCLOSE_EDIT,157,229,139,28,ES_MULTILINE | WS_VSCROLL + LTEXT "Comment Open :",IDC_COMMENTOPEN_STATIC,17,218,90,8 + LTEXT "Comment Close :",IDC_COMMENTCLOSE_STATIC,158,218,88,8 + CONTROL "Treat keyword as symbol",IDC_COMMENTLINESYMBOL_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,78,112,10 + CONTROL "Treat keywords as symbols",IDC_COMMENTSYMBOL_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,14,203,112,10 + CONTROL "Underline",IDC_COMMENT_UNDERLINE_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,211,193,59,10 + CONTROL "Underline",IDC_COMMENTLINE_UNDERLINE_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,212,65,59,10 + CONTROL "Underline",IDC_NUMBER_UNDERLINE_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,211,332,59,10 +END + +IDD_SYMBOL_STYLE_DLG DIALOGEX 36, 44, 320, 460 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_CHILD +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x0 +BEGIN + LISTBOX IDC_AVAILABLE_SYMBOLS_LIST,68,33,41,116,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "->",IDC_ADD_BUTTON,127,65,50,14 + PUSHBUTTON "<-",IDC_REMOVE_BUTTON,127,94,50,14 + LISTBOX IDC_ACTIVATED_SYMBOL_LIST,195,33,41,115,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + LTEXT "Activated Operators",IDC_ACTIVATED_SYMBOL_STATIC,182,18,86,8 + LTEXT "Available Symbols",IDC_AVAILABLE_SYMBOLS_STATIC,59,18,90,8 + LTEXT "Foreground color",IDC_SYMBOL_FG_STATIC,25,169,57,8,0,WS_EX_RIGHT + LTEXT "Background color",IDC_SYMBOL_BG_STATIC,25,192,57,8,0,WS_EX_RIGHT + COMBOBOX IDC_SYMBOL_FONT_COMBO,183,168,104,78,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SYMBOL_FONTSIZE_COMBO,247,184,40,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_SYMBOL_BOLD_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,139,185,44,10 + CONTROL "Italic",IDC_SYMBOL_ITALIC_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,139,199,44,10 + GROUPBOX "Font style",IDC_SYMBOL_FONTSTYLEGROUP_STATIC,131,155,164,59 + GROUPBOX "Colour style",IDC_SYMBOL_COLORSTYLEGROUP_STATIC,13,155,111,59 + LTEXT "Font Name :",IDC_SYMBOL_FONTNAME_STATIC,135,169,44,8,0,WS_EX_RIGHT + LTEXT "Font size :",IDC_SYMBOL_FONTSIZE_STATIC,211,185,34,8,0,WS_EX_RIGHT + GROUPBOX "Operator",IDC_SYMBOL_DESCGROUP_STATIC,3,5,300,216,BS_CENTER + CONTROL "Underline",IDC_SYMBOL_UNDERLINE_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,211,199,59,10 + LTEXT "Foreground color",IDC_SYMBOL_FG2_STATIC,26,268,56,8,0,WS_EX_RIGHT + LTEXT "Background color",IDC_SYMBOL_BG2_STATIC,26,289,56,8,0,WS_EX_RIGHT + COMBOBOX IDC_SYMBOL_FONT2_COMBO,184,266,104,78,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SYMBOL_BO2_COMBO,85,237,40,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_SYMBOL_BOLD2_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,284,45,10 + CONTROL "Italic",IDC_SYMBOL_ITALIC2_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,299,41,10 + GROUPBOX "Font style",IDC_SYMBOL_FONTSTYLEGROUP2_STATIC,132,253,164,60 + GROUPBOX "Colour style",IDC_SYMBOL_COLORSTYLEGROUP2_STATIC,14,253,111,60 + LTEXT "Font Name :",IDC_SYMBOL_FONTNAME2_STATIC,136,267,44,8,0,WS_EX_RIGHT + LTEXT "Boundary open :",IDC_SYMBOL_BO2_STATIC,9,239,74,8,0,WS_EX_RIGHT + CONTROL "Underline",IDC_SYMBOL_UNDERLINE2_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,211,299,59,10 + COMBOBOX IDC_SYMBOL_BC2_COMBO,256,237,40,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Boundary close :",IDC_SYMBOL_BC2_STATIC,168,239,86,8,0,WS_EX_RIGHT + GROUPBOX "Delimiter 1",IDC_SYMBOL_DELIMGROUP1_STATIC,3,227,300,93,BS_CENTER | BS_FLAT + LTEXT "Foreground color",IDC_SYMBOL_FG3_STATIC,26,369,56,8,0,WS_EX_RIGHT + LTEXT "Background color",IDC_SYMBOL_BG3_STATIC,26,390,56,8,0,WS_EX_RIGHT + COMBOBOX IDC_SYMBOL_FONT3_COMBO,184,367,104,78,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_SYMBOL_BO3_COMBO,85,339,40,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_SYMBOL_BOLD3_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,385,45,10 + CONTROL "Italic",IDC_SYMBOL_ITALIC3_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,140,400,41,10 + GROUPBOX "Font style",IDC_SYMBOL_FONTSTYLEGROUP3_STATIC,132,355,164,60 + GROUPBOX "Colour style",IDC_SYMBOL_COLORSTYLEGROUP3_STATIC,14,355,111,60 + LTEXT "Font Name :",IDC_SYMBOL_FONTNAME3_STATIC,136,368,44,8,0,WS_EX_RIGHT + LTEXT "Boundary open :",IDC_SYMBOL_BO3_STATIC,9,340,74,8,0,WS_EX_RIGHT + CONTROL "Underline",IDC_SYMBOL_UNDERLINE3_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,211,400,59,10 + COMBOBOX IDC_SYMBOL_BC3_COMBO,256,339,40,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Boundary close :",IDC_SYMBOL_BC3_STATIC,168,340,86,8,0,WS_EX_RIGHT + GROUPBOX "Delimiter 2",IDC_SYMBOL_DELIMGROUP2_STATIC,3,328,300,93,BS_CENTER | BS_FLAT + COMBOBOX IDC_SYMBOL_FONTSIZE2_COMBO,248,283,40,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Font size :",IDC_SYMBOL_FONTSIZE2_STATIC,212,285,34,8,0,WS_EX_RIGHT + COMBOBOX IDC_SYMBOL_FONTSIZE3_COMBO,248,384,40,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Font size :",IDC_SYMBOL_FONTSIZE3_STATIC,212,386,34,8,0,WS_EX_RIGHT +END + +IDD_GLOBAL_USERDEFINE_DLG DIALOGEX 36, 44, 340, 550 +STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | + WS_CAPTION | WS_VSCROLL | WS_SYSMENU +EXSTYLE WS_EX_TOOLWINDOW +CAPTION "User Define" +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x0 +BEGIN + PUSHBUTTON "Rename",IDC_RENAME_BUTTON,174,40,62,14 + PUSHBUTTON "Create New...",IDC_ADDNEW_BUTTON,34,40,62,14 + PUSHBUTTON "Dock",IDC_DOCK_BUTTON,275,1,50,14,BS_FLAT + COMBOBOX IDC_LANGNAME_COMBO,71,23,95,58,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Remove",IDC_REMOVELANG_BUTTON,243,40,62,14 + PUSHBUTTON "Save As...",IDC_SAVEAS_BUTTON,104,40,62,14 + LTEXT "User Language : ",IDC_LANGNAME_STATIC,5,24,63,8,0,WS_EX_RIGHT + EDITTEXT IDC_EXT_EDIT,291,23,33,14,ES_AUTOHSCROLL + RTEXT "Ext :",IDC_EXT_STATIC,257,25,33,8,0,WS_EX_RIGHT + CONTROL "Transparency",IDC_UD_TRANSPARENT_CHECK,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,150,3,66,10 + CONTROL "",IDC_UD_PERCENTAGE_SLIDER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | NOT WS_VISIBLE | WS_TABSTOP,209,3,53,10 + CONTROL "Ignore case",IDC_LANGNAME_IGNORECASE_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,175,24,76,10 +END + +IDD_STRING_DLG DIALOGEX 0, 0, 151, 52 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | + WS_SYSMENU +EXSTYLE WS_EX_TOOLWINDOW +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x1 +BEGIN + LTEXT "STATIC :",IDC_STRING_STATIC,6,4,42,8,0,WS_EX_RIGHT + EDITTEXT IDC_STRING_EDIT,49,2,88,14 + PUSHBUTTON "OK",IDOK,20,26,50,14 + PUSHBUTTON "Cancel",IDCANCEL,87,26,50,14 +END + +#endif //USERDEFINEDIALOG_RC + diff --git a/PowerEditor/src/ScitillaComponent/UserDefineLangReference.h b/PowerEditor/src/ScitillaComponent/UserDefineLangReference.h new file mode 100644 index 00000000..0975ea28 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/UserDefineLangReference.h @@ -0,0 +1,36 @@ +/* +this file is part of Notepad++ +Copyright (C)2003 Don HO + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#ifndef USER_DEFINE_LANG_REFERENCE_H + +#define USER_DEFINE_LANG_REFERENCE_H + +const int langNameLenMax = 16; +const int extsLenMax = 256; + +const int nbKeywodList = 9; +//const int max_char = 4096; +const int max_char = 1024*30; + +const int nbPrefixListAllowed = 4; + + +#endif //USER_DEFINE_LANG_REFERENCE_H + + diff --git a/PowerEditor/src/ScitillaComponent/UserDefineResource.h b/PowerEditor/src/ScitillaComponent/UserDefineResource.h new file mode 100644 index 00000000..73fda5f5 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/UserDefineResource.h @@ -0,0 +1,265 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef USERDEFINE_RC_H +#define USERDEFINE_RC_H + +#define IDD_GLOBAL_USERDEFINE_DLG 20000 + #define IDC_DOCK_BUTTON (IDD_GLOBAL_USERDEFINE_DLG + 1) + #define IDC_RENAME_BUTTON (IDD_GLOBAL_USERDEFINE_DLG + 2) + #define IDC_ADDNEW_BUTTON (IDD_GLOBAL_USERDEFINE_DLG + 3) + #define IDC_REMOVELANG_BUTTON (IDD_GLOBAL_USERDEFINE_DLG + 4) + #define IDC_SAVEAS_BUTTON (IDD_GLOBAL_USERDEFINE_DLG + 5) + #define IDC_LANGNAME_COMBO (IDD_GLOBAL_USERDEFINE_DLG + 6) + #define IDC_LANGNAME_STATIC (IDD_GLOBAL_USERDEFINE_DLG + 7) + #define IDC_EXT_EDIT (IDD_GLOBAL_USERDEFINE_DLG + 8) + #define IDC_EXT_STATIC (IDD_GLOBAL_USERDEFINE_DLG + 9) + + #define IDC_UD_PERCENTAGE_SLIDER (IDD_GLOBAL_USERDEFINE_DLG + 10) + #define IDC_UD_TRANSPARENT_CHECK (IDD_GLOBAL_USERDEFINE_DLG + 11) + #define IDC_LANGNAME_IGNORECASE_CHECK (IDD_GLOBAL_USERDEFINE_DLG + 12) + #define IDC_AUTOCOMPLET_EDIT (IDD_GLOBAL_USERDEFINE_DLG + 13) + #define IDC_AUTOCOMPLET_STATIC (IDD_GLOBAL_USERDEFINE_DLG + 14) + +#define IDD_FOLDER_STYLE_DLG 21000 + + #define IDC_DEFAULT (IDD_FOLDER_STYLE_DLG + 100) + #define IDC_DEFAULT_DESCGROUP_STATIC (IDC_DEFAULT+ 1) + #define IDC_DEFAULT_FG_STATIC (IDC_DEFAULT+ 2) + #define IDC_DEFAULT_BG_STATIC (IDC_DEFAULT + 3) + #define IDC_DEFAULT_FONT_COMBO (IDC_DEFAULT+ 4) + #define IDC_DEFAULT_FONTSIZE_COMBO (IDC_DEFAULT + 5) + #define IDC_DEFAULT_BOLD_CHECK (IDC_DEFAULT + 6) + #define IDC_DEFAULT_ITALIC_CHECK (IDC_DEFAULT + 7) + #define IDC_DEFAULT_FONTSTYLEGROUP_STATIC (IDC_DEFAULT+ 8) + #define IDC_DEFAULT_COLORSTYLEGROUP_STATIC (IDC_DEFAULT + 9) + #define IDC_DEFAULT_FONTNAME_STATIC (IDC_DEFAULT + 10) + #define IDC_DEFAULT_FONTSIZE_STATIC (IDC_DEFAULT+ 11) + #define IDC_DEFAULT_EDIT (IDC_DEFAULT+ 12) + #define IDC_DEFAULT_UNDERLINE_CHECK (IDC_DEFAULT + 13) + + #define IDC_FOLDEROPEN (IDD_FOLDER_STYLE_DLG + 200) + #define IDC_FOLDEROPEN_DESCGROUP_STATIC (IDC_FOLDEROPEN + 1) + #define IDC_FOLDEROPEN_FG_STATIC (IDC_FOLDEROPEN + 2) + #define IDC_FOLDEROPEN_BG_STATIC (IDC_FOLDEROPEN + 3) + #define IDC_FOLDEROPEN_FONT_COMBO (IDC_FOLDEROPEN + 4) + #define IDC_FOLDEROPEN_FONTSIZE_COMBO (IDC_FOLDEROPEN + 5) + #define IDC_FOLDEROPEN_BOLD_CHECK (IDC_FOLDEROPEN + 6) + #define IDC_FOLDEROPEN_ITALIC_CHECK (IDC_FOLDEROPEN + 7) + #define IDC_FOLDEROPEN_FONTSTYLEGROUP_STATIC (IDC_FOLDEROPEN + 8) + #define IDC_FOLDEROPEN_COLORSTYLEGROUP_STATIC (IDC_FOLDEROPEN + 9) + #define IDC_FOLDEROPEN_FONTNAME_STATIC (IDC_FOLDEROPEN + 10) + #define IDC_FOLDEROPEN_FONTSIZE_STATIC (IDC_FOLDEROPEN + 11) + #define IDC_FOLDEROPEN_EDIT (IDC_FOLDEROPEN + 12) + #define IDC_FOLDEROPEN_UNDERLINE_CHECK (IDC_FOLDEROPEN + 13) + + #define IDC_FOLDERCLOSE (IDD_FOLDER_STYLE_DLG + 300) + #define IDC_FOLDERCLOSE_DESCGROUP_STATIC (IDC_FOLDERCLOSE + 1) + #define IDC_FOLDERCLOSE_FG_STATIC (IDC_FOLDERCLOSE + 2) + #define IDC_FOLDERCLOSE_BG_STATIC (IDC_FOLDERCLOSE + 3) + #define IDC_FOLDERCLOSE_FONT_COMBO (IDC_FOLDERCLOSE + 4) + #define IDC_FOLDERCLOSE_FONTSIZE_COMBO (IDC_FOLDERCLOSE + 5) + #define IDC_FOLDERCLOSE_BOLD_CHECK (IDC_FOLDERCLOSE + 6) + #define IDC_FOLDERCLOSE_ITALIC_CHECK (IDC_FOLDERCLOSE + 7) + #define IDC_FOLDERCLOSE_FONTSTYLEGROUP_STATIC (IDC_FOLDERCLOSE + 8) + #define IDC_FOLDERCLOSE_COLORSTYLEGROUP_STATIC (IDC_FOLDERCLOSE + 9) + #define IDC_FOLDERCLOSE_FONTNAME_STATIC (IDC_FOLDERCLOSE + 10) + #define IDC_FOLDERCLOSE_FONTSIZE_STATIC (IDC_FOLDERCLOSE + 11) + #define IDC_FOLDERCLOSE_EDIT (IDC_FOLDERCLOSE + 12) + #define IDC_FOLDERCLOSE_UNDERLINE_CHECK (IDC_FOLDERCLOSE + 13) + +#define IDD_KEYWORD_STYLE_DLG 22000 //(IDD_GLOBAL_USERDEFINE_DLG + 2000) + + #define IDC_KEYWORD1 (IDD_KEYWORD_STYLE_DLG + 100) + #define IDC_KEYWORD1_DESCGROUP_STATIC (IDC_KEYWORD1 + 1) + #define IDC_KEYWORD1_FG_STATIC (IDC_KEYWORD1 + 2) + #define IDC_KEYWORD1_BG_STATIC (IDC_KEYWORD1 + 3) + #define IDC_KEYWORD1_FONT_COMBO (IDC_KEYWORD1 + 4) + #define IDC_KEYWORD1_FONTSIZE_COMBO (IDC_KEYWORD1 + 5) + #define IDC_KEYWORD1_BOLD_CHECK (IDC_KEYWORD1 + 6) + #define IDC_KEYWORD1_ITALIC_CHECK (IDC_KEYWORD1 + 7) + #define IDC_KEYWORD1_FONTSTYLEGROUP_STATIC (IDC_KEYWORD1 + 8) + #define IDC_KEYWORD1_COLORSTYLEGROUP_STATIC (IDC_KEYWORD1 + 9) + #define IDC_KEYWORD1_FONTNAME_STATIC (IDC_KEYWORD1 + 10) + #define IDC_KEYWORD1_FONTSIZE_STATIC (IDC_KEYWORD1 + 11) + #define IDC_KEYWORD1_EDIT (IDC_KEYWORD1 + 12) + #define IDC_KEYWORD1_PREFIX_CHECK (IDC_KEYWORD1 + 13) + #define IDC_KEYWORD1_UNDERLINE_CHECK (IDC_KEYWORD1 + 14) + + #define IDC_KEYWORD2 (IDD_KEYWORD_STYLE_DLG + 200) + #define IDC_KEYWORD2_DESCGROUP_STATIC (IDC_KEYWORD2 + 1) + #define IDC_KEYWORD2_FG_STATIC (IDC_KEYWORD2 + 2) + #define IDC_KEYWORD2_BG_STATIC (IDC_KEYWORD2 + 3) + #define IDC_KEYWORD2_FONT_COMBO (IDC_KEYWORD2 + 4) + #define IDC_KEYWORD2_FONTSIZE_COMBO (IDC_KEYWORD2 + 5) + #define IDC_KEYWORD2_BOLD_CHECK (IDC_KEYWORD2 + 6) + #define IDC_KEYWORD2_ITALIC_CHECK (IDC_KEYWORD2 + 7) + #define IDC_KEYWORD2_FONTSTYLEGROUP_STATIC (IDC_KEYWORD2 + 8) + #define IDC_KEYWORD2_COLORSTYLEGROUP_STATIC (IDC_KEYWORD2 + 9) + #define IDC_KEYWORD2_FONTNAME_STATIC (IDC_KEYWORD2 + 10) + #define IDC_KEYWORD2_FONTSIZE_STATIC (IDC_KEYWORD2 + 11) + #define IDC_KEYWORD2_EDIT (IDC_KEYWORD2 + 12) + #define IDC_KEYWORD2_PREFIX_CHECK (IDC_KEYWORD2 + 13) + #define IDC_KEYWORD2_UNDERLINE_CHECK (IDC_KEYWORD2 + 14) + + #define IDC_KEYWORD3 (IDD_KEYWORD_STYLE_DLG + 300) + #define IDC_KEYWORD3_DESCGROUP_STATIC (IDC_KEYWORD3 + 1) + #define IDC_KEYWORD3_FG_STATIC (IDC_KEYWORD3 + 2) + #define IDC_KEYWORD3_BG_STATIC (IDC_KEYWORD3 + 3) + #define IDC_KEYWORD3_FONT_COMBO (IDC_KEYWORD3 + 4) + #define IDC_KEYWORD3_FONTSIZE_COMBO (IDC_KEYWORD3 + 5) + #define IDC_KEYWORD3_BOLD_CHECK (IDC_KEYWORD3 + 6) + #define IDC_KEYWORD3_ITALIC_CHECK (IDC_KEYWORD3 + 7) + #define IDC_KEYWORD3_FONTSTYLEGROUP_STATIC (IDC_KEYWORD3 + 8) + #define IDC_KEYWORD3_COLORSTYLEGROUP_STATIC (IDC_KEYWORD3 + 9) + #define IDC_KEYWORD3_FONTNAME_STATIC (IDC_KEYWORD3 + 10) + #define IDC_KEYWORD3_FONTSIZE_STATIC (IDC_KEYWORD3 + 11) + #define IDC_KEYWORD3_EDIT (IDC_KEYWORD3 + 12) + #define IDC_KEYWORD3_PREFIX_CHECK (IDC_KEYWORD3 + 13) + #define IDC_KEYWORD3_UNDERLINE_CHECK (IDC_KEYWORD3 + 14) + + #define IDC_KEYWORD4 (IDD_KEYWORD_STYLE_DLG + 400) + #define IDC_KEYWORD4_DESCGROUP_STATIC (IDC_KEYWORD4 + 1) + #define IDC_KEYWORD4_FG_STATIC (IDC_KEYWORD4 + 2) + #define IDC_KEYWORD4_BG_STATIC (IDC_KEYWORD4 + 3) + #define IDC_KEYWORD4_FONT_COMBO (IDC_KEYWORD4 + 4) + #define IDC_KEYWORD4_FONTSIZE_COMBO (IDC_KEYWORD4 + 5) + #define IDC_KEYWORD4_BOLD_CHECK (IDC_KEYWORD4 + 6) + #define IDC_KEYWORD4_ITALIC_CHECK (IDC_KEYWORD4 + 7) + #define IDC_KEYWORD4_FONTSTYLEGROUP_STATIC (IDC_KEYWORD4 + 8) + #define IDC_KEYWORD4_COLORSTYLEGROUP_STATIC (IDC_KEYWORD4 + 9) + #define IDC_KEYWORD4_FONTNAME_STATIC (IDC_KEYWORD4 + 10) + #define IDC_KEYWORD4_FONTSIZE_STATIC (IDC_KEYWORD4 + 11) + #define IDC_KEYWORD4_EDIT (IDC_KEYWORD4 + 12) + #define IDC_KEYWORD4_PREFIX_CHECK (IDC_KEYWORD4 + 13) + #define IDC_KEYWORD4_UNDERLINE_CHECK (IDC_KEYWORD4 + 14) + + #define IDC_KEYWORD_SCROLLBAR (IDD_KEYWORD_STYLE_DLG + 500) + +#define IDD_COMMENT_STYLE_DLG 23000 //(IDD_GLOBAL_USERDEFINE_DLG + 3000) + + #define IDC_COMMENT (IDD_COMMENT_STYLE_DLG + 100) + #define IDC_COMMENT_DESCGROUP_STATIC (IDC_COMMENT + 1) + #define IDC_COMMENT_FG_STATIC (IDC_COMMENT + 2) + #define IDC_COMMENT_BG_STATIC (IDC_COMMENT+ 3) + #define IDC_COMMENT_FONT_COMBO (IDC_COMMENT + 4) + #define IDC_COMMENT_FONTSIZE_COMBO (IDC_COMMENT+ 5) + #define IDC_COMMENT_BOLD_CHECK (IDC_COMMENT+ 6) + #define IDC_COMMENT_ITALIC_CHECK (IDC_COMMENT+ 7) + #define IDC_COMMENT_FONTSTYLEGROUP_STATIC (IDC_COMMENT+ 8) + #define IDC_COMMENT_COLORSTYLEGROUP_STATIC (IDC_COMMENT+ 9) + #define IDC_COMMENT_FONTNAME_STATIC (IDC_COMMENT+ 10) + #define IDC_COMMENT_FONTSIZE_STATIC (IDC_COMMENT+ 11) + #define IDC_COMMENTOPEN_EDIT (IDC_COMMENT+ 12) + #define IDC_COMMENTOPEN_STATIC (IDC_COMMENT+ 13) + #define IDC_COMMENTCLOSE_EDIT (IDC_COMMENT + 14) + #define IDC_COMMENTCLOSE_STATIC (IDC_COMMENT + 15) + #define IDC_COMMENTLINESYMBOL_CHECK (IDC_COMMENT + 16) + #define IDC_COMMENTSYMBOL_CHECK (IDC_COMMENT + 17) + #define IDC_COMMENT_UNDERLINE_CHECK (IDC_NUMBER + 18) + + #define IDC_NUMBER (IDD_COMMENT_STYLE_DLG + 200) + #define IDC_NUMBER_DESCGROUP_STATIC (IDC_NUMBER+ 1) + #define IDC_NUMBER_FG_STATIC (IDC_NUMBER+ 2) + #define IDC_NUMBER_BG_STATIC (IDC_NUMBER + 3) + #define IDC_NUMBER_FONT_COMBO (IDC_NUMBER+ 4) + #define IDC_NUMBER_FONTSIZE_COMBO (IDC_NUMBER + 5) + #define IDC_NUMBER_BOLD_CHECK (IDC_NUMBER + 6) + #define IDC_NUMBER_ITALIC_CHECK (IDC_NUMBER + 7) + #define IDC_NUMBER_FONTSTYLEGROUP_STATIC (IDC_NUMBER + 8) + #define IDC_NUMBER_COLORSTYLEGROUP_STATIC (IDC_NUMBER + 9) + #define IDC_NUMBER_FONTNAME_STATIC (IDC_NUMBER + 10) + #define IDC_NUMBER_FONTSIZE_STATIC (IDC_NUMBER + 11) + #define IDC_NUMBER_UNDERLINE_CHECK (IDC_NUMBER + 12) + + #define IDC_COMMENTLINE (IDD_COMMENT_STYLE_DLG + 300) + #define IDC_COMMENTLINE_DESCGROUP_STATIC (IDC_COMMENTLINE + 1) + #define IDC_COMMENTLINE_FG_STATIC (IDC_COMMENTLINE + 2) + #define IDC_COMMENTLINE_BG_STATIC (IDC_COMMENTLINE + 3) + #define IDC_COMMENTLINE_FONT_COMBO (IDC_COMMENTLINE + 4) + #define IDC_COMMENTLINE_FONTSIZE_COMBO (IDC_COMMENTLINE + 5) + #define IDC_COMMENTLINE_BOLD_CHECK (IDC_COMMENTLINE + 6) + #define IDC_COMMENTLINE_ITALIC_CHECK (IDC_COMMENTLINE + 7) + #define IDC_COMMENTLINE_FONTSTYLEGROUP_STATIC (IDC_COMMENTLINE + 8) + #define IDC_COMMENTLINE_COLORSTYLEGROUP_STATIC (IDC_COMMENTLINE + 9) + #define IDC_COMMENTLINE_FONTNAME_STATIC (IDC_COMMENTLINE + 10) + #define IDC_COMMENTLINE_FONTSIZE_STATIC (IDC_COMMENTLINE + 11) + #define IDC_COMMENTLINE_EDIT (IDC_COMMENTLINE + 12) + #define IDC_COMMENTLINE_UNDERLINE_CHECK (IDC_COMMENTLINE + 13) + +#define IDD_SYMBOL_STYLE_DLG 24000 //IDD_GLOBAL_USERDEFINE_DLG + 4000 + #define IDC_SYMBOL (IDD_SYMBOL_STYLE_DLG + 100) + #define IDC_ACTIVATED_SYMBOL_STATIC (IDC_SYMBOL + 1) + #define IDC_ACTIVATED_SYMBOL_LIST (IDC_SYMBOL + 2) + #define IDC_AVAILABLE_SYMBOLS_STATIC (IDC_SYMBOL + 3) + #define IDC_AVAILABLE_SYMBOLS_LIST (IDC_SYMBOL + 4) + #define IDC_ADD_BUTTON (IDC_SYMBOL + 5) + #define IDC_REMOVE_BUTTON (IDC_SYMBOL + 6) + #define IDC_SYMBOL_DESCGROUP_STATIC (IDC_SYMBOL+ 7) + #define IDC_SYMBOL_FG_STATIC (IDC_SYMBOL + 8) + #define IDC_SYMBOL_BG_STATIC (IDC_SYMBOL + 9) + #define IDC_SYMBOL_FONT_COMBO (IDC_SYMBOL + 10) + #define IDC_SYMBOL_FONTSIZE_COMBO (IDC_SYMBOL + 11) + #define IDC_SYMBOL_BOLD_CHECK (IDC_SYMBOL+ 12) + #define IDC_SYMBOL_ITALIC_CHECK (IDC_SYMBOL + 13) + #define IDC_SYMBOL_FONTSTYLEGROUP_STATIC (IDC_SYMBOL + 14) + #define IDC_SYMBOL_COLORSTYLEGROUP_STATIC ( IDC_SYMBOL + 15) + #define IDC_SYMBOL_FONTNAME_STATIC (IDC_SYMBOL + 16) + #define IDC_SYMBOL_FONTSIZE_STATIC (IDC_SYMBOL + 17) + #define IDC_SYMBOL_UNDERLINE_CHECK (IDC_SYMBOL + 18) + + #define IDC_SYMBOL2 (IDD_SYMBOL_STYLE_DLG + 200) + #define IDC_SYMBOL_DELIMGROUP1_STATIC (IDC_SYMBOL2 + 1) + #define IDC_SYMBOL_COLORSTYLEGROUP2_STATIC (IDC_SYMBOL2 + 2) + #define IDC_SYMBOL_FONTSTYLEGROUP2_STATIC (IDC_SYMBOL2 + 3) + #define IDC_SYMBOL_FG2_STATIC (IDC_SYMBOL2 + 4) + #define IDC_SYMBOL_BG2_STATIC (IDC_SYMBOL2 + 5) + #define IDC_SYMBOL_FONTNAME2_STATIC (IDC_SYMBOL2 + 6) + #define IDC_SYMBOL_BOLD2_CHECK (IDC_SYMBOL2 + 7) + #define IDC_SYMBOL_ITALIC2_CHECK (IDC_SYMBOL2 + 8) + #define IDC_SYMBOL_FONT2_COMBO (IDC_SYMBOL2 + 9) + #define IDC_SYMBOL_UNDERLINE2_CHECK (IDC_SYMBOL2 + 10) + #define IDC_SYMBOL_BO2_STATIC (IDC_SYMBOL2 + 11) + #define IDC_SYMBOL_BO2_COMBO (IDC_SYMBOL2 + 12) + #define IDC_SYMBOL_BC2_COMBO (IDC_SYMBOL2 + 13) + #define IDC_SYMBOL_BC2_STATIC (IDC_SYMBOL2 + 14) + #define IDC_SYMBOL_FONTSIZE2_COMBO (IDC_SYMBOL2 + 15) + #define IDC_SYMBOL_FONTSIZE2_STATIC (IDC_SYMBOL2 + 16) + + #define IDC_SYMBOL3 (IDD_SYMBOL_STYLE_DLG + 300) + #define IDC_SYMBOL_DELIMGROUP2_STATIC (IDC_SYMBOL3 + 1) + #define IDC_SYMBOL_FG3_STATIC (IDC_SYMBOL3 + 2) + #define IDC_SYMBOL_BG3_STATIC (IDC_SYMBOL3 + 3) + #define IDC_SYMBOL_FONT3_COMBO (IDC_SYMBOL3 + 4) + #define IDC_SYMBOL_BO3_COMBO (IDC_SYMBOL3 + 5) + #define IDC_SYMBOL_BOLD3_CHECK (IDC_SYMBOL3 + 6) + #define IDC_SYMBOL_ITALIC3_CHECK (IDC_SYMBOL3 + 7) + #define IDC_SYMBOL_FONTSTYLEGROUP3_STATIC (IDC_SYMBOL3 + 8) + #define IDC_SYMBOL_COLORSTYLEGROUP3_STATIC (IDC_SYMBOL3 + 9) + #define IDC_SYMBOL_FONTNAME3_STATIC (IDC_SYMBOL3 + 10) + #define IDC_SYMBOL_BO3_STATIC (IDC_SYMBOL3 + 11) + #define IDC_SYMBOL_UNDERLINE3_CHECK (IDC_SYMBOL3 + 12) + #define IDC_SYMBOL_BC3_COMBO (IDC_SYMBOL3 + 13) + #define IDC_SYMBOL_BC3_STATIC (IDC_SYMBOL3 + 14) + #define IDC_SYMBOL_FONTSIZE3_COMBO (IDC_SYMBOL3 + 15) + #define IDC_SYMBOL_FONTSIZE3_STATIC (IDC_SYMBOL3 + 16) + +#define IDD_STRING_DLG 25000 + #define IDC_STRING_STATIC (IDD_STRING_DLG + 1) + #define IDC_STRING_EDIT (IDD_STRING_DLG + 2) +#endif //USERDEFIN_RC_H + diff --git a/PowerEditor/src/ScitillaComponent/colors.h b/PowerEditor/src/ScitillaComponent/colors.h new file mode 100644 index 00000000..158c6dff --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/colors.h @@ -0,0 +1,62 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef COLORS_H +#define COLORS_H + +#include + +const COLORREF red = RGB(0xFF, 0, 0); +const COLORREF darkRed = RGB(0x80, 0, 0); +const COLORREF offWhite = RGB(0xFF, 0xFB, 0xF0); +const COLORREF darkGreen = RGB(0, 0x80, 0); +const COLORREF liteGreen = RGB(0, 0xFF, 0); +const COLORREF blueGreen = RGB(0, 0x80, 0x80); +const COLORREF liteRed = RGB(0xFF, 0xAA, 0xAA); +const COLORREF liteBlueGreen = RGB(0xAA, 0xFF, 0xC8); + +const COLORREF liteBlue = RGB(0xA6, 0xCA, 0xF0); +const COLORREF veryLiteBlue = RGB(0xC4, 0xF9, 0xFD); +const COLORREF extremeLiteBlue = RGB(0xF2, 0xF4, 0xFF); + +const COLORREF darkBlue = RGB(0, 0, 0x80); +const COLORREF blue = RGB(0, 0, 0xFF); +const COLORREF black = RGB(0, 0, 0); +const COLORREF white = RGB(0xFF, 0xFF, 0xFF); +const COLORREF darkGrey = RGB(64, 64, 64); +const COLORREF grey = RGB(128, 128, 128); +const COLORREF liteGrey = RGB(192, 192, 192); +const COLORREF veryLiteGrey = RGB(224, 224, 224); +const COLORREF brown = RGB(128, 64, 0); +//const COLORREF greenBlue = RGB(192, 128, 64); +const COLORREF darkYellow = RGB(0xFF, 0xC0, 0); +const COLORREF yellow = RGB(0xFF, 0xFF, 0); +const COLORREF cyan = RGB(0, 0xFF, 0xFF); +const COLORREF orange = RGB(0xFF, 0x80, 0x00); +const COLORREF purple = RGB(0x80, 0x00, 0xFF); +const COLORREF deepPurple = RGB(0x87, 0x13, 0x97); + +const COLORREF extremeLitePurple = RGB(0xF8, 0xE8, 0xFF); +const COLORREF veryLitePurple = RGB(0xE7, 0xD8, 0xE9); +const COLORREF liteBerge = RGB(0xFE, 0xFC, 0xF5); +const COLORREF berge = RGB(0xFD, 0xF8, 0xE3); +/* +#define RGB2int(color) + (((((long)color) & 0x0000FF) << 16) | ((((long)color) & 0x00FF00)) | ((((long)color) & 0xFF0000) >> 16)) +*/ +#endif //COLORS_H + diff --git a/PowerEditor/src/ScitillaComponent/columnEditor.cpp b/PowerEditor/src/ScitillaComponent/columnEditor.cpp new file mode 100644 index 00000000..e1899988 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/columnEditor.cpp @@ -0,0 +1,255 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO ( donho@altern.org ) + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#include "columnEditor.h" + +BOOL CALLBACK ColumnEditorDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG : + { + switchTo(activeText); + ::SendDlgItemMessage(_hSelf, IDC_COL_DEC_RADIO, BM_SETCHECK, TRUE, 0); + goToCenter(); + + NppParameters *pNppParam = NppParameters::getInstance(); + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + { + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + redraw(); + } + return TRUE; + } + case WM_COMMAND : + { + switch (wParam) + { + case IDCANCEL : // Close + display(false); + return TRUE; + + case IDOK : + { + (*_ppEditView)->execute(SCI_BEGINUNDOACTION); + + const int stringSize = 1024; + TCHAR str[stringSize]; + + bool isTextMode = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_COL_TEXT_RADIO, BM_GETCHECK, 0, 0)); + + if (isTextMode) + { + ::SendDlgItemMessage(_hSelf, IDC_COL_TEXT_EDIT, WM_GETTEXT, stringSize, (LPARAM)str); + + display(false); + + if ((*_ppEditView)->execute(SCI_SELECTIONISRECTANGLE)) + { + ColumnModeInfo colInfos = (*_ppEditView)->getColumnModeSelectInfo(); + (*_ppEditView)->columnReplace(colInfos, str); + (*_ppEditView)->execute(SCI_SETCURRENTPOS,colInfos[colInfos.size()-1].second); + + //(*_ppEditView)->execute(SCI_SETSEL, colInfos[0].first, colInfos[colInfos.size()-1].second); + //(*_ppEditView)->execute(SCI_SETSELECTIONMODE, 1); + } + else + { + int cursorPos = (*_ppEditView)->execute(SCI_GETCURRENTPOS); + int cursorCol = (*_ppEditView)->execute(SCI_GETCOLUMN, cursorPos); + int cursorLine = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, cursorPos); + int endPos = (*_ppEditView)->execute(SCI_GETLENGTH); + int endLine = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, endPos); + + int lineAllocatedLen = 1024; + TCHAR *line = new TCHAR[lineAllocatedLen]; + + for (int i = cursorLine ; i <= endLine ; i++) + { + int lineBegin = (*_ppEditView)->execute(SCI_POSITIONFROMLINE, i); + int lineEnd = (*_ppEditView)->execute(SCI_GETLINEENDPOSITION, i); + + int lineEndCol = (*_ppEditView)->execute(SCI_GETCOLUMN, lineEnd); + int lineLen = lineEnd - lineBegin + 1; + + if (lineLen > lineAllocatedLen) + { + delete [] line; + line = new TCHAR[lineLen]; + } + (*_ppEditView)->getGenericText(line, lineBegin, lineEnd); + generic_string s2r(line); + + if (lineEndCol < cursorCol) + { + generic_string s_space(cursorCol - lineEndCol, ' '); + s2r.append(s_space); + s2r.append(str); + } + else + { + int posAbs2Start = (*_ppEditView)->execute(SCI_FINDCOLUMN, i, cursorCol); + int posRelative2Start = posAbs2Start - lineBegin; + s2r.insert(posRelative2Start, str); + } + (*_ppEditView)->replaceTarget(s2r.c_str(), lineBegin, lineEnd); + } + delete [] line; + } + } + else + { + int initialNumber = ::GetDlgItemInt(_hSelf, IDC_COL_INITNUM_EDIT, NULL, TRUE); + int increaseNumber = ::GetDlgItemInt(_hSelf, IDC_COL_INCREASENUM_EDIT, NULL, TRUE); + UCHAR format = getFormat(); + display(false); + + if ((*_ppEditView)->execute(SCI_SELECTIONISRECTANGLE)) + { + ColumnModeInfo colInfos = (*_ppEditView)->getColumnModeSelectInfo(); + (*_ppEditView)->columnReplace(colInfos, initialNumber, increaseNumber, format); + (*_ppEditView)->execute(SCI_SETCURRENTPOS,colInfos[colInfos.size()-1].second); + } + else + { + int cursorPos = (*_ppEditView)->execute(SCI_GETCURRENTPOS); + int cursorCol = (*_ppEditView)->execute(SCI_GETCOLUMN, cursorPos); + int cursorLine = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, cursorPos); + int endPos = (*_ppEditView)->execute(SCI_GETLENGTH); + int endLine = (*_ppEditView)->execute(SCI_LINEFROMPOSITION, endPos); + + int lineAllocatedLen = 1024; + TCHAR *line = new TCHAR[lineAllocatedLen]; + + + UCHAR f = format & MASK_FORMAT; + bool isZeroLeading = (MASK_ZERO_LEADING & format) != 0; + + int base = 10; + if (f == BASE_16) + base = 16; + else if (f == BASE_08) + base = 8; + else if (f == BASE_02) + base = 2; + + int nbLine = endLine - cursorLine + 1; + int endNumber = initialNumber + increaseNumber * (nbLine - 1); + int nbEnd = getNbChiffre(endNumber, base); + int nbInit = getNbChiffre(initialNumber, base); + int nb = max(nbInit, nbEnd); + + + for (int i = cursorLine ; i <= endLine ; i++) + { + int lineBegin = (*_ppEditView)->execute(SCI_POSITIONFROMLINE, i); + int lineEnd = (*_ppEditView)->execute(SCI_GETLINEENDPOSITION, i); + + int lineEndCol = (*_ppEditView)->execute(SCI_GETCOLUMN, lineEnd); + int lineLen = lineEnd - lineBegin + 1; + + if (lineLen > lineAllocatedLen) + { + delete [] line; + line = new TCHAR[lineLen]; + } + (*_ppEditView)->getGenericText(line, lineBegin, lineEnd); + generic_string s2r(line); + + /* + Calcule generic_string + */ + int2str(str, stringSize, initialNumber, base, nb, isZeroLeading); + initialNumber += increaseNumber; + + if (lineEndCol < cursorCol) + { + generic_string s_space(cursorCol - lineEndCol, ' '); + s2r.append(s_space); + s2r.append(str); + } + else + { + int posAbs2Start = (*_ppEditView)->execute(SCI_FINDCOLUMN, i, cursorCol); + int posRelative2Start = posAbs2Start - lineBegin; + s2r.insert(posRelative2Start, str); + } + + (*_ppEditView)->replaceTarget(s2r.c_str(), lineBegin, lineEnd); + } + delete [] line; + } + } + (*_ppEditView)->execute(SCI_ENDUNDOACTION); + (*_ppEditView)->getFocus(); + return TRUE; + } + case IDC_COL_TEXT_RADIO : + case IDC_COL_NUM_RADIO : + { + switchTo((wParam == IDC_COL_TEXT_RADIO)? activeText : activeNumeric); + return TRUE; + } + + default : + { + switch (HIWORD(wParam)) + { + case EN_SETFOCUS : + case BN_SETFOCUS : + //updateLinesNumbers(); + return TRUE; + default : + return TRUE; + } + break; + } + } + } + + default : + return FALSE; + } + return FALSE; +} + +void ColumnEditorDlg::switchTo(bool toText) +{ + HWND hText = ::GetDlgItem(_hSelf, IDC_COL_TEXT_EDIT); + ::EnableWindow(hText, toText); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_COL_TEXT_GRP_STATIC), toText); + ::SendDlgItemMessage(_hSelf, IDC_COL_TEXT_RADIO, BM_SETCHECK, toText, 0); + + HWND hNum = ::GetDlgItem(_hSelf, IDC_COL_INITNUM_EDIT); + ::SendDlgItemMessage(_hSelf, IDC_COL_NUM_RADIO, BM_SETCHECK, !toText, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_COL_NUM_GRP_STATIC), !toText); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_COL_INITNUM_STATIC), !toText); + ::EnableWindow(hNum, !toText); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_COL_INCRNUM_STATIC), !toText); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_COL_INCREASENUM_EDIT), !toText); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_COL_FORMAT_GRP_STATIC), !toText); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_COL_DEC_RADIO), !toText); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_COL_HEX_RADIO), !toText); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_COL_OCT_RADIO), !toText); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_COL_BIN_RADIO), !toText); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_COL_LEADZERO_CHECK), !toText); + + ::SetFocus(toText?hText:hNum); +} \ No newline at end of file diff --git a/PowerEditor/src/ScitillaComponent/columnEditor.h b/PowerEditor/src/ScitillaComponent/columnEditor.h new file mode 100644 index 00000000..aebcde90 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/columnEditor.h @@ -0,0 +1,83 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO ( donho@altern.org ) + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#ifndef COLUMNEDITOR_H +#define COLUMNEDITOR_H + +#include "columnEditor_rc.h" +#include "StaticDialog.h" +#include "ScintillaEditView.h" + +const bool activeText = true; +const bool activeNumeric = false; + +class ColumnEditorDlg : public StaticDialog +{ +public : + ColumnEditorDlg() : StaticDialog() {}; + + void init(HINSTANCE hInst, HWND hPere, ScintillaEditView **ppEditView) { + Window::init(hInst, hPere); + if (!ppEditView) + throw int(9900); + _ppEditView = ppEditView; + }; + + virtual void create(int dialogID, bool isRTL = false) { + StaticDialog::create(dialogID, isRTL); + }; + + void doDialog(bool isRTL = false) { + if (!isCreated()) + create(IDD_COLUMNEDIT, isRTL); + bool isTextMode = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_COL_TEXT_RADIO, BM_GETCHECK, 0, 0)); + display(); + ::SetFocus(::GetDlgItem(_hSelf, isTextMode?IDC_COL_TEXT_EDIT:IDC_COL_INITNUM_EDIT)); + }; + + virtual void display(bool toShow = true) const { + Window::display(toShow); + if (toShow) + ::SetFocus(::GetDlgItem(_hSelf, ID_GOLINE_EDIT)); + }; + + void switchTo(bool toText); + + UCHAR getFormat() { + bool isLeadingZeros = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_COL_LEADZERO_CHECK, BM_GETCHECK, 0, 0)); + UCHAR f = 0; // Dec by default + if (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_COL_HEX_RADIO, BM_GETCHECK, 0, 0)) + f = 1; + else if (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_COL_OCT_RADIO, BM_GETCHECK, 0, 0)) + f = 2; + else if (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_COL_BIN_RADIO, BM_GETCHECK, 0, 0)) + f = 3; + return (f | (isLeadingZeros?MASK_ZERO_LEADING:0)); + }; + +protected : + virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + +private : + + ScintillaEditView **_ppEditView; + + +}; +#endif// COLUMNEDITOR_H diff --git a/PowerEditor/src/ScitillaComponent/columnEditor.rc b/PowerEditor/src/ScitillaComponent/columnEditor.rc new file mode 100644 index 00000000..61eb79b2 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/columnEditor.rc @@ -0,0 +1,49 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO ( donho@altern.org ) + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#include +#include "columnEditor_rc.h" + + +IDD_COLUMNEDIT DIALOGEX 26, 41, 223, 206 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE + CAPTION "Column Editor" +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x0 +BEGIN + GROUPBOX "Text to insert",IDC_COL_TEXT_GRP_STATIC,12,10,124,54 + GROUPBOX "Number to insert",IDC_COL_NUM_GRP_STATIC,12,75,204,119 + CONTROL "",IDC_COL_TEXT_RADIO,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP,7,10,8,9 + CONTROL "",IDC_COL_NUM_RADIO,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP | WS_GROUP, 7,75,8,9 + EDITTEXT IDC_COL_TEXT_EDIT,25,32,97,14,ES_AUTOHSCROLL + RTEXT "Initial number :",IDC_COL_INITNUM_STATIC,15,91,76,8 + EDITTEXT IDC_COL_INITNUM_EDIT,95,89,38,12,ES_NUMBER + + RTEXT "Increase by :",IDC_COL_INCRNUM_STATIC,16,112,75,8 + EDITTEXT IDC_COL_INCREASENUM_EDIT,95,110,38,12,ES_NUMBER + CONTROL "Leading zeros", IDC_COL_LEADZERO_CHECK,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,140,112,70,10 + + CONTROL "Dec",IDC_COL_DEC_RADIO,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,30,148,50,10 + CONTROL "Hex",IDC_COL_HEX_RADIO,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,124,148,50,10 + CONTROL "Oct",IDC_COL_OCT_RADIO,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,30,167,50,10 + CONTROL "Bin",IDC_COL_BIN_RADIO,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,124,167,50,10 + GROUPBOX "Format",IDC_COL_FORMAT_GRP_STATIC,20,132,188,54,BS_CENTER + DEFPUSHBUTTON "OK",IDOK,145,13,70,14,BS_NOTIFY + PUSHBUTTON "Cancel",IDCANCEL,145,36,70,14,BS_NOTIFY +END diff --git a/PowerEditor/src/ScitillaComponent/columnEditor_rc.h b/PowerEditor/src/ScitillaComponent/columnEditor_rc.h new file mode 100644 index 00000000..01fa7588 --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/columnEditor_rc.h @@ -0,0 +1,39 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO ( donho@altern.org ) + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ +#ifndef COLUMNEDITOR_RC_H +#define COLUMNEDITOR_RC_H + +#define IDD_COLUMNEDIT 2020 + #define IDC_COL_INITNUM_EDIT (IDD_COLUMNEDIT + 1) + #define IDC_COL_INCREASENUM_EDIT (IDD_COLUMNEDIT + 2) + #define IDC_COL_TEXT_GRP_STATIC (IDD_COLUMNEDIT + 3) + #define IDC_COL_DEC_RADIO (IDD_COLUMNEDIT + 4) + #define IDC_COL_OCT_RADIO (IDD_COLUMNEDIT + 5) + #define IDC_COL_HEX_RADIO (IDD_COLUMNEDIT + 6) + #define IDC_COL_BIN_RADIO (IDD_COLUMNEDIT + 7) + #define IDC_COL_TEXT_RADIO (IDD_COLUMNEDIT + 8) + #define IDC_COL_NUM_RADIO (IDD_COLUMNEDIT + 9) + #define IDC_COL_INITNUM_STATIC (IDD_COLUMNEDIT + 10) + #define IDC_COL_INCRNUM_STATIC (IDD_COLUMNEDIT + 11) + #define IDC_COL_FORMAT_GRP_STATIC (IDD_COLUMNEDIT + 12) + #define IDC_COL_NUM_GRP_STATIC (IDD_COLUMNEDIT + 13) + #define IDC_COL_TEXT_EDIT (IDD_COLUMNEDIT + 14) + #define IDC_COL_LEADZERO_CHECK (IDD_COLUMNEDIT + 15) + +#endif// COLUMNEDITOR_RC_H diff --git a/PowerEditor/src/ScitillaComponent/xmlMatchedTagsHighlighter.cpp b/PowerEditor/src/ScitillaComponent/xmlMatchedTagsHighlighter.cpp new file mode 100644 index 00000000..517f5cfb --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/xmlMatchedTagsHighlighter.cpp @@ -0,0 +1,492 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "xmlMatchedTagsHighlighter.h" +#include "ScintillaEditView.h" + +int XmlMatchedTagsHighlighter::getFirstTokenPosFrom(int targetStart, int targetEnd, const char *token, pair & foundPos) +{ + //int start = currentPos; + //int end = (direction == DIR_LEFT)?0:_pEditView->getCurrentDocLen(); + + _pEditView->execute(SCI_SETTARGETSTART, targetStart); + _pEditView->execute(SCI_SETTARGETEND, targetEnd); + _pEditView->execute(SCI_SETSEARCHFLAGS, SCFIND_REGEXP|SCFIND_POSIX); + int posFind = _pEditView->execute(SCI_SEARCHINTARGET, (WPARAM)strlen(token), (LPARAM)token); + if (posFind != -1) + { + foundPos.first = _pEditView->execute(SCI_GETTARGETSTART); + foundPos.second = _pEditView->execute(SCI_GETTARGETEND); + } + return posFind; +} + +TagCateg XmlMatchedTagsHighlighter::getTagCategory(XmlMatchedTagsPos & tagsPos, int curPos) +{ + pair foundPos; + + int docLen = _pEditView->getCurrentDocLen(); + + int gtPos = getFirstTokenPosFrom(curPos, 0, ">", foundPos); + int ltPos = getFirstTokenPosFrom(curPos, 0, "<", foundPos); + if (ltPos != -1) + { + if ((gtPos != -1) && (ltPos < gtPos)) + return outOfTag; + + // Now we are sure about that we are inside of tag + // We'll try to determinate the tag category : + // tagOpen : , + // tagClose : + // tagSigle : , + int charAfterLt = _pEditView->execute(SCI_GETCHARAT, ltPos+1); + if (!charAfterLt) + return unknownPb; + + if ((char)charAfterLt == ' ') + return invalidTag; + + // so now we are sure we have tag sign '<' + // We'll see on the right + int gtPosOnR = getFirstTokenPosFrom(curPos, docLen, ">", foundPos); + int ltPosOnR = getFirstTokenPosFrom(curPos, docLen, "<", foundPos); + + if (gtPosOnR == -1) + return invalidTag; + + if ((ltPosOnR != -1) && (ltPosOnR < gtPosOnR)) + return invalidTag; + + if ((char)charAfterLt == '/') + { + int char2AfterLt = _pEditView->execute(SCI_GETCHARAT, ltPos+1+1); + + if (!char2AfterLt) + return unknownPb; + + if ((char)char2AfterLt == ' ') + return invalidTag; + + tagsPos.tagCloseStart = ltPos; + tagsPos.tagCloseEnd = gtPosOnR + 1; + return tagClose; + } + else + { + // it's sure for not being a tagClose + // So we determinate if it's tagSingle or tagOpen + tagsPos.tagOpenStart = ltPos; + tagsPos.tagOpenEnd = gtPosOnR + 1; + + int charBeforeLt = _pEditView->execute(SCI_GETCHARAT, gtPosOnR-1); + if ((char)charBeforeLt == '/') + return inSingleTag; + + return tagOpen; + } + } + + return outOfTag; +} + +bool XmlMatchedTagsHighlighter::getMatchedTagPos(int searchStart, int searchEnd, const char *tag2find, const char *oppositeTag2find, vector oppositeTagFound, XmlMatchedTagsPos & tagsPos) +{ + const bool search2Left = false; + const bool search2Right = true; + + bool direction = searchEnd > searchStart; + + pair foundPos; + int ltPosOnR = getFirstTokenPosFrom(searchStart, searchEnd, tag2find, foundPos); + if (ltPosOnR == -1) + return false; + + // if the tag is found in non html zone, we skip it + const NppGUI & nppGUI = (NppParameters::getInstance())->getNppGUI(); + int idStyle = _pEditView->execute(SCI_GETSTYLEAT, ltPosOnR); + if (idStyle >= SCE_HJ_START && !nppGUI._enableHiliteNonHTMLZone) + { + int start = (direction == search2Left)?foundPos.first:foundPos.second; + int end = searchEnd; + return getMatchedTagPos(start, end, tag2find, oppositeTag2find, oppositeTagFound, tagsPos); + } + + TagCateg tc = outOfTag; + if (direction == search2Left) + { + tc = getTagCategory(tagsPos, ltPosOnR+2); + + if (tc != tagOpen && tc != inSingleTag) + return false; + if (tc == inSingleTag) + { + int start = foundPos.first; + int end = searchEnd; + return getMatchedTagPos(start, end, tag2find, oppositeTag2find, oppositeTagFound, tagsPos); + } + } + + pair oppositeTagPos; + int s = foundPos.first; + int e = tagsPos.tagOpenEnd; + if (direction == search2Left) + { + s = foundPos.second; + e = tagsPos.tagCloseStart; + } + + int ltTag = getFirstTokenPosFrom(s, e, oppositeTag2find, oppositeTagPos); + + if (ltTag == -1) + { + if (direction == search2Left) + { + return true; + } + else + { + tagsPos.tagCloseStart = foundPos.first; + tagsPos.tagCloseEnd = foundPos.second; + return true; + } + } + else + { + // RegExpr is "]", found tag could be a openTag or singleTag + // so we should make sure if it's a singleTag + XmlMatchedTagsPos pos; + if (direction == search2Right && getTagCategory(pos,ltTag+1) == inSingleTag) + { + while (true) + { + ltTag = getFirstTokenPosFrom(ltTag, e, oppositeTag2find, oppositeTagPos); + + if (ltTag == -1) + { + tagsPos.tagCloseStart = foundPos.first; + tagsPos.tagCloseEnd = foundPos.second; + return true; + } + else + { + if (getTagCategory(pos,ltTag+1) == inSingleTag) + { + continue; + } + + if (!isInList(ltTag, oppositeTagFound)) + { + oppositeTagFound.push_back(ltTag); + break; + } + } + } + return getMatchedTagPos(foundPos.second, searchEnd, tag2find, oppositeTag2find, oppositeTagFound, tagsPos); + } + + + if (isInList(ltTag, oppositeTagFound)) + { + while (true) + { + ltTag = getFirstTokenPosFrom(ltTag, e, oppositeTag2find, oppositeTagPos); + if (ltTag == -1) + { + if (direction == search2Left) + { + return true; + } + else + { + tagsPos.tagCloseStart = foundPos.first; + tagsPos.tagCloseEnd = foundPos.second; + } + return true; + } + else if (!isInList(ltTag, oppositeTagFound)) + { + oppositeTagFound.push_back(ltTag); + break; + } + else + { + if (direction == search2Left) + { + XmlMatchedTagsPos tmpTagsPos; + getTagCategory(tmpTagsPos, ltTag+1); + ltTag = tmpTagsPos.tagCloseEnd; + } + } + } + } + else + { + oppositeTagFound.push_back(ltTag); + } + } + int start, end; + if (direction == search2Left) + { + start = foundPos.first; + end = searchEnd; + } + else + { + start = foundPos.second; + end = searchEnd; + } + + return getMatchedTagPos(start, end, tag2find, oppositeTag2find, oppositeTagFound, tagsPos); +} + + +bool XmlMatchedTagsHighlighter::getXmlMatchedTagsPos(XmlMatchedTagsPos & tagsPos) +{ + // get word where caret is on + int caretPos = _pEditView->execute(SCI_GETCURRENTPOS); + + // if the tag is found in non html zone, then quit + const NppGUI & nppGUI = (NppParameters::getInstance())->getNppGUI(); + int idStyle = _pEditView->execute(SCI_GETSTYLEAT, caretPos); + if (!nppGUI._enableHiliteNonHTMLZone && idStyle >= SCE_HJ_START) + return false; + + int docLen = _pEditView->getCurrentDocLen(); + + // determinate the nature of current word : tagOpen, tagClose or outOfTag + TagCateg tagCateg = getTagCategory(tagsPos, caretPos); + + static const char tagNameChars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.-_:"; + + switch (tagCateg) + { + case tagOpen : // if tagOpen search right + { + _pEditView->execute(SCI_SETWORDCHARS, 0, (LPARAM)tagNameChars); + int startPos = _pEditView->execute(SCI_WORDSTARTPOSITION, tagsPos.tagOpenStart+1, true); + int endPos = _pEditView->execute(SCI_WORDENDPOSITION, tagsPos.tagOpenStart+1, true); + tagsPos.tagNameEnd = endPos; + + _pEditView->execute(SCI_SETCHARSDEFAULT); + char * tagName = new char[endPos-startPos+1]; + + _pEditView->getText(tagName, startPos, endPos); + + basic_string closeTag = ""; + + basic_string openTag = "<"; + openTag += tagName; + openTag += "[ >]"; + + delete [] tagName; + + vector passedTagList; + return getMatchedTagPos(tagsPos.tagOpenEnd, docLen, closeTag.c_str(), openTag.c_str(), passedTagList, tagsPos); + } + + case tagClose : // if tagClose search left + { + _pEditView->execute(SCI_SETWORDCHARS, 0, (LPARAM)tagNameChars); + int startPos = _pEditView->execute(SCI_WORDSTARTPOSITION, tagsPos.tagCloseStart+2, true); + int endPos = _pEditView->execute(SCI_WORDENDPOSITION, tagsPos.tagCloseStart+2, true); + + _pEditView->execute(SCI_SETCHARSDEFAULT); + char * tagName = new char[endPos-startPos+1]; + _pEditView->getText(tagName, startPos, endPos); + + basic_string openTag = "<"; + openTag += tagName; + openTag += "[ >]"; + + basic_string closeTag = ""; + + delete [] tagName; + + vector passedTagList; + bool isFound = getMatchedTagPos(tagsPos.tagCloseStart, 0, openTag.c_str(), closeTag.c_str(), passedTagList, tagsPos); + if (isFound) + tagsPos.tagNameEnd = tagsPos.tagOpenStart + 1 + (endPos - startPos); + + return isFound; + } + + case inSingleTag : // if in single tag + { + _pEditView->execute(SCI_SETWORDCHARS, 0, (LPARAM)tagNameChars); + int endPos = _pEditView->execute(SCI_WORDENDPOSITION, tagsPos.tagOpenStart+1, true); + tagsPos.tagNameEnd = endPos; + _pEditView->execute(SCI_SETCHARSDEFAULT); + + tagsPos.tagCloseStart = -1; + tagsPos.tagCloseEnd = -1; + return true; + } + default: // if outOfTag, just quit + return false; + + } + return false; +} + +vector< pair > XmlMatchedTagsHighlighter::getAttributesPos(int start, int end) +{ + vector< pair > attributes; + + int bufLen = end - start + 1; + char *buf = new char[bufLen+1]; + _pEditView->getText(buf, start, end); + + enum {\ + attr_invalid,\ + attr_key,\ + attr_pre_assign,\ + attr_assign,\ + attr_string,\ + attr_value,\ + attr_valid\ + } state = attr_invalid; + + int startPos = -1; + int oneMoreChar = 1; + int i = 0; + for (; i < bufLen ; i++) + { + switch (buf[i]) + { + case ' ': + case '\t': + case '\n': + case '\r': + { + if (state == attr_key) + state = attr_pre_assign; + else if (state == attr_value) + { + state = attr_valid; + oneMoreChar = 0; + } + } + break; + + case '=': + { + if (state == attr_key || state == attr_pre_assign) + state = attr_assign; + else if (state == attr_assign || state == attr_value) + state = attr_invalid; + } + break; + + case '"': + { + if (state == attr_string) + { + state = attr_valid; + oneMoreChar = 1; + } + else if (state == attr_key || state == attr_pre_assign || state == attr_value) + state = attr_invalid; + else if (state == attr_assign) + state = attr_string; + } + break; + + default: + { + if (state == attr_invalid) + { + state = attr_key; + startPos = i; + } + else if (state == attr_pre_assign) + state = attr_invalid; + else if (state == attr_assign) + state = attr_value; + } + } + + if (state == attr_valid) + { + attributes.push_back(pair(start+startPos, start+i+oneMoreChar)); + state = attr_invalid; + } + } + if (state == attr_value) + attributes.push_back(pair(start+startPos, start+i-1)); + + delete [] buf; + return attributes; +} + + + +void XmlMatchedTagsHighlighter::tagMatch(bool doHiliteAttr) +{ + // Clean up all marks of previous action + _pEditView->clearIndicator(SCE_UNIVERSAL_TAGMATCH); + _pEditView->clearIndicator(SCE_UNIVERSAL_TAGATTR); + + // Detect the current lang type. It works only with html and xml + LangType lang = (_pEditView->getCurrentBuffer())->getLangType(); + + if (lang != L_XML && lang != L_HTML && lang != L_PHP && lang != L_ASP) + return; + + // Get the original targets and search options to restore after tag matching operation + int originalStartPos = _pEditView->execute(SCI_GETTARGETSTART); + int originalEndPos = _pEditView->execute(SCI_GETTARGETEND); + int originalSearchFlags = _pEditView->execute(SCI_GETSEARCHFLAGS); + + // Detect if it's a xml/html tag. If yes, Colour it! + XmlMatchedTagsPos xmlTags; + if (getXmlMatchedTagsPos(xmlTags)) + { + _pEditView->execute(SCI_SETINDICATORCURRENT, SCE_UNIVERSAL_TAGMATCH); + + int openTagTailLen = 2; + // We colourise the close tag firstly + if ((xmlTags.tagCloseStart != -1) && (xmlTags.tagCloseEnd != -1)) + { + _pEditView->execute(SCI_INDICATORFILLRANGE, xmlTags.tagCloseStart, xmlTags.tagCloseEnd - xmlTags.tagCloseStart); + // tag close is present, so it's not single tag + openTagTailLen = 1; + } + + // Now the open tag and its attributs + _pEditView->execute(SCI_INDICATORFILLRANGE, xmlTags.tagOpenStart, xmlTags.tagNameEnd - xmlTags.tagOpenStart); + _pEditView->execute(SCI_INDICATORFILLRANGE, xmlTags.tagOpenEnd - openTagTailLen, openTagTailLen); + + if (doHiliteAttr) + { + vector< pair > attributes = getAttributesPos(xmlTags.tagNameEnd, xmlTags.tagOpenEnd - openTagTailLen); + _pEditView->execute(SCI_SETINDICATORCURRENT, SCE_UNIVERSAL_TAGATTR); + for (size_t i = 0 ; i < attributes.size() ; i++) + { + _pEditView->execute(SCI_INDICATORFILLRANGE, attributes[i].first, attributes[i].second - attributes[i].first); + } + } + } + + // restore the original targets and search options to avoid the conflit with search/replace function + _pEditView->execute(SCI_SETTARGETSTART, originalStartPos); + _pEditView->execute(SCI_SETTARGETEND, originalEndPos); + _pEditView->execute(SCI_SETSEARCHFLAGS, originalSearchFlags); +} diff --git a/PowerEditor/src/ScitillaComponent/xmlMatchedTagsHighlighter.h b/PowerEditor/src/ScitillaComponent/xmlMatchedTagsHighlighter.h new file mode 100644 index 00000000..70b9566d --- /dev/null +++ b/PowerEditor/src/ScitillaComponent/xmlMatchedTagsHighlighter.h @@ -0,0 +1,61 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef XMLMATCHEDTAGSHIGHLIGHTER_H +#define XMLMATCHEDTAGSHIGHLIGHTER_H + +#include +#include + +using namespace std; + +class ScintillaEditView; + +enum TagCateg {tagOpen, tagClose, inSingleTag, outOfTag, invalidTag, unknownPb}; + +class XmlMatchedTagsHighlighter { +public: + XmlMatchedTagsHighlighter(ScintillaEditView *pEditView):_pEditView(pEditView){}; + void tagMatch(bool doHiliteAttr); + +private: + struct XmlMatchedTagsPos { + int tagOpenStart; + int tagNameEnd; + int tagOpenEnd; + + int tagCloseStart; + int tagCloseEnd; + }; + + ScintillaEditView *_pEditView; + + int getFirstTokenPosFrom(int targetStart, int targetEnd, const char *token, std::pair & foundPos); + TagCateg getTagCategory(XmlMatchedTagsPos & tagsPos, int curPos); + bool getMatchedTagPos(int searchStart, int searchEnd, const char *tag2find, const char *oppositeTag2find, vector oppositeTagFound, XmlMatchedTagsPos & tagsPos); + bool getXmlMatchedTagsPos(XmlMatchedTagsPos & tagsPos); + vector< pair > getAttributesPos(int start, int end); + bool isInList(int element, vector elementList) { + for (size_t i = 0 ; i < elementList.size() ; i++) + if (element == elementList[i]) + return true; + return false; + }; +}; + +#endif //XMLMATCHEDTAGSHIGHLIGHTER_H + diff --git a/PowerEditor/src/StaticControl.h b/PowerEditor/src/StaticControl.h new file mode 100644 index 00000000..eb7c5c0b --- /dev/null +++ b/PowerEditor/src/StaticControl.h @@ -0,0 +1,35 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + + +#ifndef STATIC_CONTROL_H +#define STATIC_CONTROL_H + +#include "Window.h" +class StaticControl : public Window +{ +public : + StaticControl() : Window() {}; + ~StaticControl(){}; + void init(HINSTANCE hInst, HWND parent, int ctrlID) { + Window::init(hInst, parent); + //_hSelf = CreateDialog(hInstance, MAKEINTRESOURCE(IDD_LUNA_DIALOG), NULL, cryptoGUI_dlgProc); + }; + +} + +#endif //STATIC_CONTROL_H \ No newline at end of file diff --git a/PowerEditor/src/TinyXml/tinyXmlA/tinystrA.cpp b/PowerEditor/src/TinyXml/tinyXmlA/tinystrA.cpp new file mode 100644 index 00000000..ab4acdac --- /dev/null +++ b/PowerEditor/src/TinyXml/tinyXmlA/tinystrA.cpp @@ -0,0 +1,303 @@ +/* +www.sourceforge.net/projects/tinyxml +Original file by Yves Berquin. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#include "tinyxmlA.h" + +#ifndef TIXMLA_USE_STL + + +#include +#include +#include + +#include "tinystrA.h" + +// TiXmlStringA constructor, based on a C string +TiXmlStringA::TiXmlStringA (const char* instring) +{ + unsigned newlen; + char * newstring; + + if (!instring) + { + allocated = 0; + cstring = NULL; + current_length = 0; + return; + } + newlen = strlen (instring) + 1; + newstring = new char [newlen]; + memcpy (newstring, instring, newlen); + // strcpy (newstring, instring); + allocated = newlen; + cstring = newstring; + current_length = newlen - 1; +} + +// TiXmlStringA copy constructor +TiXmlStringA::TiXmlStringA (const TiXmlStringA& copy) +{ + unsigned newlen; + char * newstring; + + // Prevent copy to self! + if ( © == this ) + return; + + if (! copy . allocated) + { + allocated = 0; + cstring = NULL; + current_length = 0; + return; + } + newlen = copy . length () + 1; + newstring = new char [newlen]; + // strcpy (newstring, copy . cstring); + memcpy (newstring, copy . cstring, newlen); + allocated = newlen; + cstring = newstring; + current_length = newlen - 1; +} + +// TiXmlStringA = operator. Safe when assign own content +void TiXmlStringA ::operator = (const char * content) +{ + unsigned newlen; + char * newstring; + + if (! content) + { + empty_it (); + return; + } + newlen = strlen (content) + 1; + newstring = new char [newlen]; + // strcpy (newstring, content); + memcpy (newstring, content, newlen); + empty_it (); + allocated = newlen; + cstring = newstring; + current_length = newlen - 1; +} + +// = operator. Safe when assign own content +void TiXmlStringA ::operator = (const TiXmlStringA & copy) +{ + unsigned newlen; + char * newstring; + + if (! copy . length ()) + { + empty_it (); + return; + } + newlen = copy . length () + 1; + newstring = new char [newlen]; + // strcpy (newstring, copy . c_str ()); + memcpy (newstring, copy . c_str (), newlen); + empty_it (); + allocated = newlen; + cstring = newstring; + current_length = newlen - 1; +} + + +//// Checks if a TiXmlStringA contains only whitespace (same rules as isspace) +//bool TiXmlStringA::isblank () const +//{ +// char * lookup; +// for (lookup = cstring; * lookup; lookup++) +// if (! isspace (* lookup)) +// return false; +// return true; +//} + +// append a const char * to an existing TiXmlStringA +void TiXmlStringA::append( const char* str, int len ) +{ + char * new_string; + unsigned new_alloc, new_size, size_suffix; + + size_suffix = strlen (str); + if (len < (int) size_suffix) + size_suffix = len; + if (! size_suffix) + return; + + new_size = length () + size_suffix + 1; + // check if we need to expand + if (new_size > allocated) + { + // compute new size + new_alloc = assign_new_size (new_size); + + // allocate new buffer + new_string = new char [new_alloc]; + new_string [0] = 0; + + // copy the previous allocated buffer into this one + if (allocated && cstring) + // strcpy (new_string, cstring); + memcpy (new_string, cstring, length ()); + + // append the suffix. It does exist, otherwize we wouldn't be expanding + // strncat (new_string, str, len); + memcpy (new_string + length (), + str, + size_suffix); + + // return previsously allocated buffer if any + if (allocated && cstring) + delete [] cstring; + + // update member variables + cstring = new_string; + allocated = new_alloc; + } + else + { + // we know we can safely append the new string + // strncat (cstring, str, len); + memcpy (cstring + length (), + str, + size_suffix); + } + current_length = new_size - 1; + cstring [current_length] = 0; +} + + +// append a const char * to an existing TiXmlStringA +void TiXmlStringA::append( const char * suffix ) +{ + char * new_string; + unsigned new_alloc, new_size; + + new_size = length () + strlen (suffix) + 1; + // check if we need to expand + if (new_size > allocated) + { + // compute new size + new_alloc = assign_new_size (new_size); + + // allocate new buffer + new_string = new char [new_alloc]; + new_string [0] = 0; + + // copy the previous allocated buffer into this one + if (allocated && cstring) + memcpy (new_string, cstring, 1 + length ()); + // strcpy (new_string, cstring); + + // append the suffix. It does exist, otherwize we wouldn't be expanding + // strcat (new_string, suffix); + memcpy (new_string + length (), + suffix, + strlen (suffix) + 1); + + // return previsously allocated buffer if any + if (allocated && cstring) + delete [] cstring; + + // update member variables + cstring = new_string; + allocated = new_alloc; + } + else + { + // we know we can safely append the new string + // strcat (cstring, suffix); + memcpy (cstring + length (), + suffix, + strlen (suffix) + 1); + } + current_length = new_size - 1; +} + +// Check for TiXmlStringA equuivalence +//bool TiXmlStringA::operator == (const TiXmlStringA & compare) const +//{ +// return (! strcmp (c_str (), compare . c_str ())); +//} + +//unsigned TiXmlStringA::length () const +//{ +// if (allocated) +// // return strlen (cstring); +// return current_length; +// return 0; +//} + + +unsigned TiXmlStringA::find (char tofind, unsigned offset) const +{ + char * lookup; + + if (offset >= length ()) + return (unsigned) notfound; + for (lookup = cstring + offset; * lookup; lookup++) + if (* lookup == tofind) + return lookup - cstring; + return (unsigned) notfound; +} + + +bool TiXmlStringA::operator == (const TiXmlStringA & compare) const +{ + if ( allocated && compare.allocated ) + { + assert( cstring ); + assert( compare.cstring ); + return ( strcmp( cstring, compare.cstring ) == 0 ); + } + return false; +} + + +bool TiXmlStringA::operator < (const TiXmlStringA & compare) const +{ + if ( allocated && compare.allocated ) + { + assert( cstring ); + assert( compare.cstring ); + return ( strcmp( cstring, compare.cstring ) > 0 ); + } + return false; +} + + +bool TiXmlStringA::operator > (const TiXmlStringA & compare) const +{ + if ( allocated && compare.allocated ) + { + assert( cstring ); + assert( compare.cstring ); + return ( strcmp( cstring, compare.cstring ) < 0 ); + } + return false; +} + + +#endif // TIXMLA_USE_STL diff --git a/PowerEditor/src/TinyXml/tinyXmlA/tinystrA.h b/PowerEditor/src/TinyXml/tinyXmlA/tinystrA.h new file mode 100644 index 00000000..dca746e0 --- /dev/null +++ b/PowerEditor/src/TinyXml/tinyXmlA/tinystrA.h @@ -0,0 +1,236 @@ +/* +www.sourceforge.net/projects/tinyxml +Original file by Yves Berquin. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#include "tinyxmlA.h" + + +#ifndef TIXMLA_USE_STL + +#ifndef _INCLUDED +#define TIXMLA_STRING_INCLUDED + +#pragma warning( disable : 4514 ) + +#include + +/* + TiXmlStringA is an emulation of the std::string template. + Its purpose is to allow compiling TinyXML on compilers with no or poor STL support. + Only the member functions relevant to the TinyXML project have been implemented. + The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase + a string and there's no more room, we allocate a buffer twice as big as we need. +*/ +class TiXmlStringA +{ + public : + // TiXmlStringA constructor, based on a string + TiXmlStringA (const char * instring); + + // TiXmlStringA empty constructor + TiXmlStringA () + { + allocated = 0; + cstring = NULL; + current_length = 0; + } + + // TiXmlStringA copy constructor + TiXmlStringA (const TiXmlStringA& copy); + + // TiXmlStringA destructor + ~ TiXmlStringA () + { + empty_it (); + } + + // Convert a TiXmlStringA into a classical char * + const char * c_str () const + { + if (allocated) + return cstring; + return ""; + } + + // Return the length of a TiXmlStringA + unsigned length () const + { + return ( allocated ) ? current_length : 0; + } + + // TiXmlStringA = operator + void operator = (const char * content); + + // = operator + void operator = (const TiXmlStringA & copy); + + // += operator. Maps to append + TiXmlStringA& operator += (const char * suffix) + { + append (suffix); + return *this; + } + + // += operator. Maps to append + TiXmlStringA& operator += (char single) + { + append (single); + return *this; + } + + // += operator. Maps to append + TiXmlStringA& operator += (TiXmlStringA & suffix) + { + append (suffix); + return *this; + } + bool operator == (const TiXmlStringA & compare) const; + bool operator < (const TiXmlStringA & compare) const; + bool operator > (const TiXmlStringA & compare) const; + + // Checks if a TiXmlStringA is empty + bool empty () const + { + return length () ? false : true; + } + + // Checks if a TiXmlStringA contains only whitespace (same rules as isspace) + // Not actually used in tinyxml. Conflicts with a C macro, "isblank", + // which is a problem. Commenting out. -lee +// bool isblank () const; + + // single char extraction + const char& at (unsigned index) const + { + assert( index < length ()); + return cstring [index]; + } + + // find a char in a string. Return TiXmlStringA::notfound if not found + unsigned find (char lookup) const + { + return find (lookup, 0); + } + + // find a char in a string from an offset. Return TiXmlStringA::notfound if not found + unsigned find (char tofind, unsigned offset) const; + + /* Function to reserve a big amount of data when we know we'll need it. Be aware that this + function clears the content of the TiXmlStringA if any exists. + */ + void reserve (unsigned size) + { + empty_it (); + if (size) + { + allocated = size; + TIXMLA_STRING cstring = new char [size]; + cstring [0] = 0; + current_length = 0; + } + } + + // [] operator + char& operator [] (unsigned index) const + { + assert( index < length ()); + return cstring [index]; + } + + // Error value for find primitive + enum { notfound = 0xffffffff, + npos = notfound }; + + void append (const char *str, int len ); + + protected : + + // The base string + char * cstring; + // Number of chars allocated + unsigned allocated; + // Current string size + unsigned current_length; + + // New size computation. It is simplistic right now : it returns twice the amount + // we need + unsigned assign_new_size (unsigned minimum_to_allocate) + { + return minimum_to_allocate * 2; + } + + // Internal function that clears the content of a TiXmlStringA + void empty_it () + { + if (cstring) + delete [] cstring; + cstring = NULL; + allocated = 0; + current_length = 0; + } + + void append (const char *suffix ); + + // append function for another TiXmlStringA + void append (const TiXmlStringA & suffix) + { + append (suffix . c_str ()); + } + + // append for a single char. This could be improved a lot if needed + void append (char single) + { + char smallstr [2]; + smallstr [0] = single; + smallstr [1] = 0; + append (smallstr); + } + +} ; + +/* + TiXmlOutStreamA is an emulation of std::ostream. It is based on TiXmlStringA. + Only the operators that we need for TinyXML have been developped. +*/ +class TiXmlOutStreamA : public TiXmlStringA +{ +public : + TiXmlOutStreamA () : TiXmlStringA () {} + + // TiXmlOutStreamA << operator. Maps to TiXmlStringA::append + TiXmlOutStreamA & operator << (const char * in) + { + append (in); + return (* this); + } + + // TiXmlOutStreamA << operator. Maps to TiXmlStringA::append + TiXmlOutStreamA & operator << (const TiXmlStringA & in) + { + append (in . c_str ()); + return (* this); + } +} ; + +#endif // TIXMLA_STRING_INCLUDED +#endif // TIXMLA_USE_STL diff --git a/PowerEditor/src/TinyXml/tinyXmlA/tinyxmlA.cpp b/PowerEditor/src/TinyXml/tinyXmlA/tinyxmlA.cpp new file mode 100644 index 00000000..3f9ad06a --- /dev/null +++ b/PowerEditor/src/TinyXml/tinyXmlA/tinyxmlA.cpp @@ -0,0 +1,1316 @@ +/* +www.sourceforge.net/projects/tinyxml +Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#include +#include "tinyxmlA.h" + +#ifdef TIXMLA_USE_STL +#include +#endif + +bool TiXmlBaseA::condenseWhiteSpace = true; + +void TiXmlBaseA::PutString( const TIXMLA_STRING& str, TIXMLA_OSTREAM* stream ) +{ + TIXMLA_STRING buffer; + PutString( str, &buffer ); + (*stream) << buffer; +} + +void TiXmlBaseA::PutString( const TIXMLA_STRING& str, TIXMLA_STRING* outString ) +{ + int i=0; + + while( i<(int)str.length() ) + { + int c = str[i]; + + if ( c == '&' + && i < ( (int)str.length() - 2 ) + && str[i+1] == '#' + && str[i+2] == 'x' ) + { + // Hexadecimal character reference. + // Pass through unchanged. + // © -- copyright symbol, for example. + while ( i<(int)str.length() ) + { + outString->append( str.c_str() + i, 1 ); + ++i; + if ( str[i] == ';' ) + break; + } + } + else if ( c == '&' ) + { + outString->append( entity[0].str, entity[0].strLength ); + ++i; + } + else if ( c == '<' ) + { + outString->append( entity[1].str, entity[1].strLength ); + ++i; + } + else if ( c == '>' ) + { + outString->append( entity[2].str, entity[2].strLength ); + ++i; + } + else if ( c == '\"' ) + { + outString->append( entity[3].str, entity[3].strLength ); + ++i; + } + else if ( c == '\'' ) + { + outString->append( entity[4].str, entity[4].strLength ); + ++i; + } + else if ( c < 32 || c > 126 ) + { + // Easy pass at non-alpha/numeric/symbol + // 127 is the delete key. Below 32 is symbolic. + char buf[ 32 ]; + sprintf( buf, "&#x%02X;", (unsigned) ( c & 0xff ) ); + outString->append( buf, strlen( buf ) ); + ++i; + } + else + { + char realc = (char) c; + outString->append( &realc, 1 ); + ++i; + } + } +} + + +// <-- Strange class for a bug fix. Search for STL_STRING_BUG +TiXmlBaseA::StringToBuffer::StringToBuffer( const TIXMLA_STRING& str ) +{ + buffer = new char[ str.length()+1 ]; + if ( buffer ) + { + strcpy( buffer, str.c_str() ); + } +} + + +TiXmlBaseA::StringToBuffer::~StringToBuffer() +{ + delete [] buffer; +} +// End strange bug fix. --> + + +TiXmlNodeA::TiXmlNodeA( NodeType _type ) +{ + parent = 0; + type = _type; + firstChild = 0; + lastChild = 0; + prev = 0; + next = 0; + userData = 0; +} + + +TiXmlNodeA::~TiXmlNodeA() +{ + TiXmlNodeA* node = firstChild; + TiXmlNodeA* temp = 0; + + while ( node ) + { + temp = node; + node = node->next; + delete temp; + } +} + + +void TiXmlNodeA::Clear() +{ + TiXmlNodeA* node = firstChild; + TiXmlNodeA* temp = 0; + + while ( node ) + { + temp = node; + node = node->next; + delete temp; + } + + firstChild = 0; + lastChild = 0; +} + + +TiXmlNodeA* TiXmlNodeA::LinkEndChild( TiXmlNodeA* node ) +{ + node->parent = this; + + node->prev = lastChild; + node->next = 0; + + if ( lastChild ) + lastChild->next = node; + else + firstChild = node; // it was an empty list. + + lastChild = node; + return node; +} + + +TiXmlNodeA* TiXmlNodeA::InsertEndChild( const TiXmlNodeA& addThis ) +{ + TiXmlNodeA* node = addThis.Clone(); + if ( !node ) + return 0; + + return LinkEndChild( node ); +} + + +TiXmlNodeA* TiXmlNodeA::InsertBeforeChild( TiXmlNodeA* beforeThis, const TiXmlNodeA& addThis ) +{ + if ( !beforeThis || beforeThis->parent != this ) + return 0; + + TiXmlNodeA* node = addThis.Clone(); + if ( !node ) + return 0; + node->parent = this; + + node->next = beforeThis; + node->prev = beforeThis->prev; + if ( beforeThis->prev ) + { + beforeThis->prev->next = node; + } + else + { + assert( firstChild == beforeThis ); + firstChild = node; + } + beforeThis->prev = node; + return node; +} + + +TiXmlNodeA* TiXmlNodeA::InsertAfterChild( TiXmlNodeA* afterThis, const TiXmlNodeA& addThis ) +{ + if ( !afterThis || afterThis->parent != this ) + return 0; + + TiXmlNodeA* node = addThis.Clone(); + if ( !node ) + return 0; + node->parent = this; + + node->prev = afterThis; + node->next = afterThis->next; + if ( afterThis->next ) + { + afterThis->next->prev = node; + } + else + { + assert( lastChild == afterThis ); + lastChild = node; + } + afterThis->next = node; + return node; +} + + +TiXmlNodeA* TiXmlNodeA::ReplaceChild( TiXmlNodeA* replaceThis, const TiXmlNodeA& withThis ) +{ + if ( replaceThis->parent != this ) + return 0; + + TiXmlNodeA* node = withThis.Clone(); + if ( !node ) + return 0; + + node->next = replaceThis->next; + node->prev = replaceThis->prev; + + if ( replaceThis->next ) + replaceThis->next->prev = node; + else + lastChild = node; + + if ( replaceThis->prev ) + replaceThis->prev->next = node; + else + firstChild = node; + + delete replaceThis; + node->parent = this; + return node; +} + + +bool TiXmlNodeA::RemoveChild( TiXmlNodeA* removeThis ) +{ + if ( removeThis->parent != this ) + { + assert( 0 ); + return false; + } + + if ( removeThis->next ) + removeThis->next->prev = removeThis->prev; + else + lastChild = removeThis->prev; + + if ( removeThis->prev ) + removeThis->prev->next = removeThis->next; + else + firstChild = removeThis->next; + + delete removeThis; + return true; +} + +TiXmlNodeA* TiXmlNodeA::FirstChild( const char * _value ) const +{ + TiXmlNodeA* node; + for ( node = firstChild; node; node = node->next ) + { + if ( node->SValue() == TIXMLA_STRING( _value )) + return node; + } + return 0; +} + +TiXmlNodeA* TiXmlNodeA::LastChild( const char * _value ) const +{ + TiXmlNodeA* node; + for ( node = lastChild; node; node = node->prev ) + { + if ( node->SValue() == TIXMLA_STRING (_value)) + return node; + } + return 0; +} + +TiXmlNodeA* TiXmlNodeA::IterateChildren( TiXmlNodeA* previous ) const +{ + if ( !previous ) + { + return FirstChild(); + } + else + { + assert( previous->parent == this ); + return previous->NextSibling(); + } +} + +TiXmlNodeA* TiXmlNodeA::IterateChildren( const char * val, TiXmlNodeA* previous ) const +{ + if ( !previous ) + { + return FirstChild( val ); + } + else + { + assert( previous->parent == this ); + return previous->NextSibling( val ); + } +} + +TiXmlNodeA* TiXmlNodeA::NextSibling( const char * _value ) const +{ + TiXmlNodeA* node; + for ( node = next; node; node = node->next ) + { + if ( node->SValue() == TIXMLA_STRING (_value)) + return node; + } + return 0; +} + + +TiXmlNodeA* TiXmlNodeA::PreviousSibling( const char * _value ) const +{ + TiXmlNodeA* node; + for ( node = prev; node; node = node->prev ) + { + if ( node->SValue() == TIXMLA_STRING (_value)) + return node; + } + return 0; +} + +void TiXmlElementA::RemoveAttribute( const char * name ) +{ + TiXmlAttributeA* node = attributeSet.Find( name ); + if ( node ) + { + attributeSet.Remove( node ); + delete node; + } +} + +TiXmlElementA* TiXmlNodeA::FirstChildElement() const +{ + TiXmlNodeA* node; + + for ( node = FirstChild(); + node; + node = node->NextSibling() ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + +TiXmlElementA* TiXmlNodeA::FirstChildElement( const char * _value ) const +{ + TiXmlNodeA* node; + + for ( node = FirstChild( _value ); + node; + node = node->NextSibling( _value ) ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + +TiXmlElementA* TiXmlNodeA::NextSiblingElement() const +{ + TiXmlNodeA* node; + + for ( node = NextSibling(); + node; + node = node->NextSibling() ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + +TiXmlElementA* TiXmlNodeA::NextSiblingElement( const char * _value ) const +{ + TiXmlNodeA* node; + + for ( node = NextSibling( _value ); + node; + node = node->NextSibling( _value ) ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + + +TiXmlDocumentA* TiXmlNodeA::GetDocument() const +{ + const TiXmlNodeA* node; + + for( node = this; node; node = node->parent ) + { + if ( node->ToDocument() ) + return node->ToDocument(); + } + return 0; +} + + +TiXmlElementA::TiXmlElementA (const char * _value) +: TiXmlNodeA( TiXmlNodeA::ELEMENT ) +{ + firstChild = lastChild = 0; + value = _value; +} + +TiXmlElementA::~TiXmlElementA() +{ + while( attributeSet.First() ) + { + TiXmlAttributeA* node = attributeSet.First(); + attributeSet.Remove( node ); + delete node; + } +} + +const char * TiXmlElementA::Attribute( const char * name ) const +{ + TiXmlAttributeA* node = attributeSet.Find( name ); + + if ( node ) + return node->Value(); + + return 0; +} + + +const char * TiXmlElementA::Attribute( const char * name, int* i ) const +{ + const char * s = Attribute( name ); + if ( i ) + { + if ( s ) + *i = atoi( s ); + else + *i = 0; + } + return s; +} + + +const char * TiXmlElementA::Attribute( const char * name, double* d ) const +{ + const char * s = Attribute( name ); + if ( d ) + { + if ( s ) + *d = atof( s ); + else + *d = 0; + } + return s; +} + + +int TiXmlElementA::QueryIntAttribute( const char* name, int* ival ) const +{ + TiXmlAttributeA* node = attributeSet.Find( name ); + if ( !node ) + return TIXMLA_NO_ATTRIBUTE; + + return node->QueryIntValue( ival ); +} + + +int TiXmlElementA::QueryDoubleAttribute( const char* name, double* dval ) const +{ + TiXmlAttributeA* node = attributeSet.Find( name ); + if ( !node ) + return TIXMLA_NO_ATTRIBUTE; + + return node->QueryDoubleValue( dval ); +} + + +void TiXmlElementA::SetAttribute( const char * name, int val ) +{ + char buf[64]; + sprintf( buf, "%d", val ); + SetAttribute( name, buf ); +} + + +void TiXmlElementA::SetAttribute( const char * name, const char * _value ) +{ + TiXmlAttributeA* node = attributeSet.Find( name ); + if ( node ) + { + node->SetValue( _value ); + return; + } + + TiXmlAttributeA* attrib = new TiXmlAttributeA( name, _value ); + if ( attrib ) + { + attributeSet.Add( attrib ); + } + else + { + TiXmlDocumentA* document = GetDocument(); + if ( document ) document->SetError( TIXMLA_ERROR_OUT_OF_MEMORY, 0, 0 ); + } +} + +void TiXmlElementA::Print( FILE* cfile, int depth ) const +{ + int i; + for ( i=0; iNext() ) + { + fprintf( cfile, " " ); + attrib->Print( cfile, depth ); + } + + // There are 3 different formatting approaches: + // 1) An element without children is printed as a node + // 2) An element with only a text child is printed as text + // 3) An element with children is printed on multiple lines. + TiXmlNodeA* node; + if ( !firstChild ) + { + fprintf( cfile, " />" ); + } + else if ( firstChild == lastChild && firstChild->ToText() ) + { + fprintf( cfile, ">" ); + firstChild->Print( cfile, depth + 1 ); + fprintf( cfile, "", value.c_str() ); + } + else + { + fprintf( cfile, ">" ); + + for ( node = firstChild; node; node=node->NextSibling() ) + { + if ( !node->ToText() ) + { + fprintf( cfile, "\n" ); + } + node->Print( cfile, depth+1 ); + } + fprintf( cfile, "\n" ); + for( i=0; i", value.c_str() ); + } +} + +void TiXmlElementA::StreamOut( TIXMLA_OSTREAM * stream ) const +{ + (*stream) << "<" << value; + + TiXmlAttributeA* attrib; + for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() ) + { + (*stream) << " "; + attrib->StreamOut( stream ); + } + + // If this node has children, give it a closing tag. Else + // make it an empty tag. + TiXmlNodeA* node; + if ( firstChild ) + { + (*stream) << ">"; + + for ( node = firstChild; node; node=node->NextSibling() ) + { + node->StreamOut( stream ); + } + (*stream) << ""; + } + else + { + (*stream) << " />"; + } +} + +TiXmlNodeA* TiXmlElementA::Clone() const +{ + TiXmlElementA* clone = new TiXmlElementA( Value() ); + if ( !clone ) + return 0; + + CopyToClone( clone ); + + // Clone the attributes, then clone the children. + TiXmlAttributeA* attribute = 0; + for( attribute = attributeSet.First(); + attribute; + attribute = attribute->Next() ) + { + clone->SetAttribute( attribute->Name(), attribute->Value() ); + } + + TiXmlNodeA* node = 0; + for ( node = firstChild; node; node = node->NextSibling() ) + { + clone->LinkEndChild( node->Clone() ); + } + return clone; +} + + +TiXmlDocumentA::TiXmlDocumentA() : TiXmlNodeA( TiXmlNodeA::DOCUMENT ) +{ + tabsize = 4; + ClearError(); +} + +TiXmlDocumentA::TiXmlDocumentA( const char * documentName ) : TiXmlNodeA( TiXmlNodeA::DOCUMENT ) +{ + tabsize = 4; + value = documentName; + ClearError(); +} + +bool TiXmlDocumentA::LoadFile() +{ + // See STL_STRING_BUG below. + StringToBuffer buf( value ); + + if ( buf.buffer && LoadFile( buf.buffer ) ) + return true; + + return false; +} + + +bool TiXmlDocumentA::SaveFile() const +{ + // See STL_STRING_BUG below. + StringToBuffer buf( value ); + + if ( buf.buffer && SaveFile( buf.buffer ) ) + return true; + + return false; +} + +bool TiXmlDocumentA::LoadFile( const char* filename ) +{ + // Delete the existing data: + Clear(); + location.Clear(); + + // There was a really terrifying little bug here. The code: + // value = filename + // in the STL case, cause the assignment method of the std::string to + // be called. What is strange, is that the std::string had the same + // address as it's c_str() method, and so bad things happen. Looks + // like a bug in the Microsoft STL implementation. + // See STL_STRING_BUG above. + // Fixed with the StringToBuffer class. + value = filename; + + FILE* file = fopen( value.c_str (), "r" ); + + if ( file ) + { + // Get the file size, so we can pre-allocate the string. HUGE speed impact. + long length = 0; + fseek( file, 0, SEEK_END ); + length = ftell( file ); + fseek( file, 0, SEEK_SET ); + + // Strange case, but good to handle up front. + if ( length == 0 ) + { + fclose( file ); + return false; + } + + // If we have a file, assume it is all one big XML file, and read it in. + // The document parser may decide the document ends sooner than the entire file, however. + TIXMLA_STRING data; + data.reserve( length ); + + const int BUF_SIZE = 2048; + char buf[BUF_SIZE]; + + while( fgets( buf, BUF_SIZE, file ) ) + { + data += buf; + } + fclose( file ); + + Parse( data.c_str(), 0 ); + + if ( Error() ) + return false; + else + return true; + } + SetError( TIXMLA_ERROR_OPENING_FILE, 0, 0 ); + return false; +} + +bool TiXmlDocumentA::LoadUnicodeFilePath( const TCHAR* filename ) +{ + + // Delete the existing data: + Clear(); + location.Clear(); + + // There was a really terrifying little bug here. The code: + // value = filename + // in the STL case, cause the assignment method of the std::generic_string to + // be called. What is strange, is that the std::generic_string had the same + // address as it's c_str() method, and so bad things happen. Looks + // like a bug in the Microsoft STL implementation. + // See STL_STRING_BUG above. + // Fixed with the StringToBuffer class. + + FILE* file = generic_fopen(filename, TEXT("r")); + + if ( file ) + { + // Get the file size, so we can pre-allocate the generic_string. HUGE speed impact. + long length = 0; + fseek( file, 0, SEEK_END ); + length = ftell( file ); + fseek( file, 0, SEEK_SET ); + + // Strange case, but good to handle up front. + if ( length == 0 ) + { + fclose( file ); + return false; + } + + // If we have a file, assume it is all one big XML file, and read it in. + // The document parser may decide the document ends sooner than the entire file, however. + TIXMLA_STRING data; + data.reserve( length ); + + const int BUF_SIZE = 2048; + char buf[BUF_SIZE]; + + while( fgets( buf, BUF_SIZE, file ) ) + { + data += buf; + } + fclose( file ); + + Parse( data.c_str(), 0 ); + + if ( Error() ) + return false; + else + return true; + } + SetError( TIXMLA_ERROR_OPENING_FILE, 0, 0 ); + return false; +} + +bool TiXmlDocumentA::SaveFile( const char * filename ) const +{ + // The old c stuff lives on... + FILE* fp = fopen( filename, "w" ); + if ( fp ) + { + Print( fp, 0 ); + fclose( fp ); + return true; + } + return false; +} + + +TiXmlNodeA* TiXmlDocumentA::Clone() const +{ + TiXmlDocumentA* clone = new TiXmlDocumentA(); + if ( !clone ) + return 0; + + CopyToClone( clone ); + clone->error = error; + clone->errorDesc = errorDesc.c_str (); + + TiXmlNodeA* node = 0; + for ( node = firstChild; node; node = node->NextSibling() ) + { + clone->LinkEndChild( node->Clone() ); + } + return clone; +} + + +void TiXmlDocumentA::Print( FILE* cfile, int depth ) const +{ + TiXmlNodeA* node; + for ( node=FirstChild(); node; node=node->NextSibling() ) + { + node->Print( cfile, depth ); + fprintf( cfile, "\n" ); + } +} + +void TiXmlDocumentA::StreamOut( TIXMLA_OSTREAM * out ) const +{ + TiXmlNodeA* node; + for ( node=FirstChild(); node; node=node->NextSibling() ) + { + node->StreamOut( out ); + + // Special rule for streams: stop after the root element. + // The stream in code will only read one element, so don't + // write more than one. + if ( node->ToElement() ) + break; + } +} + + +TiXmlAttributeA* TiXmlAttributeA::Next() const +{ + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( next->value.empty() && next->name.empty() ) + return 0; + return next; +} + + +TiXmlAttributeA* TiXmlAttributeA::Previous() const +{ + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( prev->value.empty() && prev->name.empty() ) + return 0; + return prev; +} + + +void TiXmlAttributeA::Print( FILE* cfile, int /*depth*/ ) const +{ + TIXMLA_STRING n, v; + + PutString( Name(), &n ); + PutString( Value(), &v ); + + if (value.find ('\"') == TIXMLA_STRING::npos) + fprintf (cfile, "%s=\"%s\"", n.c_str(), v.c_str() ); + else + fprintf (cfile, "%s='%s'", n.c_str(), v.c_str() ); +} + + +void TiXmlAttributeA::StreamOut( TIXMLA_OSTREAM * stream ) const +{ + if (value.find( '\"' ) != TIXMLA_STRING::npos) + { + PutString( name, stream ); + (*stream) << "=" << "'"; + PutString( value, stream ); + (*stream) << "'"; + } + else + { + PutString( name, stream ); + (*stream) << "=" << "\""; + PutString( value, stream ); + (*stream) << "\""; + } +} + +int TiXmlAttributeA::QueryIntValue( int* ival ) const +{ + if ( sscanf( value.c_str(), "%d", ival ) == 1 ) + return TIXMLA_SUCCESS; + return TIXMLA_WRONG_TYPE; +} + +int TiXmlAttributeA::QueryDoubleValue( double* dval ) const +{ + if ( sscanf( value.c_str(), "%lf", dval ) == 1 ) + return TIXMLA_SUCCESS; + return TIXMLA_WRONG_TYPE; +} + +void TiXmlAttributeA::SetIntValue( int _value ) +{ + char buf [64]; + sprintf (buf, "%d", _value); + SetValue (buf); +} + +void TiXmlAttributeA::SetDoubleValue( double _value ) +{ + char buf [64]; + sprintf (buf, "%lf", _value); + SetValue (buf); +} + +const int TiXmlAttributeA::IntValue() const +{ + return atoi (value.c_str ()); +} + +const double TiXmlAttributeA::DoubleValue() const +{ + return atof (value.c_str ()); +} + +void TiXmlCommentA::Print( FILE* cfile, int depth ) const +{ + for ( int i=0; i", value.c_str() ); +} + +void TiXmlCommentA::StreamOut( TIXMLA_OSTREAM * stream ) const +{ + (*stream) << ""; +} + +TiXmlNodeA* TiXmlCommentA::Clone() const +{ + TiXmlCommentA* clone = new TiXmlCommentA(); + + if ( !clone ) + return 0; + + CopyToClone( clone ); + return clone; +} + + +void TiXmlTextA::Print( FILE* cfile, int /*depth*/ ) const +{ + TIXMLA_STRING buffer; + PutString( value, &buffer ); + fprintf( cfile, "%s", buffer.c_str() ); +} + + +void TiXmlTextA::StreamOut( TIXMLA_OSTREAM * stream ) const +{ + PutString( value, stream ); +} + + +TiXmlNodeA* TiXmlTextA::Clone() const +{ + TiXmlTextA* clone = 0; + clone = new TiXmlTextA( "" ); + + if ( !clone ) + return 0; + + CopyToClone( clone ); + return clone; +} + + +TiXmlDeclarationA::TiXmlDeclarationA( const char * _version, + const char * _encoding, + const char * _standalone ) +: TiXmlNodeA( TiXmlNodeA::DECLARATION ) +{ + version = _version; + encoding = _encoding; + standalone = _standalone; +} + + +void TiXmlDeclarationA::Print( FILE* cfile, int /*depth*/ ) const +{ + fprintf (cfile, ""); +} + +void TiXmlDeclarationA::StreamOut( TIXMLA_OSTREAM * stream ) const +{ + (*stream) << ""; +} + +TiXmlNodeA* TiXmlDeclarationA::Clone() const +{ + TiXmlDeclarationA* clone = new TiXmlDeclarationA(); + + if ( !clone ) + return 0; + + CopyToClone( clone ); + clone->version = version; + clone->encoding = encoding; + clone->standalone = standalone; + return clone; +} + + +void TiXmlUnknownA::Print( FILE* cfile, int depth ) const +{ + for ( int i=0; i"; // Don't use entities hear! It is unknown. +} + +TiXmlNodeA* TiXmlUnknownA::Clone() const +{ + TiXmlUnknownA* clone = new TiXmlUnknownA(); + + if ( !clone ) + return 0; + + CopyToClone( clone ); + return clone; +} + + +TiXmlAttributeSetA::TiXmlAttributeSetA() +{ + sentinel.next = &sentinel; + sentinel.prev = &sentinel; +} + + +TiXmlAttributeSetA::~TiXmlAttributeSetA() +{ + assert( sentinel.next == &sentinel ); + assert( sentinel.prev == &sentinel ); +} + + +void TiXmlAttributeSetA::Add( TiXmlAttributeA* addMe ) +{ + assert( !Find( addMe->Name() ) ); // Shouldn't be multiply adding to the set. + + addMe->next = &sentinel; + addMe->prev = sentinel.prev; + + sentinel.prev->next = addMe; + sentinel.prev = addMe; +} + +void TiXmlAttributeSetA::Remove( TiXmlAttributeA* removeMe ) +{ + TiXmlAttributeA* node; + + for( node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( node == removeMe ) + { + node->prev->next = node->next; + node->next->prev = node->prev; + node->next = 0; + node->prev = 0; + return; + } + } + assert( 0 ); // we tried to remove a non-linked attribute. +} + +TiXmlAttributeA* TiXmlAttributeSetA::Find( const char * name ) const +{ + TiXmlAttributeA* node; + + for( node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( node->name == name ) + return node; + } + return 0; +} + + +#ifdef TIXMLA_USE_STL +TIXMLA_ISTREAM & operator >> (TIXMLA_ISTREAM & in, TiXmlNodeA & base) +{ + TIXMLA_STRING tag; + tag.reserve( 8 * 1000 ); + base.StreamIn( &in, &tag ); + + base.Parse( tag.c_str(), 0 ); + return in; +} +#endif + + +TIXMLA_OSTREAM & operator<< (TIXMLA_OSTREAM & out, const TiXmlNodeA & base) +{ + base.StreamOut (& out); + return out; +} + + +#ifdef TIXMLA_USE_STL +std::string & operator<< (std::string& out, const TiXmlNodeA& base ) +{ + std::ostringstream os_stream( std::ostringstream::out ); + base.StreamOut( &os_stream ); + + out.append( os_stream.str() ); + return out; +} +#endif + + +TiXmlHandleA TiXmlHandleA::FirstChild() const +{ + if ( node ) + { + TiXmlNodeA* child = node->FirstChild(); + if ( child ) + return TiXmlHandleA( child ); + } + return TiXmlHandleA( 0 ); +} + + +TiXmlHandleA TiXmlHandleA::FirstChild( const char * value ) const +{ + if ( node ) + { + TiXmlNodeA* child = node->FirstChild( value ); + if ( child ) + return TiXmlHandleA( child ); + } + return TiXmlHandleA( 0 ); +} + + +TiXmlHandleA TiXmlHandleA::FirstChildElement() const +{ + if ( node ) + { + TiXmlElementA* child = node->FirstChildElement(); + if ( child ) + return TiXmlHandleA( child ); + } + return TiXmlHandleA( 0 ); +} + + +TiXmlHandleA TiXmlHandleA::FirstChildElement( const char * value ) const +{ + if ( node ) + { + TiXmlElementA* child = node->FirstChildElement( value ); + if ( child ) + return TiXmlHandleA( child ); + } + return TiXmlHandleA( 0 ); +} + +TiXmlHandleA TiXmlHandleA::Child( int count ) const +{ + if ( node ) + { + int i; + TiXmlNodeA* child = node->FirstChild(); + for ( i=0; + child && iNextSibling(), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandleA( child ); + } + return TiXmlHandleA( 0 ); +} + + +TiXmlHandleA TiXmlHandleA::Child( const char* value, int count ) const +{ + if ( node ) + { + int i; + TiXmlNodeA* child = node->FirstChild( value ); + for ( i=0; + child && iNextSibling( value ), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandleA( child ); + } + return TiXmlHandleA( 0 ); +} + + +TiXmlHandleA TiXmlHandleA::ChildElement( int count ) const +{ + if ( node ) + { + int i; + TiXmlElementA* child = node->FirstChildElement(); + for ( i=0; + child && iNextSiblingElement(), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandleA( child ); + } + return TiXmlHandleA( 0 ); +} + + +TiXmlHandleA TiXmlHandleA::ChildElement( const char* value, int count ) const +{ + if ( node ) + { + int i; + TiXmlElementA* child = node->FirstChildElement( value ); + for ( i=0; + child && iNextSiblingElement( value ), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandleA( child ); + } + return TiXmlHandleA( 0 ); +} diff --git a/PowerEditor/src/TinyXml/tinyXmlA/tinyxmlA.h b/PowerEditor/src/TinyXml/tinyXmlA/tinyxmlA.h new file mode 100644 index 00000000..50cd395a --- /dev/null +++ b/PowerEditor/src/TinyXml/tinyXmlA/tinyxmlA.h @@ -0,0 +1,1263 @@ +/* +www.sourceforge.net/projects/tinyxml +Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + + +#ifndef TINYXMLA_INCLUDED +#define TINYXMLA_INCLUDED + +#ifdef _MSC_VER +#pragma warning( disable : 4530 ) +#pragma warning( disable : 4786 ) +#endif + +#include +#include +#include +#include +#include +#include +#include "Common.h" + +// Help out windows: +#if defined( _DEBUG ) && !defined( DEBUG ) +#define DEBUG +#endif + +#if defined( DEBUG ) && defined( _MSC_VER ) +#include +#define TIXMLA_LOG OutputDebugString +#else +#define TIXMLA_LOG printf +#endif + +#ifdef TIXMLA_USE_STL + #include + #include + //#include + #define TIXMLA_STRING std::string + #define TIXMLA_ISTREAM std::istream + #define TIXMLA_OSTREAM std::ostream +#else + #include "tinystrA.h" + #define TIXMLA_STRING TiXmlStringA + #define TIXMLA_OSTREAM TiXmlOutStreamA +#endif + +class TiXmlDocumentA; +class TiXmlElementA; +class TiXmlCommentA; +class TiXmlUnknownA; +class TiXmlAttributeA; +class TiXmlTextA; +class TiXmlDeclarationA; + +class TiXmlParsingDataA; + +/* Internal structure for tracking location of items + in the XML file. +*/ +struct TiXmlCursorA +{ + TiXmlCursorA() { Clear(); } + void Clear() { row = col = -1; } + + int row; // 0 based. + int col; // 0 based. +}; + + +// Only used by Attribute::Query functions +enum +{ + TIXMLA_SUCCESS, + TIXMLA_NO_ATTRIBUTE, + TIXMLA_WRONG_TYPE +}; + +/** TiXmlBaseA is a base class for every class in TinyXml. + It does little except to establish that TinyXml classes + can be printed and provide some utility functions. + + In XML, the document and elements can contain + other elements and other types of nodes. + + @verbatim + A Document can contain: Element (container or leaf) + Comment (leaf) + Unknown (leaf) + Declaration( leaf ) + + An Element can contain: Element (container or leaf) + Text (leaf) + Attributes (not on tree) + Comment (leaf) + Unknown (leaf) + + A Decleration contains: Attributes (not on tree) + @endverbatim +*/ +class TiXmlBaseA +{ + friend class TiXmlNodeA; + friend class TiXmlElementA; + friend class TiXmlDocumentA; + +public: + TiXmlBaseA() {} + virtual ~TiXmlBaseA() {} + + /** All TinyXml classes can print themselves to a filestream. + This is a formatted print, and will insert tabs and newlines. + + (For an unformatted stream, use the << operator.) + */ + virtual void Print( FILE* cfile, int depth ) const = 0; + + /** The world does not agree on whether white space should be kept or + not. In order to make everyone happy, these global, static functions + are provided to set whether or not TinyXml will condense all white space + into a single space or not. The default is to condense. Note changing this + values is not thread safe. + */ + static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } + + /// Return the current white space setting. + static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } + + /** Return the position, in the original source file, of this node or attribute. + The row and column are 1-based. (That is the first row and first column is + 1,1). If the returns values are 0 or less, then the parser does not have + a row and column value. + + Generally, the row and column value will be set when the TiXmlDocumentA::Load(), + TiXmlDocumentA::LoadFile(), or any TiXmlNodeA::Parse() is called. It will NOT be set + when the DOM was created from operator>>. + + The values reflect the initial load. Once the DOM is modified programmatically + (by adding or changing nodes and attributes) the new values will NOT update to + reflect changes in the document. + + There is a minor performance cost to computing the row and column. Computation + can be disabled if TiXmlDocumentA::SetTabSize() is called with 0 as the value. + + @sa TiXmlDocumentA::SetTabSize() + */ + int Row() const { return location.row + 1; } + int Column() const { return location.col + 1; } ///< See Row() + +protected: + // See STL_STRING_BUG + // Utility class to overcome a bug. + class StringToBuffer + { + public: + StringToBuffer( const TIXMLA_STRING& str ); + ~StringToBuffer(); + char* buffer; + }; + + static const char* SkipWhiteSpace( const char* ); + inline static bool IsWhiteSpace( int c ) { return ( isspace( c ) || c == '\n' || c == '\r' ); } + + virtual void StreamOut (TIXMLA_OSTREAM *) const = 0; + + #ifdef TIXMLA_USE_STL + static bool StreamWhiteSpace( TIXMLA_ISTREAM * in, TIXMLA_STRING * tag ); + static bool StreamTo( TIXMLA_ISTREAM * in, int character, TIXMLA_STRING * tag ); + #endif + + /* Reads an XML name into the string provided. Returns + a pointer just past the last character of the name, + or 0 if the function has an error. + */ + static const char* ReadName( const char* p, TIXMLA_STRING* name ); + + /* Reads text. Returns a pointer past the given end tag. + Wickedly complex options, but it keeps the (sensitive) code in one place. + */ + static const char* ReadText( const char* in, // where to start + TIXMLA_STRING* text, // the string read + bool ignoreWhiteSpace, // whether to keep the white space + const char* endTag, // what ends this text + bool ignoreCase ); // whether to ignore case in the end tag + + virtual const char* Parse( const char* p, TiXmlParsingDataA* data ) = 0; + + // If an entity has been found, transform it into a character. + static const char* GetEntity( const char* in, char* value ); + + // Get a character, while interpreting entities. + inline static const char* GetChar( const char* p, char* _value ) + { + assert( p ); + if ( *p == '&' ) + { + return GetEntity( p, _value ); + } + else + { + *_value = *p; + return p+1; + } + } + + // Puts a string to a stream, expanding entities as it goes. + // Note this should not contian the '<', '>', etc, or they will be transformed into entities! + static void PutString( const TIXMLA_STRING& str, TIXMLA_OSTREAM* out ); + + static void PutString( const TIXMLA_STRING& str, TIXMLA_STRING* out ); + + // Return true if the next characters in the stream are any of the endTag sequences. + static bool StringEqual( const char* p, + const char* endTag, + bool ignoreCase ); + + + enum + { + TIXMLA_NO_ERROR = 0, + TIXMLA_ERROR, + TIXMLA_ERROR_OPENING_FILE, + TIXMLA_ERROR_OUT_OF_MEMORY, + TIXMLA_ERROR_PARSING_ELEMENT, + TIXMLA_ERROR_FAILED_TO_READ_ELEMENT_NAME, + TIXMLA_ERROR_READING_ELEMENT_VALUE, + TIXMLA_ERROR_READING_ATTRIBUTES, + TIXMLA_ERROR_PARSING_EMPTY, + TIXMLA_ERROR_READING_END_TAG, + TIXMLA_ERROR_PARSING_UNKNOWN, + TIXMLA_ERROR_PARSING_COMMENT, + TIXMLA_ERROR_PARSING_DECLARATION, + TIXMLA_ERROR_DOCUMENT_EMPTY, + + TIXMLA_ERROR_STRING_COUNT + }; + static const char* errorString[ TIXMLA_ERROR_STRING_COUNT ]; + + TiXmlCursorA location; + +private: + struct Entity + { + const char* str; + unsigned int strLength; + char chr; + }; + enum + { + NUM_ENTITY = 5, + MAX_ENTITY_LENGTH = 6 + + }; + static Entity entity[ NUM_ENTITY ]; + static bool condenseWhiteSpace; +}; + + +/** The parent class for everything in the Document Object Model. + (Except for attributes). + Nodes have siblings, a parent, and children. A node can be + in a document, or stand on its own. The type of a TiXmlNodeA + can be queried, and it can be cast to its more defined type. +*/ +class TiXmlNodeA : public TiXmlBaseA +{ + friend class TiXmlDocumentA; + friend class TiXmlElementA; + +public: + #ifdef TIXMLA_USE_STL + + /** An input stream operator, for every class. Tolerant of newlines and + formatting, but doesn't expect them. + */ + friend std::istream& operator >> (std::istream& in, TiXmlNodeA& base); + + /** An output stream operator, for every class. Note that this outputs + without any newlines or formatting, as opposed to Print(), which + includes tabs and new lines. + + The operator<< and operator>> are not completely symmetric. Writing + a node to a stream is very well defined. You'll get a nice stream + of output, without any extra whitespace or newlines. + + But reading is not as well defined. (As it always is.) If you create + a TiXmlElementA (for example) and read that from an input stream, + the text needs to define an element or junk will result. This is + true of all input streams, but it's worth keeping in mind. + + A TiXmlDocumentA will read nodes until it reads a root element, and + all the children of that root element. + */ + friend std::ostream& operator<< (std::ostream& out, const TiXmlNodeA& base); + + /// Appends the XML node or attribute to a std::string. + friend std::string& operator<< (std::string& out, const TiXmlNodeA& base ); + + #else + // Used internally, not part of the public API. + friend TIXMLA_OSTREAM& operator<< (TIXMLA_OSTREAM& out, const TiXmlNodeA& base); + #endif + + /** The types of XML nodes supported by TinyXml. (All the + unsupported types are picked up by UNKNOWN.) + */ + enum NodeType + { + DOCUMENT, + ELEMENT, + COMMENT, + UNKNOWN, + TEXT, + DECLARATION, + TYPECOUNT + }; + + virtual ~TiXmlNodeA(); + + /** The meaning of 'value' changes for the specific type of + TiXmlNodeA. + @verbatim + Document: filename of the xml file + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text string + @endverbatim + + The subclasses will wrap this function. + */ + const char * Value() const { return value.c_str (); } + + /** Changes the value of the node. Defined as: + @verbatim + Document: filename of the xml file + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text string + @endverbatim + */ + void SetValue(const char * _value) { value = _value;} + + #ifdef TIXMLA_USE_STL + /// STL std::string form. + void SetValue( const std::string& _value ) + { + StringToBuffer buf( _value ); + SetValue( buf.buffer ? buf.buffer : "" ); + } + #endif + + /// Delete all the children of this node. Does not affect 'this'. + void Clear(); + + /// One step up the DOM. + TiXmlNodeA* Parent() const { return parent; } + + TiXmlNodeA* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. + TiXmlNodeA* FirstChild( const char * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. + + TiXmlNodeA* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. + TiXmlNodeA* LastChild( const char * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. + + #ifdef TIXMLA_USE_STL + TiXmlNodeA* FirstChild( const std::string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::string form. + TiXmlNodeA* LastChild( const std::string& _value ) const { return LastChild (_value.c_str ()); } ///< STL std::string form. + #endif + + /** An alternate way to walk the children of a node. + One way to iterate over nodes is: + @verbatim + for( child = parent->FirstChild(); child; child = child->NextSibling() ) + @endverbatim + + IterateChildren does the same thing with the syntax: + @verbatim + child = 0; + while( child = parent->IterateChildren( child ) ) + @endverbatim + + IterateChildren takes the previous child as input and finds + the next one. If the previous child is null, it returns the + first. IterateChildren will return null when done. + */ + TiXmlNodeA* IterateChildren( TiXmlNodeA* previous ) const; + + /// This flavor of IterateChildren searches for children with a particular 'value' + TiXmlNodeA* IterateChildren( const char * value, TiXmlNodeA* previous ) const; + + #ifdef TIXMLA_USE_STL + TiXmlNodeA* IterateChildren( const std::string& _value, TiXmlNodeA* previous ) const { return IterateChildren (_value.c_str (), previous); } ///< STL std::string form. + #endif + + /** Add a new node related to this. Adds a child past the LastChild. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNodeA* InsertEndChild( const TiXmlNodeA& addThis ); + + + /** Add a new node related to this. Adds a child past the LastChild. + + NOTE: the node to be added is passed by pointer, and will be + henceforth owned (and deleted) by tinyXml. This method is efficient + and avoids an extra copy, but should be used with care as it + uses a different memory model than the other insert functions. + + @sa InsertEndChild + */ + TiXmlNodeA* LinkEndChild( TiXmlNodeA* addThis ); + + /** Add a new node related to this. Adds a child before the specified child. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNodeA* InsertBeforeChild( TiXmlNodeA* beforeThis, const TiXmlNodeA& addThis ); + + /** Add a new node related to this. Adds a child after the specified child. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNodeA* InsertAfterChild( TiXmlNodeA* afterThis, const TiXmlNodeA& addThis ); + + /** Replace a child of this node. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNodeA* ReplaceChild( TiXmlNodeA* replaceThis, const TiXmlNodeA& withThis ); + + /// Delete a child of this node. + bool RemoveChild( TiXmlNodeA* removeThis ); + + /// Navigate to a sibling node. + TiXmlNodeA* PreviousSibling() const { return prev; } + + /// Navigate to a sibling node. + TiXmlNodeA* PreviousSibling( const char * ) const; + + #ifdef TIXMLA_USE_STL + TiXmlNodeA* PreviousSibling( const std::string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::string form. + TiXmlNodeA* NextSibling( const std::string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::string form. + #endif + + /// Navigate to a sibling node. + TiXmlNodeA* NextSibling() const { return next; } + + /// Navigate to a sibling node with the given 'value'. + TiXmlNodeA* NextSibling( const char * ) const; + + /** Convenience function to get through elements. + Calls NextSibling and ToElement. Will skip all non-Element + nodes. Returns 0 if there is not another element. + */ + TiXmlElementA* NextSiblingElement() const; + + /** Convenience function to get through elements. + Calls NextSibling and ToElement. Will skip all non-Element + nodes. Returns 0 if there is not another element. + */ + TiXmlElementA* NextSiblingElement( const char * ) const; + + #ifdef TIXMLA_USE_STL + TiXmlElementA* NextSiblingElement( const std::string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::string form. + #endif + + /// Convenience function to get through elements. + TiXmlElementA* FirstChildElement() const; + + /// Convenience function to get through elements. + TiXmlElementA* FirstChildElement( const char * value ) const; + + #ifdef TIXMLA_USE_STL + TiXmlElementA* FirstChildElement( const std::string& _value ) const { return FirstChildElement (_value.c_str ()); } ///< STL std::string form. + #endif + + /** Query the type (as an enumerated value, above) of this node. + The possible types are: DOCUMENT, ELEMENT, COMMENT, + UNKNOWN, TEXT, and DECLARATION. + */ + virtual int Type() const { return type; } + + /** Return a pointer to the Document this node lives in. + Returns null if not in a document. + */ + TiXmlDocumentA* GetDocument() const; + + /// Returns true if this node has no children. + bool NoChildren() const { return !firstChild; } + + TiXmlDocumentA* ToDocument() const { return ( this && type == DOCUMENT ) ? (TiXmlDocumentA*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlElementA* ToElement() const { return ( this && type == ELEMENT ) ? (TiXmlElementA*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlCommentA* ToComment() const { return ( this && type == COMMENT ) ? (TiXmlCommentA*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlUnknownA* ToUnknown() const { return ( this && type == UNKNOWN ) ? (TiXmlUnknownA*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlTextA* ToText() const { return ( this && type == TEXT ) ? (TiXmlTextA*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlDeclarationA* ToDeclaration() const { return ( this && type == DECLARATION ) ? (TiXmlDeclarationA*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + + virtual TiXmlNodeA* Clone() const = 0; + + void SetUserData( void* user ) { userData = user; } + void* GetUserData() { return userData; } + +protected: + TiXmlNodeA( NodeType type ); + + #ifdef TIXMLA_USE_STL + // The real work of the input operator. + virtual void StreamIn( TIXMLA_ISTREAM* in, TIXMLA_STRING* tag ) = 0; + #endif + + // Figure out what is at *p, and parse it. Returns null if it is not an xml node. + TiXmlNodeA* Identify( const char* start ); + void CopyToClone( TiXmlNodeA* target ) const { target->SetValue (value.c_str() ); + target->userData = userData; } + + // Internal Value function returning a TIXMLA_STRING + TIXMLA_STRING SValue() const { return value ; } + + TiXmlNodeA* parent; + NodeType type; + + TiXmlNodeA* firstChild; + TiXmlNodeA* lastChild; + + TIXMLA_STRING value; + + TiXmlNodeA* prev; + TiXmlNodeA* next; + void* userData; +}; + + +/** An attribute is a name-value pair. Elements have an arbitrary + number of attributes, each with a unique name. + + @note The attributes are not TiXmlNodes, since they are not + part of the tinyXML document object model. There are other + suggested ways to look at this problem. +*/ +class TiXmlAttributeA : public TiXmlBaseA +{ + friend class TiXmlAttributeSetA; + +public: + /// Construct an empty attribute. + TiXmlAttributeA() + { + document = 0; + prev = next = 0; + } + + #ifdef TIXMLA_USE_STL + /// std::string constructor. + TiXmlAttributeA( const std::string& _name, const std::string& _value ) + { + name = _name; + value = _value; + document = 0; + prev = next = 0; + } + #endif + + /// Construct an attribute with a name and value. + TiXmlAttributeA( const char * _name, const char * _value ) + { + name = _name; + value = _value; + document = 0; + prev = next = 0; + } + + const char* Name() const { return name.c_str (); } ///< Return the name of this attribute. + const char* Value() const { return value.c_str (); } ///< Return the value of this attribute. + const int IntValue() const; ///< Return the value of this attribute, converted to an integer. + const double DoubleValue() const; ///< Return the value of this attribute, converted to a double. + + /** QueryIntValue examines the value string. It is an alternative to the + IntValue() method with richer error checking. + If the value is an integer, it is stored in 'value' and + the call returns TIXMLA_SUCCESS. If it is not + an integer, it returns TIXMLA_WRONG_TYPE. + + A specialized but useful call. Note that for success it returns 0, + which is the opposite of almost all other TinyXml calls. + */ + int QueryIntValue( int* value ) const; + /// QueryDoubleValue examines the value string. See QueryIntValue(). + int QueryDoubleValue( double* value ) const; + + void SetName( const char* _name ) { name = _name; } ///< Set the name of this attribute. + void SetValue( const char* _value ) { value = _value; } ///< Set the value. + + void SetIntValue( int value ); ///< Set the value from an integer. + void SetDoubleValue( double value ); ///< Set the value from a double. + + #ifdef TIXMLA_USE_STL + /// STL std::string form. + void SetName( const std::string& _name ) + { + StringToBuffer buf( _name ); + SetName ( buf.buffer ? buf.buffer : "error" ); + } + /// STL std::string form. + void SetValue( const std::string& _value ) + { + StringToBuffer buf( _value ); + SetValue( buf.buffer ? buf.buffer : "error" ); + } + #endif + + /// Get the next sibling attribute in the DOM. Returns null at end. + TiXmlAttributeA* Next() const; + /// Get the previous sibling attribute in the DOM. Returns null at beginning. + TiXmlAttributeA* Previous() const; + + bool operator==( const TiXmlAttributeA& rhs ) const { return rhs.name == name; } + bool operator<( const TiXmlAttributeA& rhs ) const { return name < rhs.name; } + bool operator>( const TiXmlAttributeA& rhs ) const { return name > rhs.name; } + + /* [internal use] + Attribtue parsing starts: first letter of the name + returns: the next char after the value end quote + */ + virtual const char* Parse( const char* p, TiXmlParsingDataA* data ); + + // [internal use] + virtual void Print( FILE* cfile, int depth ) const; + + virtual void StreamOut( TIXMLA_OSTREAM * out ) const; + // [internal use] + // Set the document pointer so the attribute can report errors. + void SetDocument( TiXmlDocumentA* doc ) { document = doc; } + +private: + TiXmlDocumentA* document; // A pointer back to a document, for error reporting. + TIXMLA_STRING name; + TIXMLA_STRING value; + TiXmlAttributeA* prev; + TiXmlAttributeA* next; +}; + + +/* A class used to manage a group of attributes. + It is only used internally, both by the ELEMENT and the DECLARATION. + + The set can be changed transparent to the Element and Declaration + classes that use it, but NOT transparent to the Attribute + which has to implement a next() and previous() method. Which makes + it a bit problematic and prevents the use of STL. + + This version is implemented with circular lists because: + - I like circular lists + - it demonstrates some independence from the (typical) doubly linked list. +*/ +class TiXmlAttributeSetA +{ +public: + TiXmlAttributeSetA(); + ~TiXmlAttributeSetA(); + + void Add( TiXmlAttributeA* attribute ); + void Remove( TiXmlAttributeA* attribute ); + + TiXmlAttributeA* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } + TiXmlAttributeA* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } + TiXmlAttributeA* Find( const char * name ) const; + +private: + TiXmlAttributeA sentinel; +}; + + +/** The element is a container class. It has a value, the element name, + and can contain other elements, text, comments, and unknowns. + Elements also contain an arbitrary number of attributes. +*/ +class TiXmlElementA : public TiXmlNodeA +{ +public: + /// Construct an element. + TiXmlElementA (const char * in_value); + + #ifdef TIXMLA_USE_STL + /// std::string constructor. + TiXmlElementA( const std::string& _value ) : TiXmlNodeA( TiXmlNodeA::ELEMENT ) + { + firstChild = lastChild = 0; + value = _value; + } + #endif + + virtual ~TiXmlElementA(); + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + */ + const char* Attribute( const char* name ) const; + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + If the attribute exists and can be converted to an integer, + the integer value will be put in the return 'i', if 'i' + is non-null. + */ + const char* Attribute( const char* name, int* i ) const; + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + If the attribute exists and can be converted to an double, + the double value will be put in the return 'd', if 'd' + is non-null. + */ + const char* Attribute( const char* name, double* d ) const; + + /** QueryIntAttribute examines the attribute - it is an alternative to the + Attribute() method with richer error checking. + If the attribute is an integer, it is stored in 'value' and + the call returns TIXMLA_SUCCESS. If it is not + an integer, it returns TIXMLA_WRONG_TYPE. If the attribute + does not exist, then TIXMLA_NO_ATTRIBUTE is returned. + */ + int QueryIntAttribute( const char* name, int* value ) const; + /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). + int QueryDoubleAttribute( const char* name, double* value ) const; + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetAttribute( const char* name, const char * value ); + + #ifdef TIXMLA_USE_STL + const char* Attribute( const std::string& name ) const { return Attribute( name.c_str() ); } + const char* Attribute( const std::string& name, int* i ) const { return Attribute( name.c_str(), i ); } + + /// STL std::string form. + void SetAttribute( const std::string& name, const std::string& _value ) + { + StringToBuffer n( name ); + StringToBuffer v( _value ); + if ( n.buffer && v.buffer ) + SetAttribute (n.buffer, v.buffer ); + } + ///< STL std::string form. + void SetAttribute( const std::string& name, int _value ) + { + StringToBuffer n( name ); + if ( n.buffer ) + SetAttribute (n.buffer, _value); + } + #endif + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetAttribute( const char * name, int value ); + + /** Deletes an attribute with the given name. + */ + void RemoveAttribute( const char * name ); + #ifdef TIXMLA_USE_STL + void RemoveAttribute( const std::string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::string form. + #endif + + TiXmlAttributeA* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. + TiXmlAttributeA* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. + + // [internal use] Creates a new Element and returs it. + virtual TiXmlNodeA* Clone() const; + // [internal use] + + virtual void Print( FILE* cfile, int depth ) const; + +protected: + + // Used to be public [internal use] + #ifdef TIXMLA_USE_STL + virtual void StreamIn( TIXMLA_ISTREAM * in, TIXMLA_STRING * tag ); + #endif + virtual void StreamOut( TIXMLA_OSTREAM * out ) const; + + /* [internal use] + Attribtue parsing starts: next char past '<' + returns: next char past '>' + */ + virtual const char* Parse( const char* p, TiXmlParsingDataA* data ); + + /* [internal use] + Reads the "value" of the element -- another element, or text. + This should terminate with the current end tag. + */ + const char* ReadValue( const char* in, TiXmlParsingDataA* prevData ); + +private: + TiXmlAttributeSetA attributeSet; +}; + + +/** An XML comment. +*/ +class TiXmlCommentA : public TiXmlNodeA +{ +public: + /// Constructs an empty comment. + TiXmlCommentA() : TiXmlNodeA( TiXmlNodeA::COMMENT ) {} + virtual ~TiXmlCommentA() {} + + // [internal use] Creates a new Element and returs it. + virtual TiXmlNodeA* Clone() const; + // [internal use] + virtual void Print( FILE* cfile, int depth ) const; +protected: + // used to be public + #ifdef TIXMLA_USE_STL + virtual void StreamIn( TIXMLA_ISTREAM * in, TIXMLA_STRING * tag ); + #endif + virtual void StreamOut( TIXMLA_OSTREAM * out ) const; + /* [internal use] + Attribtue parsing starts: at the ! of the !-- + returns: next char past '>' + */ + virtual const char* Parse( const char* p, TiXmlParsingDataA* data ); +}; + + +/** XML text. Contained in an element. +*/ +class TiXmlTextA : public TiXmlNodeA +{ + friend class TiXmlElementA; +public: + /// Constructor. + TiXmlTextA (const char * initValue) : TiXmlNodeA (TiXmlNodeA::TEXT) + { + SetValue( initValue ); + } + virtual ~TiXmlTextA() {} + + #ifdef TIXMLA_USE_STL + /// Constructor. + TiXmlTextA( const std::string& initValue ) : TiXmlNodeA (TiXmlNodeA::TEXT) + { + SetValue( initValue ); + } + #endif + + // [internal use] + virtual void Print( FILE* cfile, int depth ) const; + +protected : + // [internal use] Creates a new Element and returns it. + virtual TiXmlNodeA* Clone() const; + virtual void StreamOut ( TIXMLA_OSTREAM * out ) const; + // [internal use] + bool Blank() const; // returns true if all white space and new lines + /* [internal use] + Attribtue parsing starts: First char of the text + returns: next char past '>' + */ + virtual const char* Parse( const char* p, TiXmlParsingDataA* data ); + // [internal use] + #ifdef TIXMLA_USE_STL + virtual void StreamIn( TIXMLA_ISTREAM * in, TIXMLA_STRING * tag ); + #endif +}; + + +/** In correct XML the declaration is the first entry in the file. + @verbatim + + @endverbatim + + TinyXml will happily read or write files without a declaration, + however. There are 3 possible attributes to the declaration: + version, encoding, and standalone. + + Note: In this version of the code, the attributes are + handled as special cases, not generic attributes, simply + because there can only be at most 3 and they are always the same. +*/ +class TiXmlDeclarationA : public TiXmlNodeA +{ +public: + /// Construct an empty declaration. + TiXmlDeclarationA() : TiXmlNodeA( TiXmlNodeA::DECLARATION ) {} + +#ifdef TIXMLA_USE_STL + /// Constructor. + TiXmlDeclarationA( const std::string& _version, + const std::string& _encoding, + const std::string& _standalone ) + : TiXmlNodeA( TiXmlNodeA::DECLARATION ) + { + version = _version; + encoding = _encoding; + standalone = _standalone; + } +#endif + + /// Construct. + TiXmlDeclarationA( const char* _version, + const char* _encoding, + const char* _standalone ); + + virtual ~TiXmlDeclarationA() {} + + /// Version. Will return empty if none was found. + const char * Version() const { return version.c_str (); } + /// Encoding. Will return empty if none was found. + const char * Encoding() const { return encoding.c_str (); } + /// Is this a standalone document? + const char * Standalone() const { return standalone.c_str (); } + + // [internal use] Creates a new Element and returs it. + virtual TiXmlNodeA* Clone() const; + // [internal use] + virtual void Print( FILE* cfile, int depth ) const; + +protected: + // used to be public + #ifdef TIXMLA_USE_STL + virtual void StreamIn( TIXMLA_ISTREAM * in, TIXMLA_STRING * tag ); + #endif + virtual void StreamOut ( TIXMLA_OSTREAM * out) const; + // [internal use] + // Attribtue parsing starts: next char past '<' + // returns: next char past '>' + + virtual const char* Parse( const char* p, TiXmlParsingDataA* data ); + +private: + TIXMLA_STRING version; + TIXMLA_STRING encoding; + TIXMLA_STRING standalone; +}; + + +/** Any tag that tinyXml doesn't recognize is saved as an + unknown. It is a tag of text, but should not be modified. + It will be written back to the XML, unchanged, when the file + is saved. +*/ +class TiXmlUnknownA : public TiXmlNodeA +{ +public: + TiXmlUnknownA() : TiXmlNodeA( TiXmlNodeA::UNKNOWN ) {} + virtual ~TiXmlUnknownA() {} + + // [internal use] + virtual TiXmlNodeA* Clone() const; + // [internal use] + virtual void Print( FILE* cfile, int depth ) const; +protected: + #ifdef TIXMLA_USE_STL + virtual void StreamIn( TIXMLA_ISTREAM * in, TIXMLA_STRING * tag ); + #endif + virtual void StreamOut ( TIXMLA_OSTREAM * out ) const; + /* [internal use] + Attribute parsing starts: First char of the text + returns: next char past '>' + */ + virtual const char* Parse( const char* p, TiXmlParsingDataA* data ); +}; + + +/** Always the top level node. A document binds together all the + XML pieces. It can be saved, loaded, and printed to the screen. + The 'value' of a document node is the xml file name. +*/ +class TiXmlDocumentA : public TiXmlNodeA +{ +public: + /// Create an empty document, that has no name. + TiXmlDocumentA(); + /// Create a document with a name. The name of the document is also the filename of the xml. + TiXmlDocumentA( const char * documentName ); + + #ifdef TIXMLA_USE_STL + /// Constructor. + TiXmlDocumentA( const std::string& documentName ) : + TiXmlNodeA( TiXmlNodeA::DOCUMENT ) + { + value = documentName; + error = false; + } + #endif + + virtual ~TiXmlDocumentA() {} + + /** Load a file using the current document value. + Returns true if successful. Will delete any existing + document data before loading. + */ + bool LoadFile(); + /// Save a file using the current document value. Returns true if successful. + bool SaveFile() const; + /// Load a file using the given filename. Returns true if successful. + bool LoadFile( const char * filename ); + /// Save a file using the given filename. Returns true if successful. + bool SaveFile( const char * filename ) const; + + bool LoadUnicodeFilePath(const TCHAR* filename); + + #ifdef TIXMLA_USE_STL + bool LoadFile( const std::string& filename ) ///< STL std::string version. + { + StringToBuffer f( filename ); + return ( f.buffer && LoadFile( f.buffer )); + } + bool SaveFile( const std::string& filename ) const ///< STL std::string version. + { + StringToBuffer f( filename ); + return ( f.buffer && SaveFile( f.buffer )); + } + #endif + + /** Parse the given null terminated block of xml data. + */ + virtual const char* Parse( const char* p, TiXmlParsingDataA* data = 0 ); + + /** Get the root element -- the only top level element -- of the document. + In well formed XML, there should only be one. TinyXml is tolerant of + multiple elements at the document level. + */ + TiXmlElementA* RootElement() const { return FirstChildElement(); } + + /** If an error occurs, Error will be set to true. Also, + - The ErrorId() will contain the integer identifier of the error (not generally useful) + - The ErrorDesc() method will return the name of the error. (very useful) + - The ErrorRow() and ErrorCol() will return the location of the error (if known) + */ + bool Error() const { return error; } + + /// Contains a textual (english) description of the error if one occurs. + const char * ErrorDesc() const { return errorDesc.c_str (); } + + /** Generally, you probably want the error string ( ErrorDesc() ). But if you + prefer the ErrorId, this function will fetch it. + */ + const int ErrorId() const { return errorId; } + + /** Returns the location (if known) of the error. The first column is column 1, + and the first row is row 1. A value of 0 means the row and column wasn't applicable + (memory errors, for example, have no row/column) or the parser lost the error. (An + error in the error reporting, in that case.) + + @sa SetTabSize, Row, Column + */ + int ErrorRow() { return errorLocation.row+1; } + int ErrorCol() { return errorLocation.col+1; } ///< The column where the error occured. See ErrorRow() + + /** By calling this method, with a tab size + greater than 0, the row and column of each node and attribute is stored + when the file is loaded. Very useful for tracking the DOM back in to + the source file. + + The tab size is required for calculating the location of nodes. If not + set, the default of 4 is used. The tabsize is set per document. Setting + the tabsize to 0 disables row/column tracking. + + Note that row and column tracking is not supported when using operator>>. + + The tab size needs to be enabled before the parse or load. Correct usage: + @verbatim + TiXmlDocumentA doc; + doc.SetTabSize( 8 ); + doc.Load( "myfile.xml" ); + @endverbatim + + @sa Row, Column + */ + void SetTabSize( int _tabsize ) { tabsize = _tabsize; } + + int TabSize() const { return tabsize; } + + /** If you have handled the error, it can be reset with this call. The error + state is automatically cleared if you Parse a new XML block. + */ + void ClearError() { error = false; + errorId = 0; + errorDesc = ""; + errorLocation.row = errorLocation.col = 0; + //errorLocation.last = 0; + } + + /** Dump the document to standard out. */ + void Print() const { Print( stdout, 0 ); } + + // [internal use] + virtual void Print( FILE* cfile, int depth = 0 ) const; + // [internal use] + void SetError( int err, const char* errorLocation, TiXmlParsingDataA* prevData ); + +protected : + virtual void StreamOut ( TIXMLA_OSTREAM * out) const; + // [internal use] + virtual TiXmlNodeA* Clone() const; + #ifdef TIXMLA_USE_STL + virtual void StreamIn( TIXMLA_ISTREAM * in, TIXMLA_STRING * tag ); + #endif + +private: + bool error; + int errorId; + TIXMLA_STRING errorDesc; + int tabsize; + TiXmlCursorA errorLocation; +}; + + +/** + A TiXmlHandleA is a class that wraps a node pointer with null checks; this is + an incredibly useful thing. Note that TiXmlHandleA is not part of the TinyXml + DOM structure. It is a separate utility class. + + Take an example: + @verbatim + + + + + + + @endverbatim + + Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very + easy to write a *lot* of code that looks like: + + @verbatim + TiXmlElementA* root = document.FirstChildElement( "Document" ); + if ( root ) + { + TiXmlElementA* element = root->FirstChildElement( "Element" ); + if ( element ) + { + TiXmlElementA* child = element->FirstChildElement( "Child" ); + if ( child ) + { + TiXmlElementA* child2 = child->NextSiblingElement( "Child" ); + if ( child2 ) + { + // Finally do something useful. + @endverbatim + + And that doesn't even cover "else" cases. TiXmlHandleA addresses the verbosity + of such code. A TiXmlHandleA checks for null pointers so it is perfectly safe + and correct to use: + + @verbatim + TiXmlHandleA docHandle( &document ); + TiXmlElementA* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).Element(); + if ( child2 ) + { + // do something useful + @endverbatim + + Which is MUCH more concise and useful. + + It is also safe to copy handles - internally they are nothing more than node pointers. + @verbatim + TiXmlHandleA handleCopy = handle; + @endverbatim + + What they should not be used for is iteration: + + @verbatim + int i=0; + while ( true ) + { + TiXmlElementA* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).Element(); + if ( !child ) + break; + // do something + ++i; + } + @endverbatim + + It seems reasonable, but it is in fact two embedded while loops. The Child method is + a linear walk to find the element, so this code would iterate much more than it needs + to. Instead, prefer: + + @verbatim + TiXmlElementA* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).Element(); + + for( child; child; child=child->NextSiblingElement() ) + { + // do something + } + @endverbatim +*/ +class TiXmlHandleA +{ +public: + /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. + TiXmlHandleA( TiXmlNodeA* node ) { this->node = node; } + /// Copy constructor + TiXmlHandleA( const TiXmlHandleA& ref ) { this->node = ref.node; } + + /// Return a handle to the first child node. + TiXmlHandleA FirstChild() const; + /// Return a handle to the first child node with the given name. + TiXmlHandleA FirstChild( const char * value ) const; + /// Return a handle to the first child element. + TiXmlHandleA FirstChildElement() const; + /// Return a handle to the first child element with the given name. + TiXmlHandleA FirstChildElement( const char * value ) const; + + /** Return a handle to the "index" child with the given name. + The first child is 0, the second 1, etc. + */ + TiXmlHandleA Child( const char* value, int index ) const; + /** Return a handle to the "index" child. + The first child is 0, the second 1, etc. + */ + TiXmlHandleA Child( int index ) const; + /** Return a handle to the "index" child element with the given name. + The first child element is 0, the second 1, etc. Note that only TiXmlElements + are indexed: other types are not counted. + */ + TiXmlHandleA ChildElement( const char* value, int index ) const; + /** Return a handle to the "index" child element. + The first child element is 0, the second 1, etc. Note that only TiXmlElements + are indexed: other types are not counted. + */ + TiXmlHandleA ChildElement( int index ) const; + + #ifdef TIXMLA_USE_STL + TiXmlHandleA FirstChild( const std::string& _value ) const { return FirstChild( _value.c_str() ); } + TiXmlHandleA FirstChildElement( const std::string& _value ) const { return FirstChildElement( _value.c_str() ); } + + TiXmlHandleA Child( const std::string& _value, int index ) const { return Child( _value.c_str(), index ); } + TiXmlHandleA ChildElement( const std::string& _value, int index ) const { return ChildElement( _value.c_str(), index ); } + #endif + + /// Return the handle as a TiXmlNodeA. This may return null. + TiXmlNodeA* Node() const { return node; } + /// Return the handle as a TiXmlElementA. This may return null. + TiXmlElementA* Element() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } + /// Return the handle as a TiXmlTextA. This may return null. + TiXmlTextA* Text() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); } + +private: + TiXmlNodeA* node; +}; + + +#endif + diff --git a/PowerEditor/src/TinyXml/tinyXmlA/tinyxmlerrorA.cpp b/PowerEditor/src/TinyXml/tinyXmlA/tinyxmlerrorA.cpp new file mode 100644 index 00000000..2efeeb4e --- /dev/null +++ b/PowerEditor/src/TinyXml/tinyXmlA/tinyxmlerrorA.cpp @@ -0,0 +1,50 @@ +/* +www.sourceforge.net/projects/tinyxml +Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#include "tinyxmlA.h" + +// The goal of the seperate error file is to make the first +// step towards localization. tinyxml (currently) only supports +// latin-1, but at least the error messages could now be translated. +// +// It also cleans up the code a bit. +// + +const char* TiXmlBaseA::errorString[ TIXMLA_ERROR_STRING_COUNT ] = +{ + "No error", + "Error", + "Failed to open file", + "Memory allocation failed.", + "Error parsing Element.", + "Failed to read Element name", + "Error reading Element value.", + "Error reading Attributes.", + "Error: empty tag.", + "Error reading end tag.", + "Error parsing Unknown.", + "Error parsing Comment.", + "Error parsing Declaration.", + "Error document empty." +}; diff --git a/PowerEditor/src/TinyXml/tinyXmlA/tinyxmlparserA.cpp b/PowerEditor/src/TinyXml/tinyXmlA/tinyxmlparserA.cpp new file mode 100644 index 00000000..1a13817d --- /dev/null +++ b/PowerEditor/src/TinyXml/tinyXmlA/tinyxmlparserA.cpp @@ -0,0 +1,1157 @@ +/* +www.sourceforge.net/projects/tinyxml +Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#include "tinyxmlA.h" +#include + +//#define DEBUG_PARSER + +// Note tha "PutString" hardcodes the same list. This +// is less flexible than it appears. Changing the entries +// or order will break putstring. +TiXmlBaseA::Entity TiXmlBaseA::entity[ NUM_ENTITY ] = +{ + { "&", 5, '&' }, + { "<", 4, '<' }, + { ">", 4, '>' }, + { """, 6, '\"' }, + { "'", 6, '\'' } +}; + + +class TiXmlParsingDataA +{ + friend class TiXmlDocumentA; + public: + //TiXmlParsingDataA( const char* now, const TiXmlParsingDataA* prevData ); + void Stamp( const char* now ); + + const TiXmlCursorA& Cursor() { return cursor; } + //void Update( const char* now ); + + private: + // Only used by the document! + TiXmlParsingDataA( const char* start, int _tabsize, int row, int col ) + { + assert( start ); + stamp = start; + tabsize = _tabsize; + cursor.row = row; + cursor.col = col; + } + + TiXmlCursorA cursor; + const char* stamp; + int tabsize; +}; + + +void TiXmlParsingDataA::Stamp( const char* now ) +{ + assert( now ); + + // Do nothing if the tabsize is 0. + if ( tabsize < 1 ) + { + return; + } + + // Get the current row, column. + int row = cursor.row; + int col = cursor.col; + const char* p = stamp; + assert( p ); + + while ( p < now ) + { + // Code contributed by Fletcher Dunn: (modified by lee) + switch (*p) { + case 0: + // We *should* never get here, but in case we do, don't + // advance past the terminating null character, ever + return; + + case '\r': + // bump down to the next line + ++row; + col = 0; + // Eat the character + ++p; + + // Check for \r\n sequence, and treat this as a single character + if (*p == '\n') { + ++p; + } + break; + + case '\n': + // bump down to the next line + ++row; + col = 0; + + // Eat the character + ++p; + + // Check for \n\r sequence, and treat this as a single + // character. (Yes, this bizarre thing does occur still + // on some arcane platforms...) + if (*p == '\r') { + ++p; + } + break; + + case '\t': + // Eat the character + ++p; + + // Skip to next tab stop + col = (col / tabsize + 1) * tabsize; + break; + + default: + // Eat the character + ++p; + + // Normal char - just advance one column + ++col; + break; + } + } + cursor.row = row; + cursor.col = col; + assert( cursor.row >= -1 ); + assert( cursor.col >= -1 ); + stamp = p; + assert( stamp ); +} + + +const char* TiXmlBaseA::SkipWhiteSpace( const char* p ) +{ + if ( !p || !*p ) + { + return 0; + } + while ( p && *p ) + { + if ( isspace( *p ) || *p == '\n' || *p =='\r' ) // Still using old rules for white space. + ++p; + else + break; + } + + return p; +} + +#ifdef TIXMLA_USE_STL +/*static*/ bool TiXmlBaseA::StreamWhiteSpace( TIXMLA_ISTREAM * in, TIXMLA_STRING * tag ) +{ + for( ;; ) + { + if ( !in->good() ) return false; + + int c = in->peek(); + if ( !IsWhiteSpace( c ) ) + return true; + *tag += in->get(); + } +} + +/*static*/ bool TiXmlBaseA::StreamTo( TIXMLA_ISTREAM * in, int character, TIXMLA_STRING * tag ) +{ + while ( in->good() ) + { + int c = in->peek(); + if ( c == character ) + return true; + + in->get(); + *tag += c; + } + return false; +} +#endif + +const char* TiXmlBaseA::ReadName( const char* p, TIXMLA_STRING * name ) +{ + *name = ""; + assert( p ); + + // Names start with letters or underscores. + // After that, they can be letters, underscores, numbers, + // hyphens, or colons. (Colons are valid ony for namespaces, + // but tinyxml can't tell namespaces from names.) + if ( p && *p + && ( isalpha( (unsigned char) *p ) || *p == '_' ) ) + { + while( p && *p + && ( isalnum( (unsigned char ) *p ) + || *p == '_' + || *p == '-' + || *p == '.' + || *p == ':' ) ) + { + (*name) += *p; + ++p; + } + return p; + } + return 0; +} + +const char* TiXmlBaseA::GetEntity( const char* p, char* value ) +{ + // Presume an entity, and pull it out. + TIXMLA_STRING ent; + int i; + + // Handle the &#x entities. + if ( strncmp( "&#x", p, 3 ) == 0 + && *(p+3) + && *(p+4) + && ( *(p+4) == ';' || *(p+5) == ';' ) + ) + { + *value = 0; + + if ( *(p+4) == ';' ) + { + // Short, one value entity. + if ( isalpha( *(p+3) ) ) *value += ( tolower( *(p+3) ) - 'a' + 10 ); + else *value += ( *(p+3) - '0' ); + + return p+5; + } + else + { + // two value entity + if ( isalpha( *(p+3) ) ) *value += ( tolower( *(p+3) ) - 'a' + 10 ) * 16; + else *value += ( *(p+3) - '0' ) * 16; + + if ( isalpha( *(p+4) ) ) *value += ( tolower( *(p+4) ) - 'a' + 10 ); + else *value += ( *(p+4) - '0' ); + + return p+6; + } + } + + // Now try to match it. + for( i=0; i" so the + // sub-tag can orient itself. + + if ( !StreamTo( in, '<', tag ) ) + { + SetError( TIXMLA_ERROR_PARSING_EMPTY, 0, 0 ); + return; + } + + while ( in->good() ) + { + int tagIndex = tag->length(); + while ( in->good() && in->peek() != '>' ) + { + int c = in->get(); + (*tag) += (char) c; + } + + if ( in->good() ) + { + // We now have something we presume to be a node of + // some sort. Identify it, and call the node to + // continue streaming. + TiXmlNodeA* node = Identify( tag->c_str() + tagIndex ); + + if ( node ) + { + node->StreamIn( in, tag ); + bool isElement = node->ToElement() != 0; + delete node; + node = 0; + + // If this is the root element, we're done. Parsing will be + // done by the >> operator. + if ( isElement ) + { + return; + } + } + else + { + SetError( TIXMLA_ERROR, 0, 0 ); + return; + } + } + } + // We should have returned sooner. + SetError( TIXMLA_ERROR, 0, 0 ); +} + +#endif + +const char* TiXmlDocumentA::Parse( const char* p, TiXmlParsingDataA* prevData ) +{ + ClearError(); + + // Parse away, at the document level. Since a document + // contains nothing but other tags, most of what happens + // here is skipping white space. + if ( !p || !*p ) + { + SetError( TIXMLA_ERROR_DOCUMENT_EMPTY, 0, 0 ); + return 0; + } + + // Note that, for a document, this needs to come + // before the while space skip, so that parsing + // starts from the pointer we are given. + location.Clear(); + if ( prevData ) + { + location.row = prevData->cursor.row; + location.col = prevData->cursor.col; + } + else + { + location.row = 0; + location.col = 0; + } + TiXmlParsingDataA data( p, TabSize(), location.row, location.col ); + location = data.Cursor(); + + p = SkipWhiteSpace( p ); + if ( !p ) + { + SetError( TIXMLA_ERROR_DOCUMENT_EMPTY, 0, 0 ); + return 0; + } + + while ( p && *p ) + { + TiXmlNodeA* node = Identify( p ); + if ( node ) + { + p = node->Parse( p, &data ); + LinkEndChild( node ); + } + else + { + break; + } + p = SkipWhiteSpace( p ); + } + + // All is well. + return p; +} + +void TiXmlDocumentA::SetError( int err, const char* pError, TiXmlParsingDataA* data ) +{ + // The first error in a chain is more accurate - don't set again! + if ( error ) + return; + + assert( err > 0 && err < TIXMLA_ERROR_STRING_COUNT ); + error = true; + errorId = err; + errorDesc = errorString[ errorId ]; + + errorLocation.Clear(); + if ( pError && data ) + { + //TiXmlParsingDataA data( pError, prevData ); + data->Stamp( pError ); + errorLocation = data->Cursor(); + } +} + + +TiXmlNodeA* TiXmlNodeA::Identify( const char* p ) +{ + TiXmlNodeA* returnNode = 0; + + p = SkipWhiteSpace( p ); + if( !p || !*p || *p != '<' ) + { + return 0; + } + + TiXmlDocumentA* doc = GetDocument(); + p = SkipWhiteSpace( p ); + + if ( !p || !*p ) + { + return 0; + } + + // What is this thing? + // - Elements start with a letter or underscore, but xml is reserved. + // - Comments: "; + + if ( !StringEqual( p, startTag, false ) ) + { + document->SetError( TIXMLA_ERROR_PARSING_COMMENT, p, data ); + return 0; + } + p += strlen( startTag ); + p = ReadText( p, &value, false, endTag, false ); + return p; +} + + +const char* TiXmlAttributeA::Parse( const char* p, TiXmlParsingDataA* data ) +{ + p = SkipWhiteSpace( p ); + if ( !p || !*p ) return 0; + + int tabsize = 4; + if ( document ) + tabsize = document->TabSize(); + +// TiXmlParsingDataA data( p, prevData ); + if ( data ) + { + data->Stamp( p ); + location = data->Cursor(); + } + // Read the name, the '=' and the value. + const char* pErr = p; + p = ReadName( p, &name ); + if ( !p || !*p ) + { + if ( document ) document->SetError( TIXMLA_ERROR_READING_ATTRIBUTES, pErr, data ); + return 0; + } + p = SkipWhiteSpace( p ); + if ( !p || !*p || *p != '=' ) + { + if ( document ) document->SetError( TIXMLA_ERROR_READING_ATTRIBUTES, p, data ); + return 0; + } + + ++p; // skip '=' + p = SkipWhiteSpace( p ); + if ( !p || !*p ) + { + if ( document ) document->SetError( TIXMLA_ERROR_READING_ATTRIBUTES, p, data ); + return 0; + } + + const char* end; + + if ( *p == '\'' ) + { + ++p; + end = "\'"; + p = ReadText( p, &value, false, end, false ); + } + else if ( *p == '"' ) + { + ++p; + end = "\""; + p = ReadText( p, &value, false, end, false ); + } + else + { + // All attribute values should be in single or double quotes. + // But this is such a common error that the parser will try + // its best, even without them. + value = ""; + while ( p && *p // existence + && !isspace( *p ) && *p != '\n' && *p != '\r' // whitespace + && *p != '/' && *p != '>' ) // tag end + { + value += *p; + ++p; + } + } + return p; +} + +#ifdef TIXMLA_USE_STL +void TiXmlTextA::StreamIn( TIXMLA_ISTREAM * in, TIXMLA_STRING * tag ) +{ + while ( in->good() ) + { + int c = in->peek(); + if ( c == '<' ) + return; + + (*tag) += c; + in->get(); + } +} +#endif + +const char* TiXmlTextA::Parse( const char* p, TiXmlParsingDataA* data ) +{ + value = ""; +// TiXmlParsingDataA data( p, prevData ); + if ( data ) + { + data->Stamp( p ); + location = data->Cursor(); + } + bool ignoreWhite = true; + + const char* end = "<"; + p = ReadText( p, &value, ignoreWhite, end, false ); + if ( p ) + return p-1; // don't truncate the '<' + return 0; +} + +#ifdef TIXMLA_USE_STL +void TiXmlDeclarationA::StreamIn( TIXMLA_ISTREAM * in, TIXMLA_STRING * tag ) +{ + while ( in->good() ) + { + int c = in->get(); + (*tag) += c; + + if ( c == '>' ) + { + // All is well. + return; + } + } +} +#endif + +const char* TiXmlDeclarationA::Parse( const char* p, TiXmlParsingDataA* data ) +{ + p = SkipWhiteSpace( p ); + // Find the beginning, find the end, and look for + // the stuff in-between. + TiXmlDocumentA* document = GetDocument(); + if ( !p || !*p || !StringEqual( p, "SetError( TIXMLA_ERROR_PARSING_DECLARATION, 0, 0 ); + return 0; + } +// TiXmlParsingDataA data( p, prevData ); + if ( data ) + { + data->Stamp( p ); + location = data->Cursor(); + } + p += 5; + + version = ""; + encoding = ""; + standalone = ""; + + while ( p && *p ) + { + if ( *p == '>' ) + { + ++p; + return p; + } + + p = SkipWhiteSpace( p ); + if ( StringEqual( p, "version", true ) ) + { + TiXmlAttributeA attrib; + p = attrib.Parse( p, data ); + version = attrib.Value(); + } + else if ( StringEqual( p, "encoding", true ) ) + { + TiXmlAttributeA attrib; + p = attrib.Parse( p, data ); + encoding = attrib.Value(); + } + else if ( StringEqual( p, "standalone", true ) ) + { + TiXmlAttributeA attrib; + p = attrib.Parse( p, data ); + standalone = attrib.Value(); + } + else + { + // Read over whatever it is. + while( p && *p && *p != '>' && !isspace( *p ) ) + ++p; + } + } + return 0; +} + +bool TiXmlTextA::Blank() const +{ + for ( unsigned i=0; i +#include +#include + +#include "tinystr.h" + +// TiXmlString constructor, based on a C generic_string +TiXmlString::TiXmlString (const TCHAR* instring) +{ + unsigned newlen; + TCHAR * newstring; + + if (!instring) + { + allocated = 0; + cstring = NULL; + current_length = 0; + return; + } + newlen = lstrlen (instring) + 1; + newstring = new TCHAR [newlen]; + memcpy (newstring, instring, newlen); + // lstrcpy (newstring, instring); + allocated = newlen; + cstring = newstring; + current_length = newlen - 1; +} + +// TiXmlString copy constructor +TiXmlString::TiXmlString (const TiXmlString& copy) +{ + unsigned newlen; + TCHAR * newstring; + + // Prevent copy to self! + if ( © == this ) + return; + + if (! copy . allocated) + { + allocated = 0; + cstring = NULL; + current_length = 0; + return; + } + newlen = copy . length () + 1; + newstring = new TCHAR [newlen]; + // lstrcpy (newstring, copy . cstring); + memcpy (newstring, copy . cstring, newlen); + allocated = newlen; + cstring = newstring; + current_length = newlen - 1; +} + +// TiXmlString = operator. Safe when assign own content +void TiXmlString ::operator = (const TCHAR * content) +{ + unsigned newlen; + TCHAR * newstring; + + if (! content) + { + empty_it (); + return; + } + newlen = lstrlen (content) + 1; + newstring = new TCHAR [newlen]; + // lstrcpy (newstring, content); + memcpy (newstring, content, newlen); + empty_it (); + allocated = newlen; + cstring = newstring; + current_length = newlen - 1; +} + +// = operator. Safe when assign own content +void TiXmlString ::operator = (const TiXmlString & copy) +{ + unsigned newlen; + TCHAR * newstring; + + if (! copy . length ()) + { + empty_it (); + return; + } + newlen = copy . length () + 1; + newstring = new TCHAR [newlen]; + // lstrcpy (newstring, copy . c_str ()); + memcpy (newstring, copy . c_str (), newlen); + empty_it (); + allocated = newlen; + cstring = newstring; + current_length = newlen - 1; +} + + +//// Checks if a TiXmlString contains only whitespace (same rules as isspace) +//bool TiXmlString::isblank () const +//{ +// TCHAR * lookup; +// for (lookup = cstring; * lookup; lookup++) +// if (! isspace (* lookup)) +// return false; +// return true; +//} + +// append a const TCHAR * to an existing TiXmlString +void TiXmlString::append( const TCHAR* str, int len ) +{ + TCHAR * new_string; + unsigned new_alloc, new_size, size_suffix; + + size_suffix = lstrlen (str); + if (len < (int) size_suffix) + size_suffix = len; + if (! size_suffix) + return; + + new_size = length () + size_suffix + 1; + // check if we need to expand + if (new_size > allocated) + { + // compute new size + new_alloc = assign_new_size (new_size); + + // allocate new buffer + new_string = new TCHAR [new_alloc]; + new_string [0] = 0; + + // copy the previous allocated buffer into this one + if (allocated && cstring) + // lstrcpy (new_string, cstring); + memcpy (new_string, cstring, length ()); + + // append the suffix. It does exist, otherwize we wouldn't be expanding + // strncat (new_string, str, len); + memcpy (new_string + length (), + str, + size_suffix); + + // return previsously allocated buffer if any + if (allocated && cstring) + delete [] cstring; + + // update member variables + cstring = new_string; + allocated = new_alloc; + } + else + { + // we know we can safely append the new generic_string + // strncat (cstring, str, len); + memcpy (cstring + length (), + str, + size_suffix); + } + current_length = new_size - 1; + cstring [current_length] = 0; +} + + +// append a const TCHAR * to an existing TiXmlString +void TiXmlString::append( const TCHAR * suffix ) +{ + TCHAR * new_string; + unsigned new_alloc, new_size; + + new_size = length () + lstrlen (suffix) + 1; + // check if we need to expand + if (new_size > allocated) + { + // compute new size + new_alloc = assign_new_size (new_size); + + // allocate new buffer + new_string = new TCHAR [new_alloc]; + new_string [0] = 0; + + // copy the previous allocated buffer into this one + if (allocated && cstring) + memcpy (new_string, cstring, 1 + length ()); + // lstrcpy (new_string, cstring); + + // append the suffix. It does exist, otherwize we wouldn't be expanding + // lstrcat (new_string, suffix); + memcpy (new_string + length (), + suffix, + lstrlen (suffix) + 1); + + // return previsously allocated buffer if any + if (allocated && cstring) + delete [] cstring; + + // update member variables + cstring = new_string; + allocated = new_alloc; + } + else + { + // we know we can safely append the new generic_string + // lstrcat (cstring, suffix); + memcpy (cstring + length (), + suffix, + lstrlen (suffix) + 1); + } + current_length = new_size - 1; +} + +// Check for TiXmlString equuivalence +//bool TiXmlString::operator == (const TiXmlString & compare) const +//{ +// return (! lstrcmp (c_str (), compare . c_str ())); +//} + +//unsigned TiXmlString::length () const +//{ +// if (allocated) +// // return lstrlen (cstring); +// return current_length; +// return 0; +//} + + +unsigned TiXmlString::find (TCHAR tofind, unsigned offset) const +{ + TCHAR * lookup; + + if (offset >= length ()) + return (unsigned) notfound; + for (lookup = cstring + offset; * lookup; lookup++) + if (* lookup == tofind) + return lookup - cstring; + return (unsigned) notfound; +} + + +bool TiXmlString::operator == (const TiXmlString & compare) const +{ + if ( allocated && compare.allocated ) + { + assert( cstring ); + assert( compare.cstring ); + return ( lstrcmp( cstring, compare.cstring ) == 0 ); + } + return false; +} + + +bool TiXmlString::operator < (const TiXmlString & compare) const +{ + if ( allocated && compare.allocated ) + { + assert( cstring ); + assert( compare.cstring ); + return ( lstrcmp( cstring, compare.cstring ) > 0 ); + } + return false; +} + + +bool TiXmlString::operator > (const TiXmlString & compare) const +{ + if ( allocated && compare.allocated ) + { + assert( cstring ); + assert( compare.cstring ); + return ( lstrcmp( cstring, compare.cstring ) < 0 ); + } + return false; +} + + +#endif // TIXML_USE_STL diff --git a/PowerEditor/src/TinyXml/tinystr.h b/PowerEditor/src/TinyXml/tinystr.h new file mode 100644 index 00000000..aeddbaae --- /dev/null +++ b/PowerEditor/src/TinyXml/tinystr.h @@ -0,0 +1,237 @@ +/* +www.sourceforge.net/projects/tinyxml +Original file by Yves Berquin. + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#include "tinyxml.h" + + +#ifndef TIXML_USE_STL + +#ifndef TIXML_STRING_INCLUDED +#define TIXML_STRING_INCLUDED + +#pragma warning( disable : 4514 ) + +#include +#include + +/* + TiXmlString is an emulation of the std::generic_string template. + Its purpose is to allow compiling TinyXML on compilers with no or poor STL support. + Only the member functions relevant to the TinyXML project have been implemented. + The buffer allocation is made by a simplistic power of 2 like mechanism : if we increase + a generic_string and there's no more room, we allocate a buffer twice as big as we need. +*/ +class TiXmlString +{ + public : + // TiXmlString constructor, based on a generic_string + TiXmlString (const TCHAR * instring); + + // TiXmlString empty constructor + TiXmlString () + { + allocated = 0; + cstring = NULL; + current_length = 0; + } + + // TiXmlString copy constructor + TiXmlString (const TiXmlString& copy); + + // TiXmlString destructor + ~ TiXmlString () + { + empty_it (); + } + + // Convert a TiXmlString into a classical TCHAR * + const TCHAR * c_str () const + { + if (allocated) + return cstring; + return TEXT(""); + } + + // Return the length of a TiXmlString + unsigned length () const + { + return ( allocated ) ? current_length : 0; + } + + // TiXmlString = operator + void operator = (const TCHAR * content); + + // = operator + void operator = (const TiXmlString & copy); + + // += operator. Maps to append + TiXmlString& operator += (const TCHAR * suffix) + { + append (suffix); + return *this; + } + + // += operator. Maps to append + TiXmlString& operator += (TCHAR single) + { + append (single); + return *this; + } + + // += operator. Maps to append + TiXmlString& operator += (TiXmlString & suffix) + { + append (suffix); + return *this; + } + bool operator == (const TiXmlString & compare) const; + bool operator < (const TiXmlString & compare) const; + bool operator > (const TiXmlString & compare) const; + + // Checks if a TiXmlString is empty + bool empty () const + { + return length () ? false : true; + } + + // Checks if a TiXmlString contains only whitespace (same rules as isspace) + // Not actually used in tinyxml. Conflicts with a C macro, TEXT("isblank"), + // which is a problem. Commenting out. -lee +// bool isblank () const; + + // single TCHAR extraction + const TCHAR& at (unsigned index) const + { + assert( index < length ()); + return cstring [index]; + } + + // find a TCHAR in a generic_string. Return TiXmlString::notfound if not found + unsigned find (TCHAR lookup) const + { + return find (lookup, 0); + } + + // find a TCHAR in a generic_string from an offset. Return TiXmlString::notfound if not found + unsigned find (TCHAR tofind, unsigned offset) const; + + /* Function to reserve a big amount of data when we know we'll need it. Be aware that this + function clears the content of the TiXmlString if any exists. + */ + void reserve (unsigned size) + { + empty_it (); + if (size) + { + allocated = size; + cstring = new TCHAR [size]; + cstring [0] = 0; + current_length = 0; + } + } + + // [] operator + TCHAR& operator [] (unsigned index) const + { + assert( index < length ()); + return cstring [index]; + } + + // Error value for find primitive + enum { notfound = 0xffffffff, + npos = notfound }; + + void append (const TCHAR *str, int len ); + + protected : + + // The base generic_string + TCHAR * cstring; + // Number of chars allocated + unsigned allocated; + // Current generic_string size + unsigned current_length; + + // New size computation. It is simplistic right now : it returns twice the amount + // we need + unsigned assign_new_size (unsigned minimum_to_allocate) + { + return minimum_to_allocate * 2; + } + + // Internal function that clears the content of a TiXmlString + void empty_it () + { + if (cstring) + delete [] cstring; + cstring = NULL; + allocated = 0; + current_length = 0; + } + + void append (const TCHAR *suffix ); + + // append function for another TiXmlString + void append (const TiXmlString & suffix) + { + append (suffix . c_str ()); + } + + // append for a single TCHAR. This could be improved a lot if needed + void append (TCHAR single) + { + TCHAR smallstr [2]; + smallstr [0] = single; + smallstr [1] = 0; + append (smallstr); + } + +} ; + +/* + TiXmlOutStream is an emulation of std::ostream. It is based on TiXmlString. + Only the operators that we need for TinyXML have been developped. +*/ +class TiXmlOutStream : public TiXmlString +{ +public : + TiXmlOutStream () : TiXmlString () {} + + // TiXmlOutStream << operator. Maps to TiXmlString::append + TiXmlOutStream & operator << (const TCHAR * in) + { + append (in); + return (* this); + } + + // TiXmlOutStream << operator. Maps to TiXmlString::append + TiXmlOutStream & operator << (const TiXmlString & in) + { + append (in . c_str ()); + return (* this); + } +} ; + +#endif // TIXML_STRING_INCLUDED +#endif // TIXML_USE_STL diff --git a/PowerEditor/src/TinyXml/tinyxml.cpp b/PowerEditor/src/TinyXml/tinyxml.cpp new file mode 100644 index 00000000..7e18d3da --- /dev/null +++ b/PowerEditor/src/TinyXml/tinyxml.cpp @@ -0,0 +1,1260 @@ +/* +www.sourceforge.net/projects/tinyxml +Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#include +#include "tinyxml.h" + +#ifdef TIXML_USE_STL +#include +#endif + +bool TiXmlBase::condenseWhiteSpace = true; + +void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_OSTREAM* stream ) +{ + TIXML_STRING buffer; + PutString( str, &buffer ); + (*stream) << buffer; +} + +void TiXmlBase::PutString( const TIXML_STRING& str, TIXML_STRING* outString ) +{ + int i=0; + + while( i<(int)str.length() ) + { + int c = str[i]; + + if ( c == '&' + && i < ( (int)str.length() - 2 ) + && str[i+1] == '#' + && str[i+2] == 'x' ) + { + // Hexadecimal character reference. + // Pass through unchanged. + // © -- copyright symbol, for example. + while ( i<(int)str.length() ) + { + outString->append( str.c_str() + i, 1 ); + ++i; + if ( str[i] == ';' ) + break; + } + } + else if ( c == '&' ) + { + outString->append( entity[0].str, entity[0].strLength ); + ++i; + } + else if ( c == '<' ) + { + outString->append( entity[1].str, entity[1].strLength ); + ++i; + } + else if ( c == '>' ) + { + outString->append( entity[2].str, entity[2].strLength ); + ++i; + } + else if ( c == '\"' ) + { + outString->append( entity[3].str, entity[3].strLength ); + ++i; + } + else if ( c == '\'' ) + { + outString->append( entity[4].str, entity[4].strLength ); + ++i; + } + else if ( c < 32 || c > 126 ) + { + // Easy pass at non-alpha/numeric/symbol + // 127 is the delete key. Below 32 is symbolic. + TCHAR buf[ 32 ]; + wsprintf( buf, TEXT("&#x%04X;"), (unsigned) ( c & 0xffff ) ); + outString->append( buf, lstrlen( buf ) ); + ++i; + } + else + { + TCHAR realc = (TCHAR) c; + outString->append( &realc, 1 ); + ++i; + } + } +} + + +// <-- Strange class for a bug fix. Search for STL_STRING_BUG +TiXmlBase::StringToBuffer::StringToBuffer( const TIXML_STRING& str ) +{ + buffer = new TCHAR[ str.length()+1 ]; + if ( buffer ) + { + lstrcpy( buffer, str.c_str() ); + } +} + + +TiXmlBase::StringToBuffer::~StringToBuffer() +{ + delete [] buffer; +} +// End strange bug fix. --> + + +TiXmlNode::TiXmlNode( NodeType _type ) +{ + parent = 0; + type = _type; + firstChild = 0; + lastChild = 0; + prev = 0; + next = 0; + userData = 0; +} + + +TiXmlNode::~TiXmlNode() +{ + TiXmlNode* node = firstChild; + TiXmlNode* temp = 0; + + while ( node ) + { + temp = node; + node = node->next; + delete temp; + } +} + + +void TiXmlNode::Clear() +{ + TiXmlNode* node = firstChild; + TiXmlNode* temp = 0; + + while ( node ) + { + temp = node; + node = node->next; + delete temp; + } + + firstChild = 0; + lastChild = 0; +} + + +TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ) +{ + node->parent = this; + + node->prev = lastChild; + node->next = 0; + + if ( lastChild ) + lastChild->next = node; + else + firstChild = node; // it was an empty list. + + lastChild = node; + return node; +} + + +TiXmlNode* TiXmlNode::InsertEndChild( const TiXmlNode& addThis ) +{ + TiXmlNode* node = addThis.Clone(); + if ( !node ) + return 0; + + return LinkEndChild( node ); +} + + +TiXmlNode* TiXmlNode::InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ) +{ + if ( !beforeThis || beforeThis->parent != this ) + return 0; + + TiXmlNode* node = addThis.Clone(); + if ( !node ) + return 0; + node->parent = this; + + node->next = beforeThis; + node->prev = beforeThis->prev; + if ( beforeThis->prev ) + { + beforeThis->prev->next = node; + } + else + { + assert( firstChild == beforeThis ); + firstChild = node; + } + beforeThis->prev = node; + return node; +} + + +TiXmlNode* TiXmlNode::InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ) +{ + if ( !afterThis || afterThis->parent != this ) + return 0; + + TiXmlNode* node = addThis.Clone(); + if ( !node ) + return 0; + node->parent = this; + + node->prev = afterThis; + node->next = afterThis->next; + if ( afterThis->next ) + { + afterThis->next->prev = node; + } + else + { + assert( lastChild == afterThis ); + lastChild = node; + } + afterThis->next = node; + return node; +} + + +TiXmlNode* TiXmlNode::ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ) +{ + if ( replaceThis->parent != this ) + return 0; + + TiXmlNode* node = withThis.Clone(); + if ( !node ) + return 0; + + node->next = replaceThis->next; + node->prev = replaceThis->prev; + + if ( replaceThis->next ) + replaceThis->next->prev = node; + else + lastChild = node; + + if ( replaceThis->prev ) + replaceThis->prev->next = node; + else + firstChild = node; + + delete replaceThis; + node->parent = this; + return node; +} + + +bool TiXmlNode::RemoveChild( TiXmlNode* removeThis ) +{ + if ( removeThis->parent != this ) + { + assert( 0 ); + return false; + } + + if ( removeThis->next ) + removeThis->next->prev = removeThis->prev; + else + lastChild = removeThis->prev; + + if ( removeThis->prev ) + removeThis->prev->next = removeThis->next; + else + firstChild = removeThis->next; + + delete removeThis; + return true; +} + +TiXmlNode* TiXmlNode::FirstChild( const TCHAR * _value ) const +{ + TiXmlNode* node; + for ( node = firstChild; node; node = node->next ) + { + if ( node->SValue() == TIXML_STRING( _value )) + return node; + } + return 0; +} + +TiXmlNode* TiXmlNode::LastChild( const TCHAR * _value ) const +{ + TiXmlNode* node; + for ( node = lastChild; node; node = node->prev ) + { + if ( node->SValue() == TIXML_STRING (_value)) + return node; + } + return 0; +} + +TiXmlNode* TiXmlNode::IterateChildren( TiXmlNode* previous ) const +{ + if ( !previous ) + { + return FirstChild(); + } + else + { + assert( previous->parent == this ); + return previous->NextSibling(); + } +} + +TiXmlNode* TiXmlNode::IterateChildren( const TCHAR * val, TiXmlNode* previous ) const +{ + if ( !previous ) + { + return FirstChild( val ); + } + else + { + assert( previous->parent == this ); + return previous->NextSibling( val ); + } +} + +TiXmlNode* TiXmlNode::NextSibling( const TCHAR * _value ) const +{ + TiXmlNode* node; + for ( node = next; node; node = node->next ) + { + if ( node->SValue() == TIXML_STRING (_value)) + return node; + } + return 0; +} + + +TiXmlNode* TiXmlNode::PreviousSibling( const TCHAR * _value ) const +{ + TiXmlNode* node; + for ( node = prev; node; node = node->prev ) + { + if ( node->SValue() == TIXML_STRING (_value)) + return node; + } + return 0; +} + +void TiXmlElement::RemoveAttribute( const TCHAR * name ) +{ + TiXmlAttribute* node = attributeSet.Find( name ); + if ( node ) + { + attributeSet.Remove( node ); + delete node; + } +} + +TiXmlElement* TiXmlNode::FirstChildElement() const +{ + TiXmlNode* node; + + for ( node = FirstChild(); + node; + node = node->NextSibling() ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + +TiXmlElement* TiXmlNode::FirstChildElement( const TCHAR * _value ) const +{ + TiXmlNode* node; + + for ( node = FirstChild( _value ); + node; + node = node->NextSibling( _value ) ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + +TiXmlElement* TiXmlNode::NextSiblingElement() const +{ + TiXmlNode* node; + + for ( node = NextSibling(); + node; + node = node->NextSibling() ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + +TiXmlElement* TiXmlNode::NextSiblingElement( const TCHAR * _value ) const +{ + TiXmlNode* node; + + for ( node = NextSibling( _value ); + node; + node = node->NextSibling( _value ) ) + { + if ( node->ToElement() ) + return node->ToElement(); + } + return 0; +} + + + +TiXmlDocument* TiXmlNode::GetDocument() const +{ + const TiXmlNode* node; + + for( node = this; node; node = node->parent ) + { + if ( node->ToDocument() ) + return node->ToDocument(); + } + return 0; +} + + +TiXmlElement::TiXmlElement (const TCHAR * _value) +: TiXmlNode( TiXmlNode::ELEMENT ) +{ + firstChild = lastChild = 0; + value = _value; +} + +TiXmlElement::~TiXmlElement() +{ + while( attributeSet.First() ) + { + TiXmlAttribute* node = attributeSet.First(); + attributeSet.Remove( node ); + delete node; + } +} + +const TCHAR * TiXmlElement::Attribute( const TCHAR * name ) const +{ + TiXmlAttribute* node = attributeSet.Find( name ); + + if ( node ) + return node->Value(); + + return 0; +} + + +const TCHAR * TiXmlElement::Attribute( const TCHAR * name, int* i ) const +{ + const TCHAR * s = Attribute( name ); + if ( i ) + { + if ( s ) + *i = generic_atoi( s ); + else + *i = 0; + } + return s; +} + + +const TCHAR * TiXmlElement::Attribute( const TCHAR * name, double* d ) const +{ + const TCHAR * s = Attribute( name ); + if ( d ) + { + if ( s ) + *d = generic_atof( s ); + else + *d = 0; + } + return s; +} + + +int TiXmlElement::QueryIntAttribute( const TCHAR* name, int* ival ) const +{ + TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + + return node->QueryIntValue( ival ); +} + + +int TiXmlElement::QueryDoubleAttribute( const TCHAR* name, double* dval ) const +{ + TiXmlAttribute* node = attributeSet.Find( name ); + if ( !node ) + return TIXML_NO_ATTRIBUTE; + + return node->QueryDoubleValue( dval ); +} + + +void TiXmlElement::SetAttribute( const TCHAR * name, int val ) +{ + TCHAR buf[64]; + wsprintf( buf, TEXT("%d"), val ); + SetAttribute( name, buf ); +} + + +void TiXmlElement::SetAttribute( const TCHAR * name, const TCHAR * _value ) +{ + TiXmlAttribute* node = attributeSet.Find( name ); + if ( node ) + { + node->SetValue( _value ); + return; + } + + TiXmlAttribute* attrib = new TiXmlAttribute( name, _value ); + if ( attrib ) + { + attributeSet.Add( attrib ); + } + else + { + TiXmlDocument* document = GetDocument(); + if ( document ) document->SetError( TIXML_ERROR_OUT_OF_MEMORY, 0, 0 ); + } +} + +void TiXmlElement::Print( FILE* cfile, int depth ) const +{ + int i; + for ( i=0; iNext() ) + { + generic_fprintf( cfile, TEXT(" ") ); + attrib->Print( cfile, depth ); + } + + // There are 3 different formatting approaches: + // 1) An element without children is printed as a node + // 2) An element with only a text child is printed as text + // 3) An element with children is printed on multiple lines. + TiXmlNode* node; + if ( !firstChild ) + { + generic_fprintf( cfile, TEXT(" />") ); + } + else if ( firstChild == lastChild && firstChild->ToText() ) + { + generic_fprintf( cfile, TEXT(">") ); + firstChild->Print( cfile, depth + 1 ); + generic_fprintf( cfile, TEXT(""), value.c_str() ); + } + else + { + generic_fprintf( cfile, TEXT(">") ); + + for ( node = firstChild; node; node=node->NextSibling() ) + { + if ( !node->ToText() ) + { + generic_fprintf( cfile, TEXT("\n") ); + } + node->Print( cfile, depth+1 ); + } + generic_fprintf( cfile, TEXT("\n") ); + for( i=0; i"), value.c_str() ); + } +} + +void TiXmlElement::StreamOut( TIXML_OSTREAM * stream ) const +{ + (*stream) << TEXT("<") << value; + + TiXmlAttribute* attrib; + for ( attrib = attributeSet.First(); attrib; attrib = attrib->Next() ) + { + (*stream) << TEXT(" "); + attrib->StreamOut( stream ); + } + + // If this node has children, give it a closing tag. Else + // make it an empty tag. + TiXmlNode* node; + if ( firstChild ) + { + (*stream) << TEXT(">"); + + for ( node = firstChild; node; node=node->NextSibling() ) + { + node->StreamOut( stream ); + } + (*stream) << TEXT(""); + } + else + { + (*stream) << TEXT(" />"); + } +} + +TiXmlNode* TiXmlElement::Clone() const +{ + TiXmlElement* clone = new TiXmlElement( Value() ); + if ( !clone ) + return 0; + + CopyToClone( clone ); + + // Clone the attributes, then clone the children. + TiXmlAttribute* attribute = 0; + for( attribute = attributeSet.First(); + attribute; + attribute = attribute->Next() ) + { + clone->SetAttribute( attribute->Name(), attribute->Value() ); + } + + TiXmlNode* node = 0; + for ( node = firstChild; node; node = node->NextSibling() ) + { + clone->LinkEndChild( node->Clone() ); + } + return clone; +} + + +TiXmlDocument::TiXmlDocument() : TiXmlNode( TiXmlNode::DOCUMENT ) +{ + tabsize = 4; + ClearError(); +} + +TiXmlDocument::TiXmlDocument( const TCHAR * documentName ) : TiXmlNode( TiXmlNode::DOCUMENT ) +{ + tabsize = 4; + value = documentName; + ClearError(); +} + +bool TiXmlDocument::LoadFile() +{ + // See STL_STRING_BUG below. + StringToBuffer buf( value ); + + if ( buf.buffer && LoadFile( buf.buffer ) ) + return true; + + return false; +} + + +bool TiXmlDocument::SaveFile() const +{ + // See STL_STRING_BUG below. + StringToBuffer buf( value ); + + if ( buf.buffer && SaveFile( buf.buffer ) ) + return true; + + return false; +} + +bool TiXmlDocument::LoadFile( const TCHAR* filename ) +{ + // Delete the existing data: + Clear(); + location.Clear(); + + // There was a really terrifying little bug here. The code: + // value = filename + // in the STL case, cause the assignment method of the std::generic_string to + // be called. What is strange, is that the std::generic_string had the same + // address as it's c_str() method, and so bad things happen. Looks + // like a bug in the Microsoft STL implementation. + // See STL_STRING_BUG above. + // Fixed with the StringToBuffer class. + value = filename; + + FILE* file = generic_fopen( value.c_str (), TEXT("r") ); + + if ( file ) + { + // Get the file size, so we can pre-allocate the generic_string. HUGE speed impact. + long length = 0; + fseek( file, 0, SEEK_END ); + length = ftell( file ); + fseek( file, 0, SEEK_SET ); + + // Strange case, but good to handle up front. + if ( length == 0 ) + { + fclose( file ); + return false; + } + + // If we have a file, assume it is all one big XML file, and read it in. + // The document parser may decide the document ends sooner than the entire file, however. + TIXML_STRING data; + data.reserve( length ); + + const int BUF_SIZE = 2048; + TCHAR buf[BUF_SIZE]; + + while( generic_fgets( buf, BUF_SIZE, file ) ) + { + data += buf; + } + fclose( file ); + + Parse( data.c_str(), 0 ); + + if ( Error() ) + return false; + else + return true; + } + SetError( TIXML_ERROR_OPENING_FILE, 0, 0 ); + return false; +} + +bool TiXmlDocument::SaveFile( const TCHAR * filename ) const +{ + // The old c stuff lives on... + FILE* fp = generic_fopen( filename, TEXT("w") ); + if ( fp ) + { + Print( fp, 0 ); + fclose( fp ); + return true; + } + return false; +} + + +TiXmlNode* TiXmlDocument::Clone() const +{ + TiXmlDocument* clone = new TiXmlDocument(); + if ( !clone ) + return 0; + + CopyToClone( clone ); + clone->error = error; + clone->errorDesc = errorDesc.c_str (); + + TiXmlNode* node = 0; + for ( node = firstChild; node; node = node->NextSibling() ) + { + clone->LinkEndChild( node->Clone() ); + } + return clone; +} + + +void TiXmlDocument::Print( FILE* cfile, int depth ) const +{ + TiXmlNode* node; + for ( node=FirstChild(); node; node=node->NextSibling() ) + { + node->Print( cfile, depth ); + generic_fprintf( cfile, TEXT("\n") ); + } +} + +void TiXmlDocument::StreamOut( TIXML_OSTREAM * out ) const +{ + TiXmlNode* node; + for ( node=FirstChild(); node; node=node->NextSibling() ) + { + node->StreamOut( out ); + + // Special rule for streams: stop after the root element. + // The stream in code will only read one element, so don't + // write more than one. + if ( node->ToElement() ) + break; + } +} + + +TiXmlAttribute* TiXmlAttribute::Next() const +{ + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( next->value.empty() && next->name.empty() ) + return 0; + return next; +} + + +TiXmlAttribute* TiXmlAttribute::Previous() const +{ + // We are using knowledge of the sentinel. The sentinel + // have a value or name. + if ( prev->value.empty() && prev->name.empty() ) + return 0; + return prev; +} + + +void TiXmlAttribute::Print( FILE* cfile, int /*depth*/ ) const +{ + TIXML_STRING n, v; + + PutString( Name(), &n ); + PutString( Value(), &v ); + + if (value.find ('\"') == TIXML_STRING::npos) + generic_fprintf (cfile, TEXT("%s=\"%s\""), n.c_str(), v.c_str() ); + else + generic_fprintf (cfile, TEXT("%s='%s'"), n.c_str(), v.c_str() ); +} + + +void TiXmlAttribute::StreamOut( TIXML_OSTREAM * stream ) const +{ + if (value.find( '\"' ) != TIXML_STRING::npos) + { + PutString( name, stream ); + (*stream) << TEXT("=") << TEXT("'"); + PutString( value, stream ); + (*stream) << TEXT("'"); + } + else + { + PutString( name, stream ); + (*stream) << TEXT("=") << TEXT("\""); + PutString( value, stream ); + (*stream) << TEXT("\""); + } +} + +int TiXmlAttribute::QueryIntValue( int* ival ) const +{ + if ( generic_sscanf( value.c_str(), TEXT("%d"), ival ) == 1 ) + return TIXML_SUCCESS; + return TIXML_WRONG_TYPE; +} + +int TiXmlAttribute::QueryDoubleValue( double* dval ) const +{ + if ( generic_sscanf( value.c_str(), TEXT("%lf"), dval ) == 1 ) + return TIXML_SUCCESS; + return TIXML_WRONG_TYPE; +} + +void TiXmlAttribute::SetIntValue( int _value ) +{ + TCHAR buf [64]; + wsprintf (buf, TEXT("%d"), _value); + SetValue (buf); +} + +void TiXmlAttribute::SetDoubleValue( double _value ) +{ + TCHAR buf [64]; + wsprintf (buf, TEXT("%lf"), _value); + SetValue (buf); +} + +const int TiXmlAttribute::IntValue() const +{ + return generic_atoi (value.c_str ()); +} + +const double TiXmlAttribute::DoubleValue() const +{ + return generic_atof (value.c_str ()); +} + +void TiXmlComment::Print( FILE* cfile, int depth ) const +{ + for ( int i=0; i"), value.c_str() ); +} + +void TiXmlComment::StreamOut( TIXML_OSTREAM * stream ) const +{ + (*stream) << TEXT(""); +} + +TiXmlNode* TiXmlComment::Clone() const +{ + TiXmlComment* clone = new TiXmlComment(); + + if ( !clone ) + return 0; + + CopyToClone( clone ); + return clone; +} + + +void TiXmlText::Print( FILE* cfile, int /*depth*/ ) const +{ + TIXML_STRING buffer; + PutString( value, &buffer ); + generic_fprintf( cfile, TEXT("%s"), buffer.c_str() ); +} + + +void TiXmlText::StreamOut( TIXML_OSTREAM * stream ) const +{ + PutString( value, stream ); +} + + +TiXmlNode* TiXmlText::Clone() const +{ + TiXmlText* clone = 0; + clone = new TiXmlText( TEXT("") ); + + if ( !clone ) + return 0; + + CopyToClone( clone ); + return clone; +} + + +TiXmlDeclaration::TiXmlDeclaration( const TCHAR * _version, + const TCHAR * _encoding, + const TCHAR * _standalone ) +: TiXmlNode( TiXmlNode::DECLARATION ) +{ + version = _version; + encoding = _encoding; + standalone = _standalone; +} + + +void TiXmlDeclaration::Print( FILE* cfile, int /*depth*/ ) const +{ + generic_fprintf (cfile, TEXT("")); +} + +void TiXmlDeclaration::StreamOut( TIXML_OSTREAM * stream ) const +{ + (*stream) << TEXT(""); +} + +TiXmlNode* TiXmlDeclaration::Clone() const +{ + TiXmlDeclaration* clone = new TiXmlDeclaration(); + + if ( !clone ) + return 0; + + CopyToClone( clone ); + clone->version = version; + clone->encoding = encoding; + clone->standalone = standalone; + return clone; +} + + +void TiXmlUnknown::Print( FILE* cfile, int depth ) const +{ + for ( int i=0; i"); // Don't use entities hear! It is unknown. +} + +TiXmlNode* TiXmlUnknown::Clone() const +{ + TiXmlUnknown* clone = new TiXmlUnknown(); + + if ( !clone ) + return 0; + + CopyToClone( clone ); + return clone; +} + + +TiXmlAttributeSet::TiXmlAttributeSet() +{ + sentinel.next = &sentinel; + sentinel.prev = &sentinel; +} + + +TiXmlAttributeSet::~TiXmlAttributeSet() +{ + assert( sentinel.next == &sentinel ); + assert( sentinel.prev == &sentinel ); +} + + +void TiXmlAttributeSet::Add( TiXmlAttribute* addMe ) +{ + assert( !Find( addMe->Name() ) ); // Shouldn't be multiply adding to the set. + + addMe->next = &sentinel; + addMe->prev = sentinel.prev; + + sentinel.prev->next = addMe; + sentinel.prev = addMe; +} + +void TiXmlAttributeSet::Remove( TiXmlAttribute* removeMe ) +{ + TiXmlAttribute* node; + + for( node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( node == removeMe ) + { + node->prev->next = node->next; + node->next->prev = node->prev; + node->next = 0; + node->prev = 0; + return; + } + } + assert( 0 ); // we tried to remove a non-linked attribute. +} + +TiXmlAttribute* TiXmlAttributeSet::Find( const TCHAR * name ) const +{ + TiXmlAttribute* node; + + for( node = sentinel.next; node != &sentinel; node = node->next ) + { + if ( node->name == name ) + return node; + } + return 0; +} + + +#ifdef TIXML_USE_STL +TIXML_ISTREAM & operator >> (TIXML_ISTREAM & in, TiXmlNode & base) +{ + TIXML_STRING tag; + tag.reserve( 8 * 1000 ); + base.StreamIn( &in, &tag ); + + base.Parse( tag.c_str(), 0 ); + return in; +} +#endif + + +TIXML_OSTREAM & operator<< (TIXML_OSTREAM & out, const TiXmlNode & base) +{ + base.StreamOut (& out); + return out; +} + + +#ifdef TIXML_USE_STL +std::generic_string & operator<< (std::generic_string& out, const TiXmlNode& base ) +{ + + //std::ostringstream os_stream( std::ostringstream::out ); + std::basic_ostringstream os_stream( std::ostringstream::out ); + base.StreamOut( &os_stream ); + + out.append( os_stream.str() ); + return out; +} +#endif + + +TiXmlHandle TiXmlHandle::FirstChild() const +{ + if ( node ) + { + TiXmlNode* child = node->FirstChild(); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::FirstChild( const TCHAR * value ) const +{ + if ( node ) + { + TiXmlNode* child = node->FirstChild( value ); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::FirstChildElement() const +{ + if ( node ) + { + TiXmlElement* child = node->FirstChildElement(); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::FirstChildElement( const TCHAR * value ) const +{ + if ( node ) + { + TiXmlElement* child = node->FirstChildElement( value ); + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + +TiXmlHandle TiXmlHandle::Child( int count ) const +{ + if ( node ) + { + int i; + TiXmlNode* child = node->FirstChild(); + for ( i=0; + child && iNextSibling(), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::Child( const TCHAR* value, int count ) const +{ + if ( node ) + { + int i; + TiXmlNode* child = node->FirstChild( value ); + for ( i=0; + child && iNextSibling( value ), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::ChildElement( int count ) const +{ + if ( node ) + { + int i; + TiXmlElement* child = node->FirstChildElement(); + for ( i=0; + child && iNextSiblingElement(), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} + + +TiXmlHandle TiXmlHandle::ChildElement( const TCHAR* value, int count ) const +{ + if ( node ) + { + int i; + TiXmlElement* child = node->FirstChildElement( value ); + for ( i=0; + child && iNextSiblingElement( value ), ++i ) + { + // nothing + } + if ( child ) + return TiXmlHandle( child ); + } + return TiXmlHandle( 0 ); +} diff --git a/PowerEditor/src/TinyXml/tinyxml.h b/PowerEditor/src/TinyXml/tinyxml.h new file mode 100644 index 00000000..f6e7d803 --- /dev/null +++ b/PowerEditor/src/TinyXml/tinyxml.h @@ -0,0 +1,1265 @@ +/* +www.sourceforge.net/projects/tinyxml +Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + + +#ifndef TINYXML_INCLUDED +#define TINYXML_INCLUDED + +#ifdef _MSC_VER +#pragma warning( disable : 4530 ) +#pragma warning( disable : 4786 ) +#endif + +#include +#include +#include +#include +#include +#include +#include "Common.h" + +// Help out windows: +#if defined( _DEBUG ) && !defined( DEBUG ) +#define DEBUG +#endif + +#if defined( DEBUG ) && defined( _MSC_VER ) + +#define TIXML_LOG OutputDebugString +#else +#define TIXML_LOG printf +#endif + +#ifdef TIXML_USE_STL + #include + #include + //#include + #define TIXML_STRING std::generic_string + //#define TIXML_ISTREAM std::istream + //#define TIXML_OSTREAM std::ostream + #define TIXML_ISTREAM std::basic_istream + #define TIXML_OSTREAM std::basic_ostream + + +#else + #include "tinystr.h" + #define TIXML_STRING TiXmlString + #define TIXML_OSTREAM TiXmlOutStream +#endif + +class TiXmlDocument; +class TiXmlElement; +class TiXmlComment; +class TiXmlUnknown; +class TiXmlAttribute; +class TiXmlText; +class TiXmlDeclaration; + +class TiXmlParsingData; + +/* Internal structure for tracking location of items + in the XML file. +*/ +struct TiXmlCursor +{ + TiXmlCursor() { Clear(); } + void Clear() { row = col = -1; } + + int row; // 0 based. + int col; // 0 based. +}; + + +// Only used by Attribute::Query functions +enum +{ + TIXML_SUCCESS, + TIXML_NO_ATTRIBUTE, + TIXML_WRONG_TYPE +}; + +/** TiXmlBase is a base class for every class in TinyXml. + It does little except to establish that TinyXml classes + can be printed and provide some utility functions. + + In XML, the document and elements can contain + other elements and other types of nodes. + + @verbatim + A Document can contain: Element (container or leaf) + Comment (leaf) + Unknown (leaf) + Declaration( leaf ) + + An Element can contain: Element (container or leaf) + Text (leaf) + Attributes (not on tree) + Comment (leaf) + Unknown (leaf) + + A Decleration contains: Attributes (not on tree) + @endverbatim +*/ +class TiXmlBase +{ + friend class TiXmlNode; + friend class TiXmlElement; + friend class TiXmlDocument; + +public: + TiXmlBase() {} + virtual ~TiXmlBase() {} + + /** All TinyXml classes can print themselves to a filestream. + This is a formatted print, and will insert tabs and newlines. + + (For an unformatted stream, use the << operator.) + */ + virtual void Print( FILE* cfile, int depth ) const = 0; + + /** The world does not agree on whether white space should be kept or + not. In order to make everyone happy, these global, static functions + are provided to set whether or not TinyXml will condense all white space + into a single space or not. The default is to condense. Note changing this + values is not thread safe. + */ + static void SetCondenseWhiteSpace( bool condense ) { condenseWhiteSpace = condense; } + + /// Return the current white space setting. + static bool IsWhiteSpaceCondensed() { return condenseWhiteSpace; } + + /** Return the position, in the original source file, of this node or attribute. + The row and column are 1-based. (That is the first row and first column is + 1,1). If the returns values are 0 or less, then the parser does not have + a row and column value. + + Generally, the row and column value will be set when the TiXmlDocument::Load(), + TiXmlDocument::LoadFile(), or any TiXmlNode::Parse() is called. It will NOT be set + when the DOM was created from operator>>. + + The values reflect the initial load. Once the DOM is modified programmatically + (by adding or changing nodes and attributes) the new values will NOT update to + reflect changes in the document. + + There is a minor performance cost to computing the row and column. Computation + can be disabled if TiXmlDocument::SetTabSize() is called with 0 as the value. + + @sa TiXmlDocument::SetTabSize() + */ + int Row() const { return location.row + 1; } + int Column() const { return location.col + 1; } ///< See Row() + +protected: + // See STL_STRING_BUG + // Utility class to overcome a bug. + class StringToBuffer + { + public: + StringToBuffer( const TIXML_STRING& str ); + ~StringToBuffer(); + TCHAR* buffer; + }; + + static const TCHAR* SkipWhiteSpace( const TCHAR* ); + inline static bool IsWhiteSpace( int c ) { return ( isspace( c ) || c == '\n' || c == '\r' ); } + + virtual void StreamOut (TIXML_OSTREAM *) const = 0; + + #ifdef TIXML_USE_STL + static bool StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag ); + static bool StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag ); + #endif + + /* Reads an XML name into the generic_string provided. Returns + a pointer just past the last character of the name, + or 0 if the function has an error. + */ + static const TCHAR* ReadName( const TCHAR* p, TIXML_STRING* name ); + + /* Reads text. Returns a pointer past the given end tag. + Wickedly complex options, but it keeps the (sensitive) code in one place. + */ + static const TCHAR* ReadText( const TCHAR* in, // where to start + TIXML_STRING* text, // the generic_string read + bool ignoreWhiteSpace, // whether to keep the white space + const TCHAR* endTag, // what ends this text + bool ignoreCase ); // whether to ignore case in the end tag + + virtual const TCHAR* Parse( const TCHAR* p, TiXmlParsingData* data ) = 0; + + // If an entity has been found, transform it into a character. + static const TCHAR* GetEntity( const TCHAR* in, TCHAR* value ); + + // Get a character, while interpreting entities. + inline static const TCHAR* GetChar( const TCHAR* p, TCHAR* _value ) + { + assert( p ); + if ( *p == '&' ) + { + return GetEntity( p, _value ); + } + else + { + *_value = *p; + return p+1; + } + } + + // Puts a generic_string to a stream, expanding entities as it goes. + // Note this should not contian the '<', '>', etc, or they will be transformed into entities! + static void PutString( const TIXML_STRING& str, TIXML_OSTREAM* out ); + + static void PutString( const TIXML_STRING& str, TIXML_STRING* out ); + + // Return true if the next characters in the stream are any of the endTag sequences. + static bool StringEqual( const TCHAR* p, + const TCHAR* endTag, + bool ignoreCase ); + + + enum + { + TIXML_NO_ERROR = 0, + TIXML_ERROR, + TIXML_ERROR_OPENING_FILE, + TIXML_ERROR_OUT_OF_MEMORY, + TIXML_ERROR_PARSING_ELEMENT, + TIXML_ERROR_FAILED_TO_READ_ELEMENT_NAME, + TIXML_ERROR_READING_ELEMENT_VALUE, + TIXML_ERROR_READING_ATTRIBUTES, + TIXML_ERROR_PARSING_EMPTY, + TIXML_ERROR_READING_END_TAG, + TIXML_ERROR_PARSING_UNKNOWN, + TIXML_ERROR_PARSING_COMMENT, + TIXML_ERROR_PARSING_DECLARATION, + TIXML_ERROR_DOCUMENT_EMPTY, + + TIXML_ERROR_STRING_COUNT + }; + static const TCHAR* errorString[ TIXML_ERROR_STRING_COUNT ]; + + TiXmlCursor location; + +private: + struct Entity + { + const TCHAR* str; + unsigned int strLength; + TCHAR chr; + }; + enum + { + NUM_ENTITY = 5, + MAX_ENTITY_LENGTH = 6 + + }; + static Entity entity[ NUM_ENTITY ]; + static bool condenseWhiteSpace; +}; + + +/** The parent class for everything in the Document Object Model. + (Except for attributes). + Nodes have siblings, a parent, and children. A node can be + in a document, or stand on its own. The type of a TiXmlNode + can be queried, and it can be cast to its more defined type. +*/ +class TiXmlNode : public TiXmlBase +{ + friend class TiXmlDocument; + friend class TiXmlElement; + +public: + #ifdef TIXML_USE_STL + + /** An input stream operator, for every class. Tolerant of newlines and + formatting, but doesn't expect them. + */ + friend std::basic_istream& operator >> (std::basic_istream& in, TiXmlNode& base); + + /** An output stream operator, for every class. Note that this outputs + without any newlines or formatting, as opposed to Print(), which + includes tabs and new lines. + + The operator<< and operator>> are not completely symmetric. Writing + a node to a stream is very well defined. You'll get a nice stream + of output, without any extra whitespace or newlines. + + But reading is not as well defined. (As it always is.) If you create + a TiXmlElement (for example) and read that from an input stream, + the text needs to define an element or junk will result. This is + true of all input streams, but it's worth keeping in mind. + + A TiXmlDocument will read nodes until it reads a root element, and + all the children of that root element. + */ + friend std::basic_ostream& operator<< (std::basic_ostream& out, const TiXmlNode& base); + + /// Appends the XML node or attribute to a std::generic_string. + friend std::generic_string& operator<< (std::generic_string& out, const TiXmlNode& base ); + + #else + // Used internally, not part of the public API. + friend TIXML_OSTREAM& operator<< (TIXML_OSTREAM& out, const TiXmlNode& base); + #endif + + /** The types of XML nodes supported by TinyXml. (All the + unsupported types are picked up by UNKNOWN.) + */ + enum NodeType + { + DOCUMENT, + ELEMENT, + COMMENT, + UNKNOWN, + TEXT, + DECLARATION, + TYPECOUNT + }; + + virtual ~TiXmlNode(); + + /** The meaning of 'value' changes for the specific type of + TiXmlNode. + @verbatim + Document: filename of the xml file + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text generic_string + @endverbatim + + The subclasses will wrap this function. + */ + const TCHAR * Value() const { return value.c_str (); } + + /** Changes the value of the node. Defined as: + @verbatim + Document: filename of the xml file + Element: name of the element + Comment: the comment text + Unknown: the tag contents + Text: the text generic_string + @endverbatim + */ + void SetValue(const TCHAR * _value) { value = _value;} + + #ifdef TIXML_USE_STL + /// STL std::generic_string form. + void SetValue( const std::generic_string& _value ) + { + StringToBuffer buf( _value ); + SetValue( buf.buffer ? buf.buffer : TEXT("") ); + } + #endif + + /// Delete all the children of this node. Does not affect 'this'. + void Clear(); + + /// One step up the DOM. + TiXmlNode* Parent() const { return parent; } + + TiXmlNode* FirstChild() const { return firstChild; } ///< The first child of this node. Will be null if there are no children. + TiXmlNode* FirstChild( const TCHAR * value ) const; ///< The first child of this node with the matching 'value'. Will be null if none found. + + TiXmlNode* LastChild() const { return lastChild; } /// The last child of this node. Will be null if there are no children. + TiXmlNode* LastChild( const TCHAR * value ) const; /// The last child of this node matching 'value'. Will be null if there are no children. + + #ifdef TIXML_USE_STL + TiXmlNode* FirstChild( const std::generic_string& _value ) const { return FirstChild (_value.c_str ()); } ///< STL std::generic_string form. + TiXmlNode* LastChild( const std::generic_string& _value ) const { return LastChild (_value.c_str ()); } ///< STL std::generic_string form. + #endif + + /** An alternate way to walk the children of a node. + One way to iterate over nodes is: + @verbatim + for( child = parent->FirstChild(); child; child = child->NextSibling() ) + @endverbatim + + IterateChildren does the same thing with the syntax: + @verbatim + child = 0; + while( child = parent->IterateChildren( child ) ) + @endverbatim + + IterateChildren takes the previous child as input and finds + the next one. If the previous child is null, it returns the + first. IterateChildren will return null when done. + */ + TiXmlNode* IterateChildren( TiXmlNode* previous ) const; + + /// This flavor of IterateChildren searches for children with a particular 'value' + TiXmlNode* IterateChildren( const TCHAR * value, TiXmlNode* previous ) const; + + #ifdef TIXML_USE_STL + TiXmlNode* IterateChildren( const std::generic_string& _value, TiXmlNode* previous ) const { return IterateChildren (_value.c_str (), previous); } ///< STL std::generic_string form. + #endif + + /** Add a new node related to this. Adds a child past the LastChild. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertEndChild( const TiXmlNode& addThis ); + + + /** Add a new node related to this. Adds a child past the LastChild. + + NOTE: the node to be added is passed by pointer, and will be + henceforth owned (and deleted) by tinyXml. This method is efficient + and avoids an extra copy, but should be used with care as it + uses a different memory model than the other insert functions. + + @sa InsertEndChild + */ + TiXmlNode* LinkEndChild( TiXmlNode* addThis ); + + /** Add a new node related to this. Adds a child before the specified child. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis ); + + /** Add a new node related to this. Adds a child after the specified child. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis ); + + /** Replace a child of this node. + Returns a pointer to the new object or NULL if an error occured. + */ + TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis ); + + /// Delete a child of this node. + bool RemoveChild( TiXmlNode* removeThis ); + + /// Navigate to a sibling node. + TiXmlNode* PreviousSibling() const { return prev; } + + /// Navigate to a sibling node. + TiXmlNode* PreviousSibling( const TCHAR * ) const; + + #ifdef TIXML_USE_STL + TiXmlNode* PreviousSibling( const std::generic_string& _value ) const { return PreviousSibling (_value.c_str ()); } ///< STL std::generic_string form. + TiXmlNode* NextSibling( const std::generic_string& _value) const { return NextSibling (_value.c_str ()); } ///< STL std::generic_string form. + #endif + + /// Navigate to a sibling node. + TiXmlNode* NextSibling() const { return next; } + + /// Navigate to a sibling node with the given 'value'. + TiXmlNode* NextSibling( const TCHAR * ) const; + + /** Convenience function to get through elements. + Calls NextSibling and ToElement. Will skip all non-Element + nodes. Returns 0 if there is not another element. + */ + TiXmlElement* NextSiblingElement() const; + + /** Convenience function to get through elements. + Calls NextSibling and ToElement. Will skip all non-Element + nodes. Returns 0 if there is not another element. + */ + TiXmlElement* NextSiblingElement( const TCHAR * ) const; + + #ifdef TIXML_USE_STL + TiXmlElement* NextSiblingElement( const std::generic_string& _value) const { return NextSiblingElement (_value.c_str ()); } ///< STL std::generic_string form. + #endif + + /// Convenience function to get through elements. + TiXmlElement* FirstChildElement() const; + + /// Convenience function to get through elements. + TiXmlElement* FirstChildElement( const TCHAR * value ) const; + + #ifdef TIXML_USE_STL + TiXmlElement* FirstChildElement( const std::generic_string& _value ) const { return FirstChildElement (_value.c_str ()); } ///< STL std::generic_string form. + #endif + + /** Query the type (as an enumerated value, above) of this node. + The possible types are: DOCUMENT, ELEMENT, COMMENT, + UNKNOWN, TEXT, and DECLARATION. + */ + virtual int Type() const { return type; } + + /** Return a pointer to the Document this node lives in. + Returns null if not in a document. + */ + TiXmlDocument* GetDocument() const; + + /// Returns true if this node has no children. + bool NoChildren() const { return !firstChild; } + + TiXmlDocument* ToDocument() const { return ( this && type == DOCUMENT ) ? (TiXmlDocument*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlElement* ToElement() const { return ( this && type == ELEMENT ) ? (TiXmlElement*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlComment* ToComment() const { return ( this && type == COMMENT ) ? (TiXmlComment*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlUnknown* ToUnknown() const { return ( this && type == UNKNOWN ) ? (TiXmlUnknown*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlText* ToText() const { return ( this && type == TEXT ) ? (TiXmlText*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + TiXmlDeclaration* ToDeclaration() const { return ( this && type == DECLARATION ) ? (TiXmlDeclaration*) this : 0; } ///< Cast to a more defined type. Will return null not of the requested type. + + virtual TiXmlNode* Clone() const = 0; + + void SetUserData( void* user ) { userData = user; } + void* GetUserData() { return userData; } + +protected: + TiXmlNode( NodeType type ); + + #ifdef TIXML_USE_STL + // The real work of the input operator. + virtual void StreamIn( TIXML_ISTREAM* in, TIXML_STRING* tag ) = 0; + #endif + + // Figure out what is at *p, and parse it. Returns null if it is not an xml node. + TiXmlNode* Identify( const TCHAR* start ); + void CopyToClone( TiXmlNode* target ) const { target->SetValue (value.c_str() ); + target->userData = userData; } + + // Internal Value function returning a TIXML_STRING + TIXML_STRING SValue() const { return value ; } + + TiXmlNode* parent; + NodeType type; + + TiXmlNode* firstChild; + TiXmlNode* lastChild; + + TIXML_STRING value; + + TiXmlNode* prev; + TiXmlNode* next; + void* userData; +}; + + +/** An attribute is a name-value pair. Elements have an arbitrary + number of attributes, each with a unique name. + + @note The attributes are not TiXmlNodes, since they are not + part of the tinyXML document object model. There are other + suggested ways to look at this problem. +*/ +class TiXmlAttribute : public TiXmlBase +{ + friend class TiXmlAttributeSet; + +public: + /// Construct an empty attribute. + TiXmlAttribute() + { + document = 0; + prev = next = 0; + } + + #ifdef TIXML_USE_STL + /// std::generic_string constructor. + TiXmlAttribute( const std::generic_string& _name, const std::generic_string& _value ) + { + name = _name; + value = _value; + document = 0; + prev = next = 0; + } + #endif + + /// Construct an attribute with a name and value. + TiXmlAttribute( const TCHAR * _name, const TCHAR * _value ) + { + name = _name; + value = _value; + document = 0; + prev = next = 0; + } + + const TCHAR* Name() const { return name.c_str (); } ///< Return the name of this attribute. + const TCHAR* Value() const { return value.c_str (); } ///< Return the value of this attribute. + const int IntValue() const; ///< Return the value of this attribute, converted to an integer. + const double DoubleValue() const; ///< Return the value of this attribute, converted to a double. + + /** QueryIntValue examines the value generic_string. It is an alternative to the + IntValue() method with richer error checking. + If the value is an integer, it is stored in 'value' and + the call returns TIXML_SUCCESS. If it is not + an integer, it returns TIXML_WRONG_TYPE. + + A specialized but useful call. Note that for success it returns 0, + which is the opposite of almost all other TinyXml calls. + */ + int QueryIntValue( int* value ) const; + /// QueryDoubleValue examines the value generic_string. See QueryIntValue(). + int QueryDoubleValue( double* value ) const; + + void SetName( const TCHAR* _name ) { name = _name; } ///< Set the name of this attribute. + void SetValue( const TCHAR* _value ) { value = _value; } ///< Set the value. + + void SetIntValue( int value ); ///< Set the value from an integer. + void SetDoubleValue( double value ); ///< Set the value from a double. + + #ifdef TIXML_USE_STL + /// STL std::generic_string form. + void SetName( const std::generic_string& _name ) + { + StringToBuffer buf( _name ); + SetName ( buf.buffer ? buf.buffer : TEXT("error") ); + } + /// STL std::generic_string form. + void SetValue( const std::generic_string& _value ) + { + StringToBuffer buf( _value ); + SetValue( buf.buffer ? buf.buffer : TEXT("error") ); + } + #endif + + /// Get the next sibling attribute in the DOM. Returns null at end. + TiXmlAttribute* Next() const; + /// Get the previous sibling attribute in the DOM. Returns null at beginning. + TiXmlAttribute* Previous() const; + + bool operator==( const TiXmlAttribute& rhs ) const { return rhs.name == name; } + bool operator<( const TiXmlAttribute& rhs ) const { return name < rhs.name; } + bool operator>( const TiXmlAttribute& rhs ) const { return name > rhs.name; } + + /* [internal use] + Attribtue parsing starts: first letter of the name + returns: the next TCHAR after the value end quote + */ + virtual const TCHAR* Parse( const TCHAR* p, TiXmlParsingData* data ); + + // [internal use] + virtual void Print( FILE* cfile, int depth ) const; + + virtual void StreamOut( TIXML_OSTREAM * out ) const; + // [internal use] + // Set the document pointer so the attribute can report errors. + void SetDocument( TiXmlDocument* doc ) { document = doc; } + +private: + TiXmlDocument* document; // A pointer back to a document, for error reporting. + TIXML_STRING name; + TIXML_STRING value; + TiXmlAttribute* prev; + TiXmlAttribute* next; +}; + + +/* A class used to manage a group of attributes. + It is only used internally, both by the ELEMENT and the DECLARATION. + + The set can be changed transparent to the Element and Declaration + classes that use it, but NOT transparent to the Attribute + which has to implement a next() and previous() method. Which makes + it a bit problematic and prevents the use of STL. + + This version is implemented with circular lists because: + - I like circular lists + - it demonstrates some independence from the (typical) doubly linked list. +*/ +class TiXmlAttributeSet +{ +public: + TiXmlAttributeSet(); + ~TiXmlAttributeSet(); + + void Add( TiXmlAttribute* attribute ); + void Remove( TiXmlAttribute* attribute ); + + TiXmlAttribute* First() const { return ( sentinel.next == &sentinel ) ? 0 : sentinel.next; } + TiXmlAttribute* Last() const { return ( sentinel.prev == &sentinel ) ? 0 : sentinel.prev; } + TiXmlAttribute* Find( const TCHAR * name ) const; + +private: + TiXmlAttribute sentinel; +}; + + +/** The element is a container class. It has a value, the element name, + and can contain other elements, text, comments, and unknowns. + Elements also contain an arbitrary number of attributes. +*/ +class TiXmlElement : public TiXmlNode +{ +public: + /// Construct an element. + TiXmlElement (const TCHAR * in_value); + + #ifdef TIXML_USE_STL + /// std::generic_string constructor. + TiXmlElement( const std::generic_string& _value ) : TiXmlNode( TiXmlNode::ELEMENT ) + { + firstChild = lastChild = 0; + value = _value; + } + #endif + + virtual ~TiXmlElement(); + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + */ + const TCHAR* Attribute( const TCHAR* name ) const; + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + If the attribute exists and can be converted to an integer, + the integer value will be put in the return 'i', if 'i' + is non-null. + */ + const TCHAR* Attribute( const TCHAR* name, int* i ) const; + + /** Given an attribute name, Attribute() returns the value + for the attribute of that name, or null if none exists. + If the attribute exists and can be converted to an double, + the double value will be put in the return 'd', if 'd' + is non-null. + */ + const TCHAR* Attribute( const TCHAR* name, double* d ) const; + + /** QueryIntAttribute examines the attribute - it is an alternative to the + Attribute() method with richer error checking. + If the attribute is an integer, it is stored in 'value' and + the call returns TIXML_SUCCESS. If it is not + an integer, it returns TIXML_WRONG_TYPE. If the attribute + does not exist, then TIXML_NO_ATTRIBUTE is returned. + */ + int QueryIntAttribute( const TCHAR* name, int* value ) const; + /// QueryDoubleAttribute examines the attribute - see QueryIntAttribute(). + int QueryDoubleAttribute( const TCHAR* name, double* value ) const; + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetAttribute( const TCHAR* name, const TCHAR * value ); + + #ifdef TIXML_USE_STL + const TCHAR* Attribute( const std::generic_string& name ) const { return Attribute( name.c_str() ); } + const TCHAR* Attribute( const std::generic_string& name, int* i ) const { return Attribute( name.c_str(), i ); } + + /// STL std::generic_string form. + void SetAttribute( const std::generic_string& name, const std::generic_string& _value ) + { + StringToBuffer n( name ); + StringToBuffer v( _value ); + if ( n.buffer && v.buffer ) + SetAttribute (n.buffer, v.buffer ); + } + ///< STL std::generic_string form. + void SetAttribute( const std::generic_string& name, int _value ) + { + StringToBuffer n( name ); + if ( n.buffer ) + SetAttribute (n.buffer, _value); + } + #endif + + /** Sets an attribute of name to a given value. The attribute + will be created if it does not exist, or changed if it does. + */ + void SetAttribute( const TCHAR * name, int value ); + + /** Deletes an attribute with the given name. + */ + void RemoveAttribute( const TCHAR * name ); + #ifdef TIXML_USE_STL + void RemoveAttribute( const std::generic_string& name ) { RemoveAttribute (name.c_str ()); } ///< STL std::generic_string form. + #endif + + TiXmlAttribute* FirstAttribute() const { return attributeSet.First(); } ///< Access the first attribute in this element. + TiXmlAttribute* LastAttribute() const { return attributeSet.Last(); } ///< Access the last attribute in this element. + + // [internal use] Creates a new Element and returs it. + virtual TiXmlNode* Clone() const; + // [internal use] + + virtual void Print( FILE* cfile, int depth ) const; + +protected: + + // Used to be public [internal use] + #ifdef TIXML_USE_STL + virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); + #endif + virtual void StreamOut( TIXML_OSTREAM * out ) const; + + /* [internal use] + Attribtue parsing starts: next TCHAR past '<' + returns: next TCHAR past '>' + */ + virtual const TCHAR* Parse( const TCHAR* p, TiXmlParsingData* data ); + + /* [internal use] + Reads the "value" of the element -- another element, or text. + This should terminate with the current end tag. + */ + const TCHAR* ReadValue( const TCHAR* in, TiXmlParsingData* prevData ); + +private: + TiXmlAttributeSet attributeSet; +}; + + +/** An XML comment. +*/ +class TiXmlComment : public TiXmlNode +{ +public: + /// Constructs an empty comment. + TiXmlComment() : TiXmlNode( TiXmlNode::COMMENT ) {} + virtual ~TiXmlComment() {} + + // [internal use] Creates a new Element and returs it. + virtual TiXmlNode* Clone() const; + // [internal use] + virtual void Print( FILE* cfile, int depth ) const; +protected: + // used to be public + #ifdef TIXML_USE_STL + virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); + #endif + virtual void StreamOut( TIXML_OSTREAM * out ) const; + /* [internal use] + Attribtue parsing starts: at the ! of the !-- + returns: next TCHAR past '>' + */ + virtual const TCHAR* Parse( const TCHAR* p, TiXmlParsingData* data ); +}; + + +/** XML text. Contained in an element. +*/ +class TiXmlText : public TiXmlNode +{ + friend class TiXmlElement; +public: + /// Constructor. + TiXmlText (const TCHAR * initValue) : TiXmlNode (TiXmlNode::TEXT) + { + SetValue( initValue ); + } + virtual ~TiXmlText() {} + + #ifdef TIXML_USE_STL + /// Constructor. + TiXmlText( const std::generic_string& initValue ) : TiXmlNode (TiXmlNode::TEXT) + { + SetValue( initValue ); + } + #endif + + // [internal use] + virtual void Print( FILE* cfile, int depth ) const; + +protected : + // [internal use] Creates a new Element and returns it. + virtual TiXmlNode* Clone() const; + virtual void StreamOut ( TIXML_OSTREAM * out ) const; + // [internal use] + bool Blank() const; // returns true if all white space and new lines + /* [internal use] + Attribtue parsing starts: First TCHAR of the text + returns: next TCHAR past '>' + */ + virtual const TCHAR* Parse( const TCHAR* p, TiXmlParsingData* data ); + // [internal use] + #ifdef TIXML_USE_STL + virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); + #endif +}; + + +/** In correct XML the declaration is the first entry in the file. + @verbatim + + @endverbatim + + TinyXml will happily read or write files without a declaration, + however. There are 3 possible attributes to the declaration: + version, encoding, and standalone. + + Note: In this version of the code, the attributes are + handled as special cases, not generic attributes, simply + because there can only be at most 3 and they are always the same. +*/ +class TiXmlDeclaration : public TiXmlNode +{ +public: + /// Construct an empty declaration. + TiXmlDeclaration() : TiXmlNode( TiXmlNode::DECLARATION ) {} + +#ifdef TIXML_USE_STL + /// Constructor. + TiXmlDeclaration( const std::generic_string& _version, + const std::generic_string& _encoding, + const std::generic_string& _standalone ) + : TiXmlNode( TiXmlNode::DECLARATION ) + { + version = _version; + encoding = _encoding; + standalone = _standalone; + } +#endif + + /// Construct. + TiXmlDeclaration( const TCHAR* _version, + const TCHAR* _encoding, + const TCHAR* _standalone ); + + virtual ~TiXmlDeclaration() {} + + /// Version. Will return empty if none was found. + const TCHAR * Version() const { return version.c_str (); } + /// Encoding. Will return empty if none was found. + const TCHAR * Encoding() const { return encoding.c_str (); } + /// Is this a standalone document? + const TCHAR * Standalone() const { return standalone.c_str (); } + + // [internal use] Creates a new Element and returs it. + virtual TiXmlNode* Clone() const; + // [internal use] + virtual void Print( FILE* cfile, int depth ) const; + +protected: + // used to be public + #ifdef TIXML_USE_STL + virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); + #endif + virtual void StreamOut ( TIXML_OSTREAM * out) const; + // [internal use] + // Attribtue parsing starts: next TCHAR past '<' + // returns: next TCHAR past '>' + + virtual const TCHAR* Parse( const TCHAR* p, TiXmlParsingData* data ); + +private: + TIXML_STRING version; + TIXML_STRING encoding; + TIXML_STRING standalone; +}; + + +/** Any tag that tinyXml doesn't recognize is saved as an + unknown. It is a tag of text, but should not be modified. + It will be written back to the XML, unchanged, when the file + is saved. +*/ +class TiXmlUnknown : public TiXmlNode +{ +public: + TiXmlUnknown() : TiXmlNode( TiXmlNode::UNKNOWN ) {} + virtual ~TiXmlUnknown() {} + + // [internal use] + virtual TiXmlNode* Clone() const; + // [internal use] + virtual void Print( FILE* cfile, int depth ) const; +protected: + #ifdef TIXML_USE_STL + virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); + #endif + virtual void StreamOut ( TIXML_OSTREAM * out ) const; + /* [internal use] + Attribute parsing starts: First TCHAR of the text + returns: next TCHAR past '>' + */ + virtual const TCHAR* Parse( const TCHAR* p, TiXmlParsingData* data ); +}; + + +/** Always the top level node. A document binds together all the + XML pieces. It can be saved, loaded, and printed to the screen. + The 'value' of a document node is the xml file name. +*/ +class TiXmlDocument : public TiXmlNode +{ +public: + /// Create an empty document, that has no name. + TiXmlDocument(); + /// Create a document with a name. The name of the document is also the filename of the xml. + TiXmlDocument( const TCHAR * documentName ); + + #ifdef TIXML_USE_STL + /// Constructor. + TiXmlDocument( const std::generic_string& documentName ) : + TiXmlNode( TiXmlNode::DOCUMENT ) + { + value = documentName; + error = false; + } + #endif + + virtual ~TiXmlDocument() {} + + /** Load a file using the current document value. + Returns true if successful. Will delete any existing + document data before loading. + */ + bool LoadFile(); + /// Save a file using the current document value. Returns true if successful. + bool SaveFile() const; + /// Load a file using the given filename. Returns true if successful. + bool LoadFile( const TCHAR * filename ); + /// Save a file using the given filename. Returns true if successful. + bool SaveFile( const TCHAR * filename ) const; + + #ifdef TIXML_USE_STL + bool LoadFile( const std::generic_string& filename ) ///< STL std::generic_string version. + { + StringToBuffer f( filename ); + return ( f.buffer && LoadFile( f.buffer )); + } + bool SaveFile( const std::generic_string& filename ) const ///< STL std::generic_string version. + { + StringToBuffer f( filename ); + return ( f.buffer && SaveFile( f.buffer )); + } + #endif + + /** Parse the given null terminated block of xml data. + */ + virtual const TCHAR* Parse( const TCHAR* p, TiXmlParsingData* data = 0 ); + + /** Get the root element -- the only top level element -- of the document. + In well formed XML, there should only be one. TinyXml is tolerant of + multiple elements at the document level. + */ + TiXmlElement* RootElement() const { return FirstChildElement(); } + + /** If an error occurs, Error will be set to true. Also, + - The ErrorId() will contain the integer identifier of the error (not generally useful) + - The ErrorDesc() method will return the name of the error. (very useful) + - The ErrorRow() and ErrorCol() will return the location of the error (if known) + */ + bool Error() const { return error; } + + /// Contains a textual (english) description of the error if one occurs. + const TCHAR * ErrorDesc() const { return errorDesc.c_str (); } + + /** Generally, you probably want the error generic_string ( ErrorDesc() ). But if you + prefer the ErrorId, this function will fetch it. + */ + const int ErrorId() const { return errorId; } + + /** Returns the location (if known) of the error. The first column is column 1, + and the first row is row 1. A value of 0 means the row and column wasn't applicable + (memory errors, for example, have no row/column) or the parser lost the error. (An + error in the error reporting, in that case.) + + @sa SetTabSize, Row, Column + */ + int ErrorRow() { return errorLocation.row+1; } + int ErrorCol() { return errorLocation.col+1; } ///< The column where the error occured. See ErrorRow() + + /** By calling this method, with a tab size + greater than 0, the row and column of each node and attribute is stored + when the file is loaded. Very useful for tracking the DOM back in to + the source file. + + The tab size is required for calculating the location of nodes. If not + set, the default of 4 is used. The tabsize is set per document. Setting + the tabsize to 0 disables row/column tracking. + + Note that row and column tracking is not supported when using operator>>. + + The tab size needs to be enabled before the parse or load. Correct usage: + @verbatim + TiXmlDocument doc; + doc.SetTabSize( 8 ); + doc.Load( "myfile.xml" ); + @endverbatim + + @sa Row, Column + */ + void SetTabSize( int _tabsize ) { tabsize = _tabsize; } + + int TabSize() const { return tabsize; } + + /** If you have handled the error, it can be reset with this call. The error + state is automatically cleared if you Parse a new XML block. + */ + void ClearError() { error = false; + errorId = 0; + errorDesc = TEXT(""); + errorLocation.row = errorLocation.col = 0; + //errorLocation.last = 0; + } + + /** Dump the document to standard out. */ + void Print() const { Print( stdout, 0 ); } + + // [internal use] + virtual void Print( FILE* cfile, int depth = 0 ) const; + // [internal use] + void SetError( int err, const TCHAR* errorLocation, TiXmlParsingData* prevData ); + +protected : + virtual void StreamOut ( TIXML_OSTREAM * out) const; + // [internal use] + virtual TiXmlNode* Clone() const; + #ifdef TIXML_USE_STL + virtual void StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ); + #endif + +private: + bool error; + int errorId; + TIXML_STRING errorDesc; + int tabsize; + TiXmlCursor errorLocation; +}; + + +/** + A TiXmlHandle is a class that wraps a node pointer with null checks; this is + an incredibly useful thing. Note that TiXmlHandle is not part of the TinyXml + DOM structure. It is a separate utility class. + + Take an example: + @verbatim + + + + + + + @endverbatim + + Assuming you want the value of "attributeB" in the 2nd "Child" element, it's very + easy to write a *lot* of code that looks like: + + @verbatim + TiXmlElement* root = document.FirstChildElement( "Document" ); + if ( root ) + { + TiXmlElement* element = root->FirstChildElement( "Element" ); + if ( element ) + { + TiXmlElement* child = element->FirstChildElement( "Child" ); + if ( child ) + { + TiXmlElement* child2 = child->NextSiblingElement( "Child" ); + if ( child2 ) + { + // Finally do something useful. + @endverbatim + + And that doesn't even cover "else" cases. TiXmlHandle addresses the verbosity + of such code. A TiXmlHandle checks for null pointers so it is perfectly safe + and correct to use: + + @verbatim + TiXmlHandle docHandle( &document ); + TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).Element(); + if ( child2 ) + { + // do something useful + @endverbatim + + Which is MUCH more concise and useful. + + It is also safe to copy handles - internally they are nothing more than node pointers. + @verbatim + TiXmlHandle handleCopy = handle; + @endverbatim + + What they should not be used for is iteration: + + @verbatim + int i=0; + while ( true ) + { + TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).Element(); + if ( !child ) + break; + // do something + ++i; + } + @endverbatim + + It seems reasonable, but it is in fact two embedded while loops. The Child method is + a linear walk to find the element, so this code would iterate much more than it needs + to. Instead, prefer: + + @verbatim + TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).Element(); + + for( child; child; child=child->NextSiblingElement() ) + { + // do something + } + @endverbatim +*/ +class TiXmlHandle +{ +public: + /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. + TiXmlHandle( TiXmlNode* node ) { this->node = node; } + /// Copy constructor + TiXmlHandle( const TiXmlHandle& ref ) { this->node = ref.node; } + + /// Return a handle to the first child node. + TiXmlHandle FirstChild() const; + /// Return a handle to the first child node with the given name. + TiXmlHandle FirstChild( const TCHAR * value ) const; + /// Return a handle to the first child element. + TiXmlHandle FirstChildElement() const; + /// Return a handle to the first child element with the given name. + TiXmlHandle FirstChildElement( const TCHAR * value ) const; + + /** Return a handle to the "index" child with the given name. + The first child is 0, the second 1, etc. + */ + TiXmlHandle Child( const TCHAR* value, int index ) const; + /** Return a handle to the "index" child. + The first child is 0, the second 1, etc. + */ + TiXmlHandle Child( int index ) const; + /** Return a handle to the "index" child element with the given name. + The first child element is 0, the second 1, etc. Note that only TiXmlElements + are indexed: other types are not counted. + */ + TiXmlHandle ChildElement( const TCHAR* value, int index ) const; + /** Return a handle to the "index" child element. + The first child element is 0, the second 1, etc. Note that only TiXmlElements + are indexed: other types are not counted. + */ + TiXmlHandle ChildElement( int index ) const; + + #ifdef TIXML_USE_STL + TiXmlHandle FirstChild( const std::generic_string& _value ) const { return FirstChild( _value.c_str() ); } + TiXmlHandle FirstChildElement( const std::generic_string& _value ) const { return FirstChildElement( _value.c_str() ); } + + TiXmlHandle Child( const std::generic_string& _value, int index ) const { return Child( _value.c_str(), index ); } + TiXmlHandle ChildElement( const std::generic_string& _value, int index ) const { return ChildElement( _value.c_str(), index ); } + #endif + + /// Return the handle as a TiXmlNode. This may return null. + TiXmlNode* Node() const { return node; } + /// Return the handle as a TiXmlElement. This may return null. + TiXmlElement* Element() const { return ( ( node && node->ToElement() ) ? node->ToElement() : 0 ); } + /// Return the handle as a TiXmlText. This may return null. + TiXmlText* Text() const { return ( ( node && node->ToText() ) ? node->ToText() : 0 ); } + +private: + TiXmlNode* node; +}; + + +#endif + diff --git a/PowerEditor/src/TinyXml/tinyxmlerror.cpp b/PowerEditor/src/TinyXml/tinyxmlerror.cpp new file mode 100644 index 00000000..0f9c9e20 --- /dev/null +++ b/PowerEditor/src/TinyXml/tinyxmlerror.cpp @@ -0,0 +1,51 @@ +/* +www.sourceforge.net/projects/tinyxml +Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#include "tinyxml.h" +//#include "tchar.h" + +// The goal of the seperate error file is to make the first +// step towards localization. tinyxml (currently) only supports +// latin-1, but at least the error messages could now be translated. +// +// It also cleans up the code a bit. +// + +const TCHAR* TiXmlBase::errorString[ TIXML_ERROR_STRING_COUNT ] = +{ + TEXT("No error"), + TEXT("Error"), + TEXT("Failed to open file"), + TEXT("Memory allocation failed."), + TEXT("Error parsing Element."), + TEXT("Failed to read Element name"), + TEXT("Error reading Element value."), + TEXT("Error reading Attributes."), + TEXT("Error: empty tag."), + TEXT("Error reading end tag."), + TEXT("Error parsing Unknown."), + TEXT("Error parsing Comment."), + TEXT("Error parsing Declaration."), + TEXT("Error document empty.") +}; diff --git a/PowerEditor/src/TinyXml/tinyxmlparser.cpp b/PowerEditor/src/TinyXml/tinyxmlparser.cpp new file mode 100644 index 00000000..d177d057 --- /dev/null +++ b/PowerEditor/src/TinyXml/tinyxmlparser.cpp @@ -0,0 +1,1141 @@ +/* +www.sourceforge.net/projects/tinyxml +Original code (2.0 and earlier )copyright (c) 2000-2002 Lee Thomason (www.grinninglizard.com) + +This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any +damages arising from the use of this software. + +Permission is granted to anyone to use this software for any +purpose, including commercial applications, and to alter it and +redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must +not claim that you wrote the original software. If you use this +software in a product, an acknowledgment in the product documentation +would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and +must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source +distribution. +*/ + +#include "tinyxml.h" +#include + +//#define DEBUG_PARSER + +// Note tha "PutString" hardcodes the same list. This +// is less flexible than it appears. Changing the entries +// or order will break putstring. +TiXmlBase::Entity TiXmlBase::entity[ NUM_ENTITY ] = +{ + { TEXT("&"), 5, '&' }, + { TEXT("<"), 4, '<' }, + { TEXT(">"), 4, '>' }, + { TEXT("""), 6, '\"' }, + { TEXT("'"), 6, '\'' } +}; + + +class TiXmlParsingData +{ + friend class TiXmlDocument; + public: + //TiXmlParsingData( const TCHAR* now, const TiXmlParsingData* prevData ); + void Stamp( const TCHAR* now ); + + const TiXmlCursor& Cursor() { return cursor; } + //void Update( const TCHAR* now ); + + private: + // Only used by the document! + TiXmlParsingData( const TCHAR* start, int _tabsize, int row, int col ) + { + assert( start ); + stamp = start; + tabsize = _tabsize; + cursor.row = row; + cursor.col = col; + } + + TiXmlCursor cursor; + const TCHAR* stamp; + int tabsize; +}; + + +void TiXmlParsingData::Stamp( const TCHAR* now ) +{ + assert( now ); + + // Do nothing if the tabsize is 0. + if ( tabsize < 1 ) + { + return; + } + + // Get the current row, column. + int row = cursor.row; + int col = cursor.col; + const TCHAR* p = stamp; + assert( p ); + + while ( p < now ) + { + // Code contributed by Fletcher Dunn: (modified by lee) + switch (*p) { + case 0: + // We *should* never get here, but in case we do, don't + // advance past the terminating null character, ever + return; + + case '\r': + // bump down to the next line + ++row; + col = 0; + // Eat the character + ++p; + + // Check for \r\n sequence, and treat this as a single character + if (*p == '\n') { + ++p; + } + break; + + case '\n': + // bump down to the next line + ++row; + col = 0; + + // Eat the character + ++p; + + // Check for \n\r sequence, and treat this as a single + // character. (Yes, this bizarre thing does occur still + // on some arcane platforms...) + if (*p == '\r') { + ++p; + } + break; + + case '\t': + // Eat the character + ++p; + + // Skip to next tab stop + col = (col / tabsize + 1) * tabsize; + break; + + default: + // Eat the character + ++p; + + // Normal TCHAR - just advance one column + ++col; + break; + } + } + cursor.row = row; + cursor.col = col; + assert( cursor.row >= -1 ); + assert( cursor.col >= -1 ); + stamp = p; + assert( stamp ); +} + + +const TCHAR* TiXmlBase::SkipWhiteSpace( const TCHAR* p ) +{ + if ( !p || !*p ) + { + return 0; + } + while ( p && *p ) + { + if ( isspace( *p ) || *p == '\n' || *p =='\r' ) // Still using old rules for white space. + ++p; + else + break; + } + + return p; +} + +#ifdef TIXML_USE_STL +/*static*/ bool TiXmlBase::StreamWhiteSpace( TIXML_ISTREAM * in, TIXML_STRING * tag ) +{ + for( ;; ) + { + if ( !in->good() ) return false; + + int c = in->peek(); + if ( !IsWhiteSpace( c ) ) + return true; + *tag += in->get(); + } +} + +/*static*/ bool TiXmlBase::StreamTo( TIXML_ISTREAM * in, int character, TIXML_STRING * tag ) +{ + while ( in->good() ) + { + int c = in->peek(); + if ( c == character ) + return true; + + in->get(); + *tag += c; + } + return false; +} +#endif + +const TCHAR* TiXmlBase::ReadName( const TCHAR* p, TIXML_STRING * name ) +{ + *name = TEXT(""); + assert( p ); + + // Names start with letters or underscores. + // After that, they can be letters, underscores, numbers, + // hyphens, or colons. (Colons are valid ony for namespaces, + // but tinyxml can't tell namespaces from names.) + if ( p && *p + && ( isalpha( (UCHAR) *p ) || *p == '_' ) ) + { + while( p && *p + && ( isalnum( (UCHAR ) *p ) + || *p == '_' + || *p == '-' + || *p == '.' + || *p == ':' ) ) + { + (*name) += *p; + ++p; + } + return p; + } + return 0; +} + +const TCHAR* TiXmlBase::GetEntity( const TCHAR* p, TCHAR* value ) +{ + // Presume an entity, and pull it out. + int i; + + // Handle the &#x entities. + if (generic_strncmp( TEXT("&#x"), p, 3 ) == 0) + { + const TCHAR* end = generic_strchr(p+3, TEXT(';')); + if (end && end - p <= 3 + 4) + { + int val; + if (generic_sscanf(p+3, TEXT("%x"), &val) == 1) + { + *value = val; + return end + 1; + } + } + } + + // Now try to match it. + for( i=0; i" so the + // sub-tag can orient itself. + + if ( !StreamTo( in, '<', tag ) ) + { + SetError( TIXML_ERROR_PARSING_EMPTY, 0, 0 ); + return; + } + + while ( in->good() ) + { + int tagIndex = tag->length(); + while ( in->good() && in->peek() != '>' ) + { + int c = in->get(); + (*tag) += (TCHAR) c; + } + + if ( in->good() ) + { + // We now have something we presume to be a node of + // some sort. Identify it, and call the node to + // continue streaming. + TiXmlNode* node = Identify( tag->c_str() + tagIndex ); + + if ( node ) + { + node->StreamIn( in, tag ); + bool isElement = node->ToElement() != 0; + delete node; + node = 0; + + // If this is the root element, we're done. Parsing will be + // done by the >> operator. + if ( isElement ) + { + return; + } + } + else + { + SetError( TIXML_ERROR, 0, 0 ); + return; + } + } + } + // We should have returned sooner. + SetError( TIXML_ERROR, 0, 0 ); +} + +#endif + +const TCHAR* TiXmlDocument::Parse( const TCHAR* p, TiXmlParsingData* prevData ) +{ + ClearError(); + + // Parse away, at the document level. Since a document + // contains nothing but other tags, most of what happens + // here is skipping white space. + if ( !p || !*p ) + { + SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0 ); + return 0; + } + + // Note that, for a document, this needs to come + // before the while space skip, so that parsing + // starts from the pointer we are given. + location.Clear(); + if ( prevData ) + { + location.row = prevData->cursor.row; + location.col = prevData->cursor.col; + } + else + { + location.row = 0; + location.col = 0; + } + TiXmlParsingData data( p, TabSize(), location.row, location.col ); + location = data.Cursor(); + + p = SkipWhiteSpace( p ); + if ( !p ) + { + SetError( TIXML_ERROR_DOCUMENT_EMPTY, 0, 0 ); + return 0; + } + + while ( p && *p ) + { + TiXmlNode* node = Identify( p ); + if ( node ) + { + p = node->Parse( p, &data ); + LinkEndChild( node ); + } + else + { + break; + } + p = SkipWhiteSpace( p ); + } + + // All is well. + return p; +} + +void TiXmlDocument::SetError( int err, const TCHAR* pError, TiXmlParsingData* data ) +{ + // The first error in a chain is more accurate - don't set again! + if ( error ) + return; + + assert( err > 0 && err < TIXML_ERROR_STRING_COUNT ); + error = true; + errorId = err; + errorDesc = errorString[ errorId ]; + + errorLocation.Clear(); + if ( pError && data ) + { + //TiXmlParsingData data( pError, prevData ); + data->Stamp( pError ); + errorLocation = data->Cursor(); + } +} + + +TiXmlNode* TiXmlNode::Identify( const TCHAR* p ) +{ + TiXmlNode* returnNode = 0; + + p = SkipWhiteSpace( p ); + if( !p || !*p || *p != '<' ) + { + return 0; + } + + TiXmlDocument* doc = GetDocument(); + p = SkipWhiteSpace( p ); + + if ( !p || !*p ) + { + return 0; + } + + // What is this thing? + // - Elements start with a letter or underscore, but xml is reserved. + // - Comments: "); + + if ( !StringEqual( p, startTag, false ) ) + { + document->SetError( TIXML_ERROR_PARSING_COMMENT, p, data ); + return 0; + } + p += lstrlen( startTag ); + p = ReadText( p, &value, false, endTag, false ); + return p; +} + + +const TCHAR* TiXmlAttribute::Parse( const TCHAR* p, TiXmlParsingData* data ) +{ + p = SkipWhiteSpace( p ); + if ( !p || !*p ) return 0; + + int tabsize = 4; + if ( document ) + tabsize = document->TabSize(); + +// TiXmlParsingData data( p, prevData ); + if ( data ) + { + data->Stamp( p ); + location = data->Cursor(); + } + // Read the name, the '=' and the value. + const TCHAR* pErr = p; + p = ReadName( p, &name ); + if ( !p || !*p ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, pErr, data ); + return 0; + } + p = SkipWhiteSpace( p ); + if ( !p || !*p || *p != '=' ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data ); + return 0; + } + + ++p; // skip '=' + p = SkipWhiteSpace( p ); + if ( !p || !*p ) + { + if ( document ) document->SetError( TIXML_ERROR_READING_ATTRIBUTES, p, data ); + return 0; + } + + const TCHAR* end; + + if ( *p == '\'' ) + { + ++p; + end = TEXT("\'"); + p = ReadText( p, &value, false, end, false ); + } + else if ( *p == '"' ) + { + ++p; + end = TEXT("\""); + p = ReadText( p, &value, false, end, false ); + } + else + { + // All attribute values should be in single or double quotes. + // But this is such a common error that the parser will try + // its best, even without them. + value = TEXT(""); + while ( p && *p // existence + && !isspace( *p ) && *p != '\n' && *p != '\r' // whitespace + && *p != '/' && *p != '>' ) // tag end + { + value += *p; + ++p; + } + } + return p; +} + +#ifdef TIXML_USE_STL +void TiXmlText::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) +{ + while ( in->good() ) + { + int c = in->peek(); + if ( c == '<' ) + return; + + (*tag) += c; + in->get(); + } +} +#endif + +const TCHAR* TiXmlText::Parse( const TCHAR* p, TiXmlParsingData* data ) +{ + value = TEXT(""); +// TiXmlParsingData data( p, prevData ); + if ( data ) + { + data->Stamp( p ); + location = data->Cursor(); + } + bool ignoreWhite = true; + + const TCHAR* end = TEXT("<"); + p = ReadText( p, &value, ignoreWhite, end, false ); + if ( p ) + return p-1; // don't truncate the '<' + return 0; +} + +#ifdef TIXML_USE_STL +void TiXmlDeclaration::StreamIn( TIXML_ISTREAM * in, TIXML_STRING * tag ) +{ + while ( in->good() ) + { + int c = in->get(); + (*tag) += c; + + if ( c == '>' ) + { + // All is well. + return; + } + } +} +#endif + +const TCHAR* TiXmlDeclaration::Parse( const TCHAR* p, TiXmlParsingData* data ) +{ + p = SkipWhiteSpace( p ); + // Find the beginning, find the end, and look for + // the stuff in-between. + TiXmlDocument* document = GetDocument(); + if ( !p || !*p || !StringEqual( p, TEXT("SetError( TIXML_ERROR_PARSING_DECLARATION, 0, 0 ); + return 0; + } +// TiXmlParsingData data( p, prevData ); + if ( data ) + { + data->Stamp( p ); + location = data->Cursor(); + } + p += 5; + + version = TEXT(""); + encoding = TEXT(""); + standalone = TEXT(""); + + while ( p && *p ) + { + if ( *p == '>' ) + { + ++p; + return p; + } + + p = SkipWhiteSpace( p ); + if ( StringEqual( p, TEXT("version"), true ) ) + { + TiXmlAttribute attrib; + p = attrib.Parse( p, data ); + version = attrib.Value(); + } + else if ( StringEqual( p, TEXT("encoding"), true ) ) + { + TiXmlAttribute attrib; + p = attrib.Parse( p, data ); + encoding = attrib.Value(); + } + else if ( StringEqual( p, TEXT("standalone"), true ) ) + { + TiXmlAttribute attrib; + p = attrib.Parse( p, data ); + standalone = attrib.Value(); + } + else + { + // Read over whatever it is. + while( p && *p && *p != '>' && !isspace( *p ) ) + ++p; + } + } + return 0; +} + +bool TiXmlText::Blank() const +{ + for ( unsigned i=0; i +// The License.txt file describes the conditions under which this software may be distributed. + +#include +#include +#include "UniConversion.h" + +unsigned int UTF8Length(const wchar_t *uptr, unsigned int tlen) { + unsigned int len = 0; + for (unsigned int i = 0; i < tlen && uptr[i]; i++) { + unsigned int uch = uptr[i]; + if (uch < 0x80) + len++; + else if (uch < 0x800) + len += 2; + else + len +=3; + } + return len; +} + +void UTF8FromUCS2(const wchar_t *uptr, unsigned int tlen, char *putf, unsigned int len) { + int k = 0; + for (unsigned int i = 0; i < tlen && uptr[i]; i++) { + unsigned int uch = uptr[i]; + if (uch < 0x80) { + putf[k++] = static_cast(uch); + } else if (uch < 0x800) { + putf[k++] = static_cast(0xC0 | (uch >> 6)); + putf[k++] = static_cast(0x80 | (uch & 0x3f)); + } else { + putf[k++] = static_cast(0xE0 | (uch >> 12)); + putf[k++] = static_cast(0x80 | ((uch >> 6) & 0x3f)); + putf[k++] = static_cast(0x80 | (uch & 0x3f)); + } + } + putf[len] = '\0'; +} + +unsigned int UCS2Length(const char *s, unsigned int len) { + unsigned int ulen = 0; + for (unsigned int i=0;i(s[i]); + if ((ch < 0x80) || (ch > (0x80 + 0x40))) + ulen++; + } + return ulen; +} + +unsigned int UCS2FromUTF8(const char *s, unsigned int len, wchar_t *tbuf, unsigned int tlen) +{ + unsigned int ui=0; + const UCHAR *us = reinterpret_cast(s); + unsigned int i=0; + while ((i((ch & 0x1F) << 6); + ch = us[i++]; + tbuf[ui] = static_cast(tbuf[ui] + (ch & 0x7F)); + } else { + tbuf[ui] = static_cast((ch & 0xF) << 12); + ch = us[i++]; + tbuf[ui] = static_cast(tbuf[ui] + ((ch & 0x7F) << 6)); + ch = us[i++]; + tbuf[ui] = static_cast(tbuf[ui] + (ch & 0x7F)); + } + ui++; + } + return ui; +} + + +unsigned int ascii_to_utf8(const char * pszASCII, unsigned int lenASCII, char * pszUTF8) +{ + // length of pszUTF8 must be enough; + // its maximum is (lenASCII*3 + 1) + + if (!lenASCII || !pszASCII) + { + pszUTF8[0] = 0; + return 0; + } + + unsigned int lenUCS2; + unsigned int lenUTF8; + wchar_t *pszUCS2 = new wchar_t[lenASCII * 3 + 1]; + if (!pszUCS2) + { + pszUTF8[0] = 0; + return 0; + } + + lenUCS2 = ::MultiByteToWideChar(CP_ACP, 0, pszASCII, lenASCII, pszUCS2, lenASCII + 1); + lenUTF8 = UTF8Length(pszUCS2, lenUCS2); + // length of pszUTF8 must be >= (lenUTF8 + 1) + UTF8FromUCS2(pszUCS2, lenUCS2, pszUTF8, lenUTF8); + delete [] pszUCS2; + return lenUTF8; +} + +int utf8_to_ascii(const char * pszUTF8, unsigned int lenUTF8, char * pszASCII) +{ + // length of pszASCII must be enough; + // its maximum is (lenUTF8 + 1) + + if (!lenUTF8 || !pszUTF8) + { + pszASCII[0] = 0; + return 0; + } + + unsigned int lenUCS2; + wchar_t* pszUCS2; + + pszUCS2 = new wchar_t[lenUTF8 + 1]; + if (!pszUCS2) + { + pszASCII[0] = 0; + return 0; + } + + lenUCS2 = UCS2FromUTF8(pszUTF8, lenUTF8, pszUCS2, lenUTF8); + pszUCS2[lenUCS2] = 0; + // length of pszASCII must be >= (lenUCS2 + 1) + int nbByte = ::WideCharToMultiByte(CP_ACP, 0, pszUCS2, lenUCS2, pszASCII, lenUCS2 + 1, NULL, NULL); + delete [] pszUCS2; + return nbByte; +} + diff --git a/PowerEditor/src/UniConversion.h b/PowerEditor/src/UniConversion.h new file mode 100644 index 00000000..c959087c --- /dev/null +++ b/PowerEditor/src/UniConversion.h @@ -0,0 +1,13 @@ +// Scintilla source code edit control +/** @file UniConversion.h + ** Functions to handle UFT-8 and UCS-2 strings. + **/ +// Copyright 1998-2001 by Neil Hodgson +// The License.txt file describes the conditions under which this software may be distributed. + +unsigned int UTF8Length(const wchar_t * uptr, unsigned int tlen); +void UTF8FromUCS2(const wchar_t * uptr, unsigned int tlen, char * putf, unsigned int len); +unsigned int UCS2Length(const char * s, unsigned int len); +unsigned int UCS2FromUTF8(const char * s, unsigned int len, wchar_t * tbuf, unsigned int tlen); +unsigned int ascii_to_utf8(const char * pszASCII, unsigned int lenASCII, char * pszUTF8); +int utf8_to_ascii(const char * pszUTF8, unsigned int lenUTF8, char * pszASCII); diff --git a/PowerEditor/src/Utf8_16.cpp b/PowerEditor/src/Utf8_16.cpp new file mode 100644 index 00000000..ad2357a3 --- /dev/null +++ b/PowerEditor/src/Utf8_16.cpp @@ -0,0 +1,527 @@ +// Utf8_16.cxx +// Copyright (C) 2002 Scott Kirkwood +// +// Permission to use, copy, modify, distribute and sell this code +// and its documentation for any purpose is hereby granted without fee, +// provided that the above copyright notice appear in all copies or +// any derived copies. Scott Kirkwood makes no representations +// about the suitability of this software for any purpose. +// It is provided "as is" without express or implied warranty. +//////////////////////////////////////////////////////////////////////////////// +// +// Modificated 2006 Jens Lorenz +// +// - Clean up the sources +// - Removing UCS-Bug in Utf8_Iter +// - Add convert function in Utf8_16_Write +//////////////////////////////////////////////////////////////////////////////// + +#include "Utf8_16.h" + +#include +#include +#include "PluginInterface.h" + +const Utf8_16::utf8 Utf8_16::k_Boms[][3] = { + {0x00, 0x00, 0x00}, // Unknown + {0xEF, 0xBB, 0xBF}, // UTF8 + {0xFE, 0xFF, 0x00}, // Big endian + {0xFF, 0xFE, 0x00}, // Little endian +}; + + +// ================================================================== + +Utf8_16_Read::Utf8_16_Read() { + m_eEncoding = uni8Bit; + m_nBufSize = 0; + m_pNewBuf = NULL; + m_bFirstRead = true; +} + +Utf8_16_Read::~Utf8_16_Read() +{ + if ((m_eEncoding == uni16BE) || (m_eEncoding == uni16LE)) + { + delete [] m_pNewBuf; + m_pNewBuf = NULL; + } +} + +// Returned value : +// 0 : utf8 +// 1 : 7bits +// 2 : 8bits +u78 Utf8_16_Read::utf8_7bits_8bits() +{ + int rv = 1; + int ASCII7only = 1; + utf8 *sx = (utf8 *)m_pBuf; + utf8 *endx = sx + m_nLen; + + while (sx=endx-1) + break; + if (!(*sx & 0x1F) || (sx[1]&(0x80+0x40)) != 0x80) { + rv=0; break; + } + sx+=2; + } + else if (*sx < (0x80 + 0x40 + 0x20 + 0x10)) + { // 1110qqqq 10xxxxvv 10nnnnnn If it begins with E, it is 16 bit + ASCII7only=0; + if (sx>=endx-2) + break; + if (!(*sx & 0xF) || (sx[1]&(0x80+0x40)) != 0x80 || (sx[2]&(0x80+0x40)) != 0x80) { + rv=0; break; + } + sx+=3; + } + else + { // more than 16 bits are not allowed here + ASCII7only=0; + rv=0; + break; + } + } + if (ASCII7only) + return ascii7bits; + if (rv) + return utf8NoBOM; + return ascii8bits; +} + +size_t Utf8_16_Read::convert(char* buf, size_t len) +{ + // bugfix by Jens Lorenz + static size_t nSkip = 0; + + size_t ret = 0; + + m_pBuf = (ubyte*)buf; + m_nLen = len; + + if (m_bFirstRead == true) + { + determineEncoding(); + nSkip = m_nSkip; + m_bFirstRead = false; + } + + switch (m_eEncoding) + { + case uni7Bit: + case uni8Bit: + case uniCookie: { + // Do nothing, pass through + m_nBufSize = 0; + m_pNewBuf = m_pBuf; + ret = len; + break; + } + case uniUTF8: { + // Pass through after BOM + m_nBufSize = 0; + m_pNewBuf = m_pBuf + nSkip; + ret = len - nSkip; + break; + } + case uni16BE: + case uni16LE: { + size_t newSize = len + len / 2 + 1; + + if (m_nBufSize != newSize) + { + if (m_pNewBuf) + delete [] m_pNewBuf; + m_pNewBuf = NULL; + m_pNewBuf = new ubyte[newSize]; + m_nBufSize = newSize; + } + + ubyte* pCur = m_pNewBuf; + + m_Iter16.set(m_pBuf + nSkip, len - nSkip, m_eEncoding); + + for (; m_Iter16; ++m_Iter16) + { + *pCur++ = m_Iter16.get(); + } + ret = pCur - m_pNewBuf; + break; + } + default: + break; + } + + // necessary for second calls and more + nSkip = 0; + + return ret; +} + + +void Utf8_16_Read::determineEncoding() +{ + m_eEncoding = uni8Bit; + m_nSkip = 0; + + if (m_nLen > 1 && m_pBuf[0] == k_Boms[uni16BE][0] && m_pBuf[1] == k_Boms[uni16BE][1]) + { + m_eEncoding = uni16BE; + m_nSkip = 2; + } + else if (m_nLen > 1 && m_pBuf[0] == k_Boms[uni16LE][0] && m_pBuf[1] == k_Boms[uni16LE][1]) + { + m_eEncoding = uni16LE; + m_nSkip = 2; + } + else if (m_nLen > 2 && m_pBuf[0] == k_Boms[uniUTF8][0] && + m_pBuf[1] == k_Boms[uniUTF8][1] && m_pBuf[2] == k_Boms[uniUTF8][2]) + { + m_eEncoding = uniUTF8; + m_nSkip = 3; + } + else + { + u78 detectedEncoding = utf8_7bits_8bits(); + if (detectedEncoding == utf8NoBOM) + m_eEncoding = uniCookie; + else if (detectedEncoding == ascii7bits) + m_eEncoding = uni7Bit; + else //(detectedEncoding == ascii8bits) + m_eEncoding = uni8Bit; + m_nSkip = 0; + } +} + + +// ================================================================== + +Utf8_16_Write::Utf8_16_Write() +{ + m_eEncoding = uni8Bit; + m_pFile = NULL; + m_pBuf = NULL; + m_pNewBuf = NULL; + m_bFirstWrite = true; + m_nBufSize = 0; +} + +Utf8_16_Write::~Utf8_16_Write() +{ + fclose(); +} + +FILE * Utf8_16_Write::fopen(const TCHAR *_name, const TCHAR *_type) +{ + m_pFile = ::generic_fopen(_name, _type); + + m_bFirstWrite = true; + + return m_pFile; +} + +size_t Utf8_16_Write::fwrite(const void* p, size_t _size) +{ + // no file open + if (!m_pFile) + { + return 0; + } + + size_t ret = 0; + + if (m_bFirstWrite) + { + switch (m_eEncoding) + { + case uniUTF8: { + ::fwrite(k_Boms[m_eEncoding], 3, 1, m_pFile); + break; + } + case uni16BE: + case uni16LE: + ::fwrite(k_Boms[m_eEncoding], 2, 1, m_pFile); + break; + default: + // nothing to do + break; + } + m_bFirstWrite = false; + } + + switch (m_eEncoding) + { + case uni7Bit: + case uni8Bit: + case uniCookie: + case uniUTF8: { + // Normal write + ret = ::fwrite(p, _size, 1, m_pFile); + break; + } + case uni16BE: + case uni16LE: { + if (_size > m_nBufSize) + { + m_nBufSize = _size; + if (m_pBuf != NULL) + delete [] m_pBuf; + m_pBuf = NULL; + m_pBuf = new utf16[_size + 1]; + } + + Utf8_Iter iter8; + iter8.set(static_cast(p), _size, m_eEncoding); + + utf16* pCur = m_pBuf; + + for (; iter8; ++iter8) { + if (iter8.canGet()) { + *pCur++ = iter8.get(); + } + } + ret = ::fwrite(m_pBuf, (const char*)pCur - (const char*)m_pBuf, 1, m_pFile); + break; + } + default: + break; + } + + return ret; +} + + +size_t Utf8_16_Write::convert(char* p, size_t _size) +{ + if (m_pNewBuf) + { + delete [] m_pNewBuf; + } + + switch (m_eEncoding) + { + case uni7Bit: + case uni8Bit: + case uniCookie: { + // Normal write + m_nBufSize = _size; + m_pNewBuf = (ubyte*)new ubyte[m_nBufSize]; + memcpy(m_pNewBuf, p, _size); + break; + } + case uniUTF8: { + m_nBufSize = _size + 3; + m_pNewBuf = (ubyte*)new ubyte[m_nBufSize]; + memcpy(m_pNewBuf, k_Boms[m_eEncoding], 3); + memcpy(&m_pNewBuf[3], p, _size); + break; + } + case uni16BE: + case uni16LE: { + m_pNewBuf = (ubyte*)new ubyte[sizeof(utf16) * (_size + 1)]; + + if (m_eEncoding == uni16BE || m_eEncoding == uni16LE) { + // Write the BOM + memcpy(m_pNewBuf, k_Boms[m_eEncoding], 2); + } + + Utf8_Iter iter8; + iter8.set(reinterpret_cast(p), _size, m_eEncoding); + + utf16* pCur = (utf16*)&m_pNewBuf[2]; + + for (; iter8; ++iter8) { + if (iter8.canGet()) { + *pCur++ = iter8.get(); + } + } + m_nBufSize = (const char*)pCur - (const char*)m_pNewBuf; + } + default: + break; + } + + return m_nBufSize; +} + + +void Utf8_16_Write::setEncoding(UniMode eType) +{ + m_eEncoding = eType; +} + + +void Utf8_16_Write::fclose() +{ + if (m_pNewBuf) + delete [] m_pNewBuf; + + if (m_pFile) + ::fclose(m_pFile); +} + + +//================================================================= +Utf8_Iter::Utf8_Iter() +{ + reset(); +} + +void Utf8_Iter::reset() +{ + m_pBuf = NULL; + m_pRead = NULL; + m_pEnd = NULL; + m_eState = eStart; + m_nCur = 0; + m_eEncoding = uni8Bit; +} + +void Utf8_Iter::set(const ubyte* pBuf, size_t nLen, UniMode eEncoding) +{ + m_pBuf = pBuf; + m_pRead = pBuf; + m_pEnd = pBuf + nLen; + m_eEncoding = eEncoding; + operator++(); + // Note: m_eState, m_nCur not set +} + +// Go to the next byte. +void Utf8_Iter::operator++() +{ + switch (m_eState) + { + case eStart: + if (*m_pRead < 0x80) { + m_nCur = *m_pRead; + toStart(); + } else if (*m_pRead < 0xE0) { + m_nCur = static_cast((0x1F & *m_pRead) << 6); + m_eState = e2Bytes_Byte2; + } else { + m_nCur = static_cast((0xF & *m_pRead) << 12); + m_eState = e3Bytes_Byte2; + } + break; + case e2Bytes_Byte2: + case e3Bytes_Byte3: + m_nCur |= static_cast(0x3F & *m_pRead); + toStart(); + break; + case e3Bytes_Byte2: + m_nCur |= static_cast((0x3F & *m_pRead) << 6); + m_eState = e3Bytes_Byte3; + break; + } + ++m_pRead; +} + +void Utf8_Iter::toStart() +{ + m_eState = eStart; + if (m_eEncoding == uni16BE) + { + swap(); + } +} + +void Utf8_Iter::swap() +{ + utf8* p = reinterpret_cast(&m_nCur); + utf8 swapbyte = *p; + *p = *(p + 1); + *(p + 1) = swapbyte; +} + +//================================================== +Utf16_Iter::Utf16_Iter() +{ + reset(); +} + +void Utf16_Iter::reset() +{ + m_pBuf = NULL; + m_pRead = NULL; + m_pEnd = NULL; + m_eState = eStart; + m_nCur = 0; + m_nCur16 = 0; + m_eEncoding = uni8Bit; +} + +void Utf16_Iter::set(const ubyte* pBuf, size_t nLen, UniMode eEncoding) +{ + m_pBuf = pBuf; + m_pRead = pBuf; + m_pEnd = pBuf + nLen; + m_eEncoding = eEncoding; + m_eState = eStart; + operator++(); + // Note: m_eState, m_nCur, m_nCur16 not reinitalized. +} + +// Goes to the next byte. +// Not the next symbol which you might expect. +// This way we can continue from a partial buffer that doesn't align +void Utf16_Iter::operator++() +{ + switch (m_eState) + { + case eStart: + if (m_eEncoding == uni16LE) { + m_nCur16 = *m_pRead++; + m_nCur16 |= static_cast(*m_pRead << 8); + } else { + m_nCur16 = static_cast(*m_pRead++ << 8); + m_nCur16 |= *m_pRead; + } + ++m_pRead; + + if (m_nCur16 < 0x80) { + m_nCur = static_cast(m_nCur16 & 0xFF); + m_eState = eStart; + } else if (m_nCur16 < 0x800) { + m_nCur = static_cast(0xC0 | m_nCur16 >> 6); + m_eState = e2Bytes2; + } else { + m_nCur = static_cast(0xE0 | m_nCur16 >> 12); + m_eState = e3Bytes2; + } + break; + case e2Bytes2: + case e3Bytes3: + m_nCur = static_cast(0x80 | m_nCur16 & 0x3F); + m_eState = eStart; + break; + case e3Bytes2: + m_nCur = static_cast(0x80 | ((m_nCur16 >> 6) & 0x3F)); + m_eState = e3Bytes3; + break; + } +} + + diff --git a/PowerEditor/src/Utf8_16.h b/PowerEditor/src/Utf8_16.h new file mode 100644 index 00000000..2c4f9497 --- /dev/null +++ b/PowerEditor/src/Utf8_16.h @@ -0,0 +1,153 @@ +// Utf8_16.h +// Copyright (C) 2002 Scott Kirkwood +// +// Permission to use, copy, modify, distribute and sell this code +// and its documentation for any purpose is hereby granted without fee, +// provided that the above copyright notice appear in all copies or +// any derived copies. Scott Kirkwood makes no representations +// about the suitability of this software for any purpose. +// It is provided "as is" without express or implied warranty. +// +// Notes: Used the UTF information I found at: +// http://www.cl.cam.ac.uk/~mgk25/unicode.html +//////////////////////////////////////////////////////////////////////////////// +// +// Modificated 2006 Jens Lorenz +// +// - Clean up the sources +// - Removing UCS-Bug in Utf8_Iter +// - Add convert function in Utf8_16_Write +//////////////////////////////////////////////////////////////////////////////// +#pragma once + +#include +#include +#include "Parameters.h" + +#ifdef _MSC_VER +#pragma warning(disable: 4514) // nreferenced inline function has been removed +#endif + +class Utf8_16 { +public: + typedef unsigned short utf16; // 16 bits + typedef UCHAR utf8; // 8 bits + typedef UCHAR ubyte; + static const utf8 k_Boms[uniEnd][3]; +}; + +// Reads UTF-16 and outputs UTF-8 +class Utf16_Iter : public Utf8_16 { +public: + enum eState { + eStart, + e2Bytes2, + e3Bytes2, + e3Bytes3 + }; + + Utf16_Iter(); + void reset(); + void set(const ubyte* pBuf, size_t nLen, UniMode eEncoding); + utf8 get() const { return m_nCur; }; + void operator++(); + eState getState() { return m_eState; }; + operator bool() { return m_pRead <= m_pEnd; }; + +protected: + void toStart(); // Put to start state, swap bytes if necessary + +protected: + UniMode m_eEncoding; + eState m_eState; + utf8 m_nCur; + utf16 m_nCur16; + const ubyte* m_pBuf; + const ubyte* m_pRead; + const ubyte* m_pEnd; +}; + +// Reads UTF-8 and outputs UTF-16 +class Utf8_Iter : public Utf8_16 { +public: + Utf8_Iter(); + void reset(); + void set(const ubyte* pBuf, size_t nLen, UniMode eEncoding); + utf16 get() const { +#ifdef _DEBUG + assert(m_eState == eStart); +#endif + return m_nCur; + } + bool canGet() const { return m_eState == eStart; } + void operator++(); + operator bool() { return m_pRead <= m_pEnd; } + +protected: + void swap(); + void toStart(); // Put to start state, swap bytes if necessary + enum eState { + eStart, + e2Bytes_Byte2, + e3Bytes_Byte2, + e3Bytes_Byte3 + }; +protected: + UniMode m_eEncoding; + eState m_eState; + utf16 m_nCur; + const ubyte* m_pBuf; + const ubyte* m_pRead; + const ubyte* m_pEnd; +}; + +// Reads UTF16 and outputs UTF8 +enum u78 {utf8NoBOM=0, ascii7bits=1, ascii8bits=2}; +class Utf8_16_Read : public Utf8_16 { +public: + Utf8_16_Read(); + ~Utf8_16_Read(); + + size_t convert(char* buf, size_t len); + char* getNewBuf() { return reinterpret_cast(m_pNewBuf); } + + UniMode getEncoding() const { return m_eEncoding; } + size_t calcCurPos(size_t pos); +protected: + void determineEncoding(); + u78 utf8_7bits_8bits(); +private: + UniMode m_eEncoding; + ubyte* m_pBuf; + ubyte* m_pNewBuf; + size_t m_nBufSize; + size_t m_nSkip; + bool m_bFirstRead; + size_t m_nLen; + Utf16_Iter m_Iter16; +}; + +// Read in a UTF-8 buffer and write out to UTF-16 or UTF-8 +class Utf8_16_Write : public Utf8_16 { +public: + Utf8_16_Write(); + ~Utf8_16_Write(); + + void setEncoding(UniMode eType); + + FILE * fopen(const TCHAR *_name, const TCHAR *_type); + size_t fwrite(const void* p, size_t _size); + void fclose(); + + size_t convert(char* p, size_t _size); + char* getNewBuf() { return reinterpret_cast(m_pNewBuf); } + size_t calcCurPos(size_t pos); + +protected: + UniMode m_eEncoding; + FILE* m_pFile; + utf16* m_pBuf; + ubyte* m_pNewBuf; + size_t m_nBufSize; + bool m_bFirstWrite; +}; diff --git a/PowerEditor/src/WinControls/AboutDlg/AboutDlg.cpp b/PowerEditor/src/WinControls/AboutDlg/AboutDlg.cpp new file mode 100644 index 00000000..a89139ee --- /dev/null +++ b/PowerEditor/src/WinControls/AboutDlg/AboutDlg.cpp @@ -0,0 +1,107 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "AboutDlg.h" +#include "Parameters.h" + +BOOL CALLBACK AboutDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG : + { + HWND compileDateHandle = ::GetDlgItem(_hSelf, IDC_BUILD_DATETIME); + generic_string buildTime = TEXT("Build time : "); + +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + buildTime += wmc->char2wchar(__DATE__, CP_ACP); + buildTime += TEXT(" - "); + buildTime += wmc->char2wchar(__TIME__, CP_ACP); + +#else + buildTime += __DATE__; + buildTime += TEXT(" - "); + buildTime += __TIME__; +#endif + ::SendMessage(compileDateHandle, WM_SETTEXT, 0, (LPARAM)buildTime.c_str()); + ::EnableWindow(compileDateHandle, FALSE); + + HWND licenceEditHandle = ::GetDlgItem(_hSelf, IDC_LICENCE_EDIT); + ::SendMessage(licenceEditHandle, WM_SETTEXT, 0, (LPARAM)LICENCE_TXT); + + _emailLink.init(_hInst, _hSelf); + _emailLink.create(::GetDlgItem(_hSelf, IDC_AUTHOR_NAME), TEXT("mailto:don.h@free.fr")); + + _pageLink.init(_hInst, _hSelf); + _pageLink.create(::GetDlgItem(_hSelf, IDC_HOME_ADDR), TEXT("http://notepad-plus.sourceforge.net/")); + + //_onLineHelp.init(_hInst, _hSelf); + //_onLineHelp.create(::GetDlgItem(_hSelf, IDC_ONLINEHELP_ADDR), TEXT("http://notepad-plus.sourceforge.net/uk/generalFAQ.php")); + + getClientRect(_rc); + + NppParameters *pNppParam = NppParameters::getInstance(); + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + { + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + redraw(); + } + + return TRUE; + } + + case WM_DRAWITEM : + { + HICON hIcon = ::LoadIcon(_hInst, MAKEINTRESOURCE(IDI_M30ICON)); + DRAWITEMSTRUCT *pdis = (DRAWITEMSTRUCT *)lParam; + ::DrawIcon(pdis->hDC, 0, 0, hIcon); + return TRUE; + } + + case WM_COMMAND : + { + switch (wParam) + { + case IDCANCEL : + case IDOK : + display(false); + return TRUE; + + default : + break; + } + } + + case WM_DESTROY : + { + return TRUE; + } + } + return FALSE; +} + +void AboutDlg::doDialog() +{ + if (!isCreated()) + create(IDD_ABOUTBOX); + + // Adjust the position of AboutBox + goToCenter(); +}; + diff --git a/PowerEditor/src/WinControls/AboutDlg/AboutDlg.h b/PowerEditor/src/WinControls/AboutDlg/AboutDlg.h new file mode 100644 index 00000000..97535ef5 --- /dev/null +++ b/PowerEditor/src/WinControls/AboutDlg/AboutDlg.h @@ -0,0 +1,63 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef ABOUT_DLG_H +#define ABOUT_DLG_H + +#include "URLCtrl.h" +#include "StaticDialog.h" +#include "ColourPicker.h" +#include "..\\..\\resource.h" + +#define LICENCE_TXT \ +TEXT("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.\r\n\ +\r\n\ +This program is distributed in the hope that it will be useful, \ +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. \r\n\ +\r\n\ +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.") + + + +class AboutDlg : public StaticDialog +{ +public : + AboutDlg() : StaticDialog() {}; + + void doDialog(); + + virtual void destroy() { + _emailLink.destroy(); + _pageLink.destroy(); + }; + +protected : + virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + +private : + URLCtrl _emailLink; + URLCtrl _pageLink; +}; + +#endif //ABOUT_DLG_H diff --git a/PowerEditor/src/WinControls/AboutDlg/URLCtrl.cpp b/PowerEditor/src/WinControls/AboutDlg/URLCtrl.cpp new file mode 100644 index 00000000..3be03a5b --- /dev/null +++ b/PowerEditor/src/WinControls/AboutDlg/URLCtrl.cpp @@ -0,0 +1,277 @@ +#include "URLCtrl.h" + +static BYTE XORMask[128] = +{ + 0xff, 0xff, 0xff, 0xff, + 0xf9, 0xff, 0xff, 0xff, + 0xf0, 0xff, 0xff, 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, + 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, +}; + +/* AND mask for hand cursor */ +/* Generated by HexEdit */ +static BYTE ANDMask[128] = +{ + 0x00, 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, 0xdb, 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, + 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, +}; + +static COLORREF getParentDlgBkColor(HWND hWnd) +{ + COLORREF crRet = CLR_INVALID; + if (hWnd && IsWindow(hWnd)) + { + HWND hWndParent = GetParent(hWnd); + if (hWndParent) + { + RECT rc; + if (GetClientRect(hWndParent, &rc)) + { + HDC hDC = GetDC(hWndParent); + if (hDC) + { + HDC hdcMem = CreateCompatibleDC(hDC); + if (hdcMem) + { + HBITMAP hBmp = CreateCompatibleBitmap(hDC, + rc.right, rc.bottom); + if (hBmp) + { + HGDIOBJ hOld = SelectObject(hdcMem, hBmp); + if (hOld) + { + if (SendMessage(hWndParent, WM_ERASEBKGND, (WPARAM)hdcMem, 0)) + { + crRet = GetPixel(hdcMem, 0, 0); + } + SelectObject(hdcMem, hOld); + } + DeleteObject(hBmp); + } + DeleteDC(hdcMem); + } + ReleaseDC(hWndParent, hDC); + } + } + } + } + return crRet; +} + +void URLCtrl::create(HWND itemHandle, TCHAR * link, COLORREF linkColor) +{ + // turn on notify style + ::SetWindowLongPtr(itemHandle, GWL_STYLE, ::GetWindowLongPtr(itemHandle, GWL_STYLE) | SS_NOTIFY); + + // set the URL text (not the display text) + if (link) + lstrcpy(_URL, link); + + // set the hyperlink colour + _linkColor = linkColor; + + // set the visited colour + _visitedColor = RGB(128,0,128); + + // subclass the static control + _oldproc = (WNDPROC)::SetWindowLongPtr(itemHandle, GWL_WNDPROC, (LONG)URLCtrlProc); + + // associate the URL structure with the static control + ::SetWindowLongPtr(itemHandle, GWL_USERDATA, (LONG)this); + +} +void URLCtrl::create(HWND itemHandle, int cmd, HWND msgDest) +{ + // turn on notify style + ::SetWindowLongPtr(itemHandle, GWL_STYLE, ::GetWindowLongPtr(itemHandle, GWL_STYLE) | SS_NOTIFY); + + _cmdID = cmd; + _msgDest = msgDest; + + // set the hyperlink colour + _linkColor = RGB(0,0,255); + + // subclass the static control + _oldproc = (WNDPROC)::SetWindowLongPtr(itemHandle, GWL_WNDPROC, (LONG)URLCtrlProc); + + // associate the URL structure with the static control + ::SetWindowLongPtr(itemHandle, GWL_USERDATA, (LONG)this); +} +LRESULT URLCtrl::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch(Message) + { + // Free up the structure we allocated + 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; + if(dwStyle & SS_CENTERIMAGE) dwDTStyle |= DT_VCENTER; + + RECT rect; + ::GetClientRect(hwnd, &rect); + + PAINTSTRUCT ps; + HDC hdc = ::BeginPaint(hwnd, &ps); + + ::SetTextColor(hdc, _linkColor); + + ::SetBkColor(hdc, getParentDlgBkColor(hwnd)); ///*::GetSysColor(COLOR_3DFACE)*/); + + // Create an underline font + if(_hfUnderlined == 0) + { + // Get the default GUI font + LOGFONT lf; + HFONT hf = (HFONT)::GetStockObject(DEFAULT_GUI_FONT); + + // 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); + + return 0; + } + + case WM_SETTEXT: + { + LRESULT ret = ::CallWindowProc(_oldproc, hwnd, Message, wParam, lParam); + ::InvalidateRect(hwnd, 0, 0); + return ret; + } + // Provide a hand cursor when the mouse moves over us + //case WM_SETCURSOR: + case WM_MOUSEMOVE: + { + if (_hCursor == 0) + _hCursor = ::CreateCursor(::GetModuleHandle(0), 5, 2, 32, 32, XORMask, ANDMask); + + SetCursor(_hCursor); + return TRUE; + } + + case WM_LBUTTONDOWN: + _clicking = true; + break; + + case WM_LBUTTONUP: + if(_clicking) + { + _clicking = false; + if (_cmdID) + { + ::SendMessage(_msgDest?_msgDest:_hParent, WM_COMMAND, _cmdID, 0); + } + else + { + _linkColor = _visitedColor; + + ::InvalidateRect(hwnd, 0, 0); + ::UpdateWindow(hwnd); + + // Open a browser + if(_URL[0]) + { + ::ShellExecute(NULL, TEXT("open"), _URL, NULL, NULL, SW_SHOWNORMAL); + } + else + { + TCHAR szWinText[MAX_PATH]; + ::GetWindowText(hwnd, szWinText, MAX_PATH); + ::ShellExecute(NULL, TEXT("open"), szWinText, NULL, NULL, SW_SHOWNORMAL); + } + } + } + + break; + + // A standard static control returns HTTRANSPARENT here, which + // prevents us from receiving any mouse messages. So, return + // HTCLIENT instead. + case WM_NCHITTEST: + return HTCLIENT; + } + return ::CallWindowProc(_oldproc, hwnd, Message, wParam, lParam); +} diff --git a/PowerEditor/src/WinControls/AboutDlg/URLCtrl.h b/PowerEditor/src/WinControls/AboutDlg/URLCtrl.h new file mode 100644 index 00000000..5a93a011 --- /dev/null +++ b/PowerEditor/src/WinControls/AboutDlg/URLCtrl.h @@ -0,0 +1,43 @@ +#ifndef URLCTRL_INCLUDED +#define URLCTRL_INCLUDED + +//#include +#include + +/* XOR mask for hand cursor */ +/* Generated by HexEdit */ + +class URLCtrl : public Window { +public: + URLCtrl():_hfUnderlined(0),_hCursor(0), _msgDest(NULL), _cmdID(0), _oldproc(NULL), \ + _linkColor(), _visitedColor(), _clicking(false) {_URL[0] = '\0';}; + + void create(HWND itemHandle, TCHAR * link, COLORREF linkColor = RGB(0,0,255)); + void create(HWND itemHandle, int cmd, HWND msgDest = NULL); + void destroy(){ + if(_hfUnderlined) + ::DeleteObject(_hfUnderlined); + if(_hCursor) + ::DestroyCursor(_hCursor); + }; + +protected : + TCHAR _URL[MAX_PATH]; + HFONT _hfUnderlined; + HCURSOR _hCursor; + + HWND _msgDest; + unsigned long _cmdID; + + WNDPROC _oldproc; + COLORREF _linkColor; + COLORREF _visitedColor; + bool _clicking; + + static LRESULT CALLBACK URLCtrlProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam){ + return ((URLCtrl *)(::GetWindowLongPtr(hwnd, GWL_USERDATA)))->runProc(hwnd, Message, wParam, lParam); + }; + LRESULT runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); +}; + +#endif //URLCTRL_INCLUDED diff --git a/PowerEditor/src/WinControls/ColourPicker/ColourPicker.cpp b/PowerEditor/src/WinControls/ColourPicker/ColourPicker.cpp new file mode 100644 index 00000000..623c6001 --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/ColourPicker.cpp @@ -0,0 +1,181 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#include "ColourPicker.h" +#include "Common.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); + if (!_hSelf) + { + systemMessage(TEXT("System Err")); + throw int(6969); + } + + + ::SetWindowLongPtr(_hSelf, GWL_USERDATA, reinterpret_cast(this)); + _buttonDefaultProc = reinterpret_cast(::SetWindowLongPtr(_hSelf, GWL_WNDPROC, reinterpret_cast(staticWinProc))); + +} + +void ColourPicker::drawBackground(HDC hDC) +{ + RECT rc; + HBRUSH hbrush; + + if(!hDC) + return; + + 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); +} + +void ColourPicker::drawForeground(HDC hDC) +{ + RECT rc; + HBRUSH hbrush; + + if(!hDC || _isEnabled) + return; + + int oldMode = ::SetBkMode(hDC, TRANSPARENT); + getClientRect(rc); + COLORREF strikeOut = RGB(0,0,0); + if ((((_currentColour ) & 0xFF) + + ((_currentColour >> 8) & 0xFF) + + ((_currentColour >> 16) & 0xFF)) < 200) //check if the color is too dark, if so, use white strikeout + strikeOut = RGB(0xFF,0xFF,0xFF); + if (!_isEnabled) + hbrush = ::CreateHatchBrush(HS_FDIAGONAL, strikeOut); + HGDIOBJ oldObj = ::SelectObject(hDC, hbrush); + ::Rectangle(hDC, 0, 0, rc.right, rc.bottom); + ::SelectObject(hDC, oldObj); + //FillRect(hDC, &rc, hbrush); + ::DeleteObject(hbrush); + ::SetBkMode(hDC, oldMode); +} + +LRESULT ColourPicker::runProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_LBUTTONDBLCLK : + case WM_LBUTTONDOWN : + { + if (!_pColourPopup) + { + RECT rc; + POINT p; + + Window::getClientRect(rc); + ::InflateRect(&rc, -2, -2); + p.x = rc.left; + p.y = rc.top + rc.bottom; + + ::ClientToScreen(_hSelf, &p); + _pColourPopup = new ColourPopup(_currentColour); + _pColourPopup->init(_hInst, _hSelf); + _pColourPopup->doDialog(p); + } + return TRUE; + } + case WM_RBUTTONDOWN: + { + _isEnabled = !_isEnabled; + redraw(); + ::SendMessage(_hParent, WM_COMMAND, MAKELONG(0, CPN_COLOURPICKED), (LPARAM)_hSelf); + break; + } + + case WM_ERASEBKGND: + { + HDC dc = (HDC)wParam; + drawBackground(dc); + return TRUE; + break; + } + + case WM_PAINT : + { + PAINTSTRUCT ps; + HDC dc = ::BeginPaint(_hSelf, &ps); + drawForeground(dc); + ::EndPaint(_hSelf, &ps); + return TRUE; + } + + case WM_PICKUP_COLOR : + { + _currentColour = (COLORREF)wParam; + redraw(); + + _pColourPopup->destroy(); + delete _pColourPopup; + _pColourPopup = NULL; + ::SendMessage(_hParent, WM_COMMAND, MAKELONG(0, CPN_COLOURPICKED), (LPARAM)_hSelf); + return TRUE; + } + + case WM_ENABLE : + { + if ((BOOL)wParam == FALSE) + { + _currentColour = ::GetSysColor(COLOR_3DFACE); + redraw(); + } + return TRUE; + } + + case WM_PICKUP_CANCEL : + case WM_DESTROY : + { + if (_pColourPopup) + { + _pColourPopup->destroy(); + delete _pColourPopup; + _pColourPopup = NULL; + + return TRUE; + } + break; + } + + default : + return ::CallWindowProc(_buttonDefaultProc, _hSelf, Message, wParam, lParam); + } + return FALSE; +} diff --git a/PowerEditor/src/WinControls/ColourPicker/ColourPicker.h b/PowerEditor/src/WinControls/ColourPicker/ColourPicker.h new file mode 100644 index 00000000..37cae49c --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/ColourPicker.h @@ -0,0 +1,62 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#ifndef COLOUR_PICKER_H +#define COLOUR_PICKER_H + +#include "Window.h" +#include "ColourPopup.h" + +//#define CP_CLASS_NAME "colourPickerButton" +#define CPN_COLOURPICKED (BN_CLICKED) + +class ColourPicker : public Window +{ +public : + ColourPicker() : Window(), _currentColour(RGB(0xFF, 0x00, 0x00)), _pColourPopup(NULL), _isEnabled(true) {}; + ~ColourPicker(){}; + virtual void init(HINSTANCE hInst, HWND parent); + virtual void destroy() { + DestroyWindow(_hSelf); + }; + void setColour(COLORREF c) { + _currentColour = c; + //drawSelf(); + }; + + COLORREF getColour() const {return _currentColour;}; + + bool isEnabled() {return _isEnabled;}; + void setEnabled(bool enabled) {_isEnabled = enabled;}; + +private : + COLORREF _currentColour; + WNDPROC _buttonDefaultProc; + ColourPopup *_pColourPopup; + bool _isEnabled; + + static LRESULT CALLBACK staticWinProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { + return (((ColourPicker *)(::GetWindowLongPtr(hwnd, GWL_USERDATA)))->runProc(Message, wParam, lParam)); + }; + LRESULT runProc(UINT Message, WPARAM wParam, LPARAM lParam); + void drawForeground(HDC hDC); + void drawBackground(HDC hDC); +}; + +#endif // COLOUR_PICKER_H diff --git a/PowerEditor/src/WinControls/ColourPicker/ColourPopup.cpp b/PowerEditor/src/WinControls/ColourPicker/ColourPopup.cpp new file mode 100644 index 00000000..ba94cb5d --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/ColourPopup.cpp @@ -0,0 +1,240 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#include "ColourPopup.h" +#include "Common.h" + +DWORD colourItems[] = { + RGB( 0, 0, 0), RGB( 64, 0, 0), RGB(128, 0, 0), RGB(128, 64, 64), RGB(255, 0, 0), RGB(255, 128, 128), + RGB(255, 255, 128), RGB(255, 255, 0), RGB(255, 128, 64), RGB(255, 128, 0), RGB(128, 64, 0), RGB(128, 128, 0), + RGB(128, 128, 64), RGB( 0, 64, 0), RGB( 0, 128, 0), RGB( 0, 255, 0), RGB(128, 255, 0), RGB(128, 255, 128), + RGB( 0, 255, 128), RGB( 0, 255, 64), RGB( 0, 128, 128), RGB( 0, 128, 64), RGB( 0, 64, 64), RGB(128, 128, 128), + RGB( 64, 128, 128), RGB( 0, 0, 128), RGB( 0, 0, 255), RGB( 0, 64, 128), RGB( 0, 255, 255), RGB(128, 255, 255), + RGB( 0, 128, 255), RGB( 0, 128, 192), RGB(128, 128, 255), RGB( 0, 0, 160), RGB( 0, 0, 64), RGB(192, 192, 192), + RGB( 64, 0, 64), RGB( 64, 0, 64), RGB(128, 0, 128), RGB(128, 0, 64), RGB(128, 128, 192), RGB(255, 128, 192), + RGB(255, 128, 255), RGB(255, 0, 255), RGB(255, 0, 128), RGB(128, 0, 255), RGB( 64, 0, 128), RGB(255, 255, 255), +}; + +void ColourPopup::create(int dialogID) +{ + _hSelf = ::CreateDialogParam(_hInst, MAKEINTRESOURCE(dialogID), _hParent, (DLGPROC)dlgProc, (LPARAM)this); + + if (!_hSelf) + { + systemMessage(TEXT("ColourPopup")); + throw int(696); + } + Window::getClientRect(_rc); + display(); +} + +BOOL CALLBACK ColourPopup::dlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_MEASUREITEM: + { + RECT rc; + LPMEASUREITEMSTRUCT lpmis = (LPMEASUREITEMSTRUCT) lParam; + ::GetWindowRect(::GetDlgItem(hwnd, lpmis->CtlID), &rc); + lpmis->itemHeight = (rc.bottom-rc.top)/6; + lpmis->itemWidth = (rc.right-rc.left)/8; + return TRUE; + } + + case WM_INITDIALOG : + { + ColourPopup *pColourPopup = (ColourPopup *)(lParam); + pColourPopup->_hSelf = hwnd; + ::SetWindowLongPtr(hwnd, GWL_USERDATA, (long)lParam); + pColourPopup->run_dlgProc(message, wParam, lParam); + return TRUE; + } + + default : + { + ColourPopup *pColourPopup = reinterpret_cast(::GetWindowLongPtr(hwnd, GWL_USERDATA)); + if (!pColourPopup) + return FALSE; + return pColourPopup->run_dlgProc(message, wParam, lParam); + } + } +} + +BOOL CALLBACK ColourPopup::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + + switch (message) + { + case WM_INITDIALOG: + { + int nColor; + for (nColor = 0 ; nColor < int(sizeof(colourItems)/sizeof(DWORD)) ; nColor++) + { + ::SendDlgItemMessage(_hSelf, IDC_COLOUR_LIST, LB_ADDSTRING, nColor, (LPARAM) ""); + ::SendDlgItemMessage(_hSelf, IDC_COLOUR_LIST, LB_SETITEMDATA , nColor, (LPARAM) colourItems[nColor]); + //if (g_bgColor == colourItems[nColor]) + //::SendDlgItemMessage(_hSelf, IDC_COLOUR_LIST, LB_SETCURSEL, nColor, 0); + } + //::SetCapture(_hSelf); + return TRUE; + } + + case WM_CTLCOLORLISTBOX: + return (LRESULT) CreateSolidBrush(GetSysColor(COLOR_3DFACE)); + + case WM_DRAWITEM: + { + HDC hdc; + COLORREF cr; + HBRUSH hbrush; + + DRAWITEMSTRUCT *pdis = (DRAWITEMSTRUCT *)lParam; + hdc = pdis->hDC; + RECT rc = pdis->rcItem; + + // Transparent. + SetBkMode(hdc,TRANSPARENT); + + // NULL object + if (pdis->itemID == UINT(-1)) return 0; + + switch (pdis->itemAction) + { + case ODA_DRAWENTIRE: + switch (pdis->CtlID) + { + case IDC_COLOUR_LIST: + rc = pdis->rcItem; + cr = (COLORREF) pdis->itemData; + InflateRect(&rc, -3, -3); + hbrush = CreateSolidBrush((COLORREF)cr); + FillRect(hdc, &rc, hbrush); + DeleteObject(hbrush); + FrameRect(hdc, &rc, (HBRUSH) GetStockObject(GRAY_BRUSH)); + break; + } + // *** FALL THROUGH *** + case ODA_SELECT: + rc = pdis->rcItem; + if (pdis->itemState & ODS_SELECTED) + { + rc.bottom --; + rc.right --; + // Draw the lighted side. + HPEN hpen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW)); + HPEN holdPen = (HPEN)SelectObject(hdc, hpen); + MoveToEx(hdc, rc.left, rc.bottom, NULL); + LineTo(hdc, rc.left, rc.top); + LineTo(hdc, rc.right, rc.top); + SelectObject(hdc, holdPen); + DeleteObject(hpen); + // Draw the darkened side. + hpen = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNHIGHLIGHT)); + holdPen = (HPEN)SelectObject(hdc, hpen); + LineTo(hdc, rc.right, rc.bottom); + LineTo(hdc, rc.left, rc.bottom); + SelectObject(hdc, holdPen); + DeleteObject(hpen); + } + else + { + hbrush = CreateSolidBrush(GetSysColor(COLOR_3DFACE)); + FrameRect(hdc, &rc, hbrush); + DeleteObject(hbrush); + } + break; + case ODA_FOCUS: + rc = pdis->rcItem; + InflateRect(&rc, -2, -2); + DrawFocusRect(hdc, &rc); + break; + default: + break; + } + return TRUE; + } + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDOK : + { + isColourChooserLaunched = true; + CHOOSECOLOR cc; // common dialog box structure + static COLORREF acrCustClr[16] = { + RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),\ + RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),\ + RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),\ + RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),RGB(0xFF,0xFF,0xFF),\ + }; // array of custom colors + + // Initialize CHOOSECOLOR + ::ZeroMemory(&cc, sizeof(cc)); + cc.lStructSize = sizeof(cc); + cc.hwndOwner = _hParent; + + cc.lpCustColors = (LPDWORD) acrCustClr; + cc.rgbResult = _colour; + cc.Flags = CC_FULLOPEN | CC_RGBINIT; + + display(false); + + if (ChooseColor(&cc)==TRUE) + { + ::SendMessage(_hParent, WM_PICKUP_COLOR, cc.rgbResult, 0); + } + else + { + ::SendMessage(_hParent, WM_PICKUP_CANCEL, 0, 0); + } + + return TRUE; + } + + case IDC_COLOUR_LIST : + { + if (HIWORD(wParam) == LBN_SELCHANGE) + { + int i = ::SendMessage((HWND)lParam, LB_GETCURSEL, 0L, 0L); + _colour = ::SendMessage((HWND)lParam, LB_GETITEMDATA, i, 0L); + + ::SendMessage(_hParent, WM_PICKUP_COLOR, _colour, 0); + return TRUE; + } + } + + default : + return FALSE; + } + + case WM_ACTIVATE : + { + if (LOWORD(wParam) == WA_INACTIVE) + if (!isColourChooserLaunched) + ::SendMessage(_hParent, WM_PICKUP_CANCEL, 0, 0); + return TRUE; + } + + } + return FALSE; +} + + + diff --git a/PowerEditor/src/WinControls/ColourPicker/ColourPopup.h b/PowerEditor/src/WinControls/ColourPicker/ColourPopup.h new file mode 100644 index 00000000..76686b76 --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/ColourPopup.h @@ -0,0 +1,68 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#ifndef COLOUR_POPUP_H +#define COLOUR_POPUP_H + +#include "Window.h" +#include "ColourPopupResource.h" +#include "resource.h" + +#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 { + 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); + }; + + virtual void destroy() { + ::DestroyWindow(_hSelf); + }; + COLORREF getSelColour(){return _colour;}; + +private : + RECT _rc; + COLORREF _colour; + bool isColourChooserLaunched; + + static BOOL CALLBACK dlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); + BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + + + +}; + +#endif //COLOUR_POPUP_H + + diff --git a/PowerEditor/src/WinControls/ColourPicker/ColourPopup.rc b/PowerEditor/src/WinControls/ColourPicker/ColourPopup.rc new file mode 100644 index 00000000..1f5884e0 --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/ColourPopup.rc @@ -0,0 +1,32 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + + +#include +#include "ColourPopupResource.h" + +IDD_COLOUR_POPUP DIALOGEX 0, 0, 132, 113 +STYLE DS_SETFONT | WS_POPUP | DS_MODALFRAME +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x0 +BEGIN + LISTBOX IDC_COLOUR_LIST,7,7,117,79, + LBS_OWNERDRAWFIXED | LBS_NOINTEGRALHEIGHT | + LBS_MULTICOLUMN | NOT WS_BORDER | WS_TABSTOP + DEFPUSHBUTTON "More Colours...",IDOK,39,92,55,14 +END diff --git a/PowerEditor/src/WinControls/ColourPicker/ColourPopupResource.h b/PowerEditor/src/WinControls/ColourPicker/ColourPopupResource.h new file mode 100644 index 00000000..c4b964c0 --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/ColourPopupResource.h @@ -0,0 +1,3 @@ +#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 new file mode 100644 index 00000000..02943f92 --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.cpp @@ -0,0 +1,824 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#include "WordStyleDlg.h" +#include "ScintillaEditView.h" + +BOOL CALLBACK ColourStaticTextHooker::colourStaticProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch(Message) + { + case WM_PAINT: + { + RECT rect; + ::GetClientRect(hwnd, &rect); + + PAINTSTRUCT ps; + HDC hdc = ::BeginPaint(hwnd, &ps); + + ::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); + + ::EndPaint(hwnd, &ps); + + return TRUE; + } + } + return ::CallWindowProc(_oldProc, hwnd, Message, wParam, lParam); +} +void WordStyleDlg::updateGlobalOverrideCtrls() +{ + const NppGUI & nppGUI = (NppParameters::getInstance())->getNppGUI(); + ::SendDlgItemMessage(_hSelf, IDC_GLOBAL_FG_CHECK, BM_SETCHECK, nppGUI._globalOverride.enableFg, 0); + ::SendDlgItemMessage(_hSelf, IDC_GLOBAL_BG_CHECK, BM_SETCHECK, nppGUI._globalOverride.enableBg, 0); + ::SendDlgItemMessage(_hSelf, IDC_GLOBAL_FONT_CHECK, BM_SETCHECK, nppGUI._globalOverride.enableFont, 0); + ::SendDlgItemMessage(_hSelf, IDC_GLOBAL_FONTSIZE_CHECK, BM_SETCHECK, nppGUI._globalOverride.enableFontSize, 0); + ::SendDlgItemMessage(_hSelf, IDC_GLOBAL_BOLD_CHECK, BM_SETCHECK, nppGUI._globalOverride.enableBold, 0); + ::SendDlgItemMessage(_hSelf, IDC_GLOBAL_ITALIC_CHECK, BM_SETCHECK, nppGUI._globalOverride.enableItalic, 0); + ::SendDlgItemMessage(_hSelf, IDC_GLOBAL_UNDERLINE_CHECK, BM_SETCHECK, nppGUI._globalOverride.enableUnderLine, 0); +} + +BOOL CALLBACK WordStyleDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_INITDIALOG : + { + NppParameters *nppParamInst = NppParameters::getInstance(); + + _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); + _hSwitch2ThemeCombo = ::GetDlgItem(_hSelf, IDC_SWITCH2THEME_COMBO); + + _hFgColourStaticText = ::GetDlgItem(_hSelf, IDC_FG_STATIC); + _hBgColourStaticText = ::GetDlgItem(_hSelf, IDC_BG_STATIC); + _hFontNameStaticText = ::GetDlgItem(_hSelf, IDC_FONTNAME_STATIC); + _hFontSizeStaticText = ::GetDlgItem(_hSelf, IDC_FONTSIZE_STATIC); + _hStyleInfoStaticText = ::GetDlgItem(_hSelf, IDC_STYLEDESCRIPTION_STATIC); + + colourHooker.setColour(RGB(0xFF, 0x00, 0x00)); + colourHooker.hookOn(_hStyleInfoStaticText); + + _currentThemeIndex = -1; + int defaultThemeIndex = 0; + ThemeSwitcher & themeSwitcher = nppParamInst->getThemeSwitcher(); + for(size_t i = 0 ; i < themeSwitcher.size() ; i++) + { + pair & themeInfo = themeSwitcher.getElementFromIndex(i); + int j = ::SendMessage(_hSwitch2ThemeCombo, CB_ADDSTRING, 0, (LPARAM)themeInfo.first.c_str()); + ::SendMessage(_hSwitch2ThemeCombo, CB_SETITEMDATA, j, (LPARAM)themeInfo.second.c_str()); + if (! themeInfo.second.compare( nppParamInst->getNppGUI()._themeName ) ) + { + _currentThemeIndex = j; + } + if (! themeInfo.first.compare(TEXT("Default")) ) + { + defaultThemeIndex = j; + } + } + if (_currentThemeIndex == -1) + { + _currentThemeIndex = defaultThemeIndex; + } + ::SendMessage(_hSwitch2ThemeCombo, CB_SETCURSEL, _currentThemeIndex, 0); + + for(int i = 0 ; i < sizeof(fontSizeStrs)/(3*sizeof(TCHAR)) ; i++) + ::SendMessage(_hFontSizeCombo, CB_ADDSTRING, 0, (LPARAM)fontSizeStrs[i]); + + const std::vector & fontlist = (NppParameters::getInstance())->getFontList(); + for (size_t i = 0 ; i < fontlist.size() ; i++) + { + int j = ::SendMessage(_hFontNameCombo, CB_ADDSTRING, 0, (LPARAM)fontlist[i].c_str()); + ::SendMessage(_hFontNameCombo, CB_SETITEMDATA, j, (LPARAM)fontlist[i].c_str()); + } + + _pFgColour = new ColourPicker; + _pBgColour = new ColourPicker; + _pFgColour->init(_hInst, _hSelf); + _pBgColour->init(_hInst, _hSelf); + + POINT p1, 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; + + ::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(); + + + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), _isDirty); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_SAVECLOSE_BUTTON), FALSE/*!_isSync*/); + + ETDTProc enableDlgTheme = (ETDTProc)nppParamInst->getEnableThemeDlgTexture(); + if (enableDlgTheme) + { + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + redraw(); + } + + updateGlobalOverrideCtrls(); + setVisualFromStyleList(); + goToCenter(); + + loadLangListFromNppParam(); + + return TRUE; + } + + case WM_DESTROY: + { + _pFgColour->destroy(); + _pBgColour->destroy(); + delete _pFgColour; + delete _pBgColour; + return TRUE; + } + + case WM_HSCROLL : + { + if ((HWND)lParam == ::GetDlgItem(_hSelf, IDC_SC_PERCENTAGE_SLIDER)) + { + int percent = ::SendDlgItemMessage(_hSelf, IDC_SC_PERCENTAGE_SLIDER, TBM_GETPOS, 0, 0); + (NppParameters::getInstance())->SetTransparent(_hSelf, percent); + } + return TRUE; + } + + case WM_COMMAND : + { + if (HIWORD(wParam) == EN_CHANGE) + { + int editID = LOWORD(wParam); + if (editID == IDC_USER_KEYWORDS_EDIT) + { + updateUserKeywords(); + notifyDataModified(); + apply(); + } + else if (editID == IDC_USER_EXT_EDIT) + { + updateExtension(); + notifyDataModified(); + } + } + else + { + switch (wParam) + { + case IDC_BOLD_CHECK : + updateFontStyleStatus(BOLD_STATUS); + notifyDataModified(); + apply(); + break; + + case IDC_ITALIC_CHECK : + updateFontStyleStatus(ITALIC_STATUS); + notifyDataModified(); + apply(); + break; + + case IDC_UNDERLINE_CHECK : + updateFontStyleStatus(UNDERLINE_STATUS); + notifyDataModified(); + apply(); + break; + + case IDCANCEL : + //::MessageBox(NULL, TEXT("cancel"), TEXT(""), MB_OK); + if (_isDirty) + { + NppParameters *nppParamInst = NppParameters::getInstance(); + if (_restoreInvalid) + { + generic_string str( nppParamInst->getNppGUI()._themeName ); + nppParamInst->reloadStylers( &str[0] ); + } + + LexerStylerArray & lsArray = nppParamInst->getLStylerArray(); + StyleArray & globalStyles = nppParamInst->getGlobalStylers(); + + if (_restoreInvalid) + { + _lsArray = _styles2restored = lsArray; + _globalStyles = _gstyles2restored = globalStyles; + } + else + { + globalStyles = _globalStyles = _gstyles2restored; + lsArray = _lsArray = _styles2restored; + } + + restoreGlobalOverrideValues(); + + _restoreInvalid = false; + _isDirty = false; + _isThemeDirty = false; + setVisualFromStyleList(); + + + //(nppParamInst->getNppGUI())._themeName + ::SendMessage(_hSwitch2ThemeCombo, CB_SETCURSEL, _currentThemeIndex, 0); + ::SendMessage(_hParent, WM_UPDATESCINTILLAS, 0, 0); + } + ::EnableWindow(::GetDlgItem(_hSelf, IDC_SAVECLOSE_BUTTON), FALSE/*!_isSync*/); + display(false); + return TRUE; + + case IDC_SAVECLOSE_BUTTON : + { + if (_isDirty) + { + LexerStylerArray & lsa = (NppParameters::getInstance())->getLStylerArray(); + StyleArray & globalStyles = (NppParameters::getInstance())->getGlobalStylers(); + + _lsArray = lsa; + _globalStyles = globalStyles; + updateThemeName(_themeName); + _restoreInvalid = false; + + _currentThemeIndex = ::SendMessage(_hSwitch2ThemeCombo, CB_GETCURSEL, 0, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), FALSE); + _isDirty = false; + } + _isThemeDirty = false; + (NppParameters::getInstance())->writeStyles(_lsArray, _globalStyles); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_SAVECLOSE_BUTTON), FALSE); + //_isSync = true; + display(false); + ::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)); + if (isChecked) + { + int percent = ::SendDlgItemMessage(_hSelf, IDC_SC_PERCENTAGE_SLIDER, TBM_GETPOS, 0, 0); + (NppParameters::getInstance())->SetTransparent(_hSelf, percent); + } + else + (NppParameters::getInstance())->removeTransparent(_hSelf); + + ::EnableWindow(::GetDlgItem(_hSelf, IDC_SC_PERCENTAGE_SLIDER), isChecked); + return TRUE; + } + + case IDC_GLOBAL_FG_CHECK : + { + GlobalOverride & glo = (NppParameters::getInstance())->getGlobalOverrideStyle(); + glo.enableFg = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, wParam, BM_GETCHECK, 0, 0)); + notifyDataModified(); + apply(); + return TRUE; + } + + case IDC_GLOBAL_BG_CHECK: + { + GlobalOverride & glo = (NppParameters::getInstance())->getGlobalOverrideStyle(); + glo.enableBg = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, wParam, BM_GETCHECK, 0, 0)); + notifyDataModified(); + apply(); + return TRUE; + } + + case IDC_GLOBAL_FONT_CHECK : + { + GlobalOverride & glo = (NppParameters::getInstance())->getGlobalOverrideStyle(); + glo.enableFont = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, wParam, BM_GETCHECK, 0, 0)); + notifyDataModified(); + apply(); + return TRUE; + } + case IDC_GLOBAL_FONTSIZE_CHECK : + { + GlobalOverride & glo = (NppParameters::getInstance())->getGlobalOverrideStyle(); + glo.enableFontSize = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, wParam, BM_GETCHECK, 0, 0)); + notifyDataModified(); + apply(); + return TRUE; + } + case IDC_GLOBAL_BOLD_CHECK : + { + GlobalOverride & glo = (NppParameters::getInstance())->getGlobalOverrideStyle(); + glo.enableBold = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, wParam, BM_GETCHECK, 0, 0)); + notifyDataModified(); + apply(); + return TRUE; + } + + case IDC_GLOBAL_ITALIC_CHECK : + { + GlobalOverride & glo = (NppParameters::getInstance())->getGlobalOverrideStyle(); + glo.enableItalic = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, wParam, BM_GETCHECK, 0, 0)); + notifyDataModified(); + apply(); + return TRUE; + } + case IDC_GLOBAL_UNDERLINE_CHECK : + { + GlobalOverride & glo = (NppParameters::getInstance())->getGlobalOverrideStyle(); + glo.enableUnderLine = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, wParam, BM_GETCHECK, 0, 0)); + notifyDataModified(); + apply(); + return TRUE; + } + + default: + switch (HIWORD(wParam)) + { + case CBN_SELCHANGE : // == case LBN_SELCHANGE : + { + switch (LOWORD(wParam)) + { + case IDC_FONT_COMBO : + updateFontName(); + notifyDataModified(); + apply(); + break; + case IDC_FONTSIZE_COMBO : + updateFontSize(); + notifyDataModified(); + apply(); + break; + case IDC_LANGUAGES_LIST : + { + int i = ::SendDlgItemMessage(_hSelf, LOWORD(wParam), LB_GETCURSEL, 0, 0); + if (i != LB_ERR) + { + bool prevThemeState = _isThemeDirty; + setStyleListFromLexer(i); + _isThemeDirty = prevThemeState; + } + break; + } + case IDC_STYLES_LIST : + setVisualFromStyleList(); + break; + + case IDC_SWITCH2THEME_COMBO : + switchToTheme(); + setVisualFromStyleList(); + notifyDataModified(); + _isThemeDirty = false; + apply(); + break; + } + return TRUE; + } + + case CPN_COLOURPICKED: + { + if ((HWND)lParam == _pFgColour->getHSelf()) + { + updateColour(C_FOREGROUND); + notifyDataModified(); + int tabColourIndex; + if ((tabColourIndex = whichTabColourIndex()) != -1) + { + //::SendMessage(_hParent, WM_UPDATETABBARCOLOUR, tabColourIndex, _pFgColour->getColour()); + TabBarPlus::setColour(_pFgColour->getColour(), (TabBarPlus::tabColourIndex)tabColourIndex); + return TRUE; + } + apply(); + return TRUE; + } + else if ((HWND)lParam == _pBgColour->getHSelf()) + { + updateColour(C_BACKGROUND); + notifyDataModified(); + int tabColourIndex; + if ((tabColourIndex = whichTabColourIndex()) != -1) + { + tabColourIndex = (int)tabColourIndex == TabBarPlus::inactiveText? TabBarPlus::inactiveBg : tabColourIndex; + TabBarPlus::setColour(_pBgColour->getColour(), (TabBarPlus::tabColourIndex)tabColourIndex); + return TRUE; + } + + apply(); + return TRUE; + } + else + return FALSE; + } + + default : + { + return FALSE; + } + } + return TRUE; + } + } + + } + default : + return FALSE; + } + return FALSE; +} + +void WordStyleDlg::loadLangListFromNppParam() +{ + NppParameters *nppParamInst = NppParameters::getInstance(); + _lsArray = nppParamInst->getLStylerArray(); + _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 ; i < _lsArray.getNbLexer() ; 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); + setStyleListFromLexer(index2Begin); +} + +void WordStyleDlg::updateThemeName(generic_string themeName) +{ + NppParameters *pNppParam = NppParameters::getInstance(); + NppGUI & nppGUI = (NppGUI & )pNppParam->getNppGUI(); + nppGUI._themeName.assign( themeName ); +} + +void WordStyleDlg::updateColour(bool which) +{ + Style & style = getCurrentStyler(); + if (which == C_FOREGROUND) + { + style._fgColor = _pFgColour->getColour(); + if (_pFgColour->isEnabled()) + style._colorStyle |= COLORSTYLE_FOREGROUND; + else + style._colorStyle &= ~COLORSTYLE_FOREGROUND; + } + else //(which == C_BACKGROUND) + { + style._bgColor = _pBgColour->getColour(); + if (_pBgColour->isEnabled()) + style._colorStyle |= COLORSTYLE_BACKGROUND; + else + style._colorStyle &= ~COLORSTYLE_BACKGROUND; + } +} + +void WordStyleDlg::updateFontSize() +{ + Style & style = getCurrentStyler(); + int iFontSizeSel = ::SendMessage(_hFontSizeCombo, CB_GETCURSEL, 0, 0); + + TCHAR intStr[5]; + if (iFontSizeSel != 0) + { + ::SendMessage(_hFontSizeCombo, CB_GETLBTEXT, iFontSizeSel, (LPARAM)intStr); + if ((!intStr) || (!intStr[0])) + style._fontSize = -1; + else + { + TCHAR *finStr; + style._fontSize = generic_strtol(intStr, &finStr, 10); + if (*finStr != '\0') + style._fontSize = -1; + } + } + else + style._fontSize = 0; +} + +void WordStyleDlg::updateExtension() +{ + const int NB_MAX = 256; + TCHAR ext[NB_MAX]; + ::SendDlgItemMessage(_hSelf, IDC_USER_EXT_EDIT, WM_GETTEXT, NB_MAX, (LPARAM)ext); + _lsArray.getLexerFromIndex(_currentLexerIndex - 1).setLexerUserExt(ext); +} + +void WordStyleDlg::updateUserKeywords() +{ + Style & style = getCurrentStyler(); + //const int NB_MAX = 2048; + //TCHAR kw[NB_MAX]; + int len = ::SendDlgItemMessage(_hSelf, IDC_USER_KEYWORDS_EDIT, WM_GETTEXTLENGTH, 0, 0); + len +=1; + TCHAR *kw = new TCHAR[len]; + ::SendDlgItemMessage(_hSelf, IDC_USER_KEYWORDS_EDIT, WM_GETTEXT, len, (LPARAM)kw); + style.setKeywords(kw); + + delete [] kw; +} + +void WordStyleDlg::updateFontName() +{ + Style & style = getCurrentStyler(); + int iFontSel = ::SendMessage(_hFontNameCombo, CB_GETCURSEL, 0, 0); + TCHAR *fnStr = (TCHAR *)::SendMessage(_hFontNameCombo, CB_GETITEMDATA, iFontSel, 0); + style._fontName = fnStr; +} + +void WordStyleDlg::updateFontStyleStatus(fontStyleType whitchStyle) +{ + Style & style = getCurrentStyler(); + if (style._fontStyle == -1) + style._fontStyle = 0; + + int fontStyle = FONTSTYLE_UNDERLINE; + HWND hWnd = _hCheckUnderline; + + if (whitchStyle == BOLD_STATUS) + { + fontStyle = FONTSTYLE_BOLD; + hWnd = _hCheckBold; + } + if (whitchStyle == ITALIC_STATUS) + { + fontStyle = FONTSTYLE_ITALIC; + hWnd = _hCheckItalic; + } + + int isChecked = ::SendMessage(hWnd, BM_GETCHECK, 0, 0); + if (isChecked != BST_INDETERMINATE) + { + if (isChecked == BST_CHECKED) + style._fontStyle |= fontStyle; + else + style._fontStyle &= ~fontStyle; + } +} + +void WordStyleDlg::switchToTheme() +{ + int iSel = ::SendMessage(_hSwitch2ThemeCombo, CB_GETCURSEL, 0, 0); + + generic_string prevThemeName(_themeName); + _themeName.clear(); + _themeName.assign( (TCHAR *)::SendMessage(_hSwitch2ThemeCombo, CB_GETITEMDATA, iSel, 0) ); + + //if (!_themeName.compare(prevThemeName) ) return; + + if ( _isThemeDirty ) { + TCHAR themeFileName[MAX_PATH]; + lstrcpy(themeFileName, prevThemeName.c_str()); + PathStripPath( themeFileName ); + PathRemoveExtension( themeFileName ); + int mb_response = + ::MessageBox( _hSelf, + 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 ); + if ( mb_response == IDYES ) (NppParameters::getInstance())->writeStyles(_lsArray, _globalStyles); + } + + + NppParameters *nppParamInst = NppParameters::getInstance(); + nppParamInst->reloadStylers(&_themeName[0]); + + loadLangListFromNppParam(); + _restoreInvalid = true; + +} + +void WordStyleDlg::setStyleListFromLexer(int index) +{ + _currentLexerIndex = index; + + // Fill out Styles listbox + // Before filling out, we clean it + ::SendDlgItemMessage(_hSelf, IDC_STYLES_LIST, LB_RESETCONTENT, 0, 0); + + if (index) + { + const TCHAR *langName = _lsArray.getLexerNameFromIndex(index - 1); + const TCHAR *ext = NppParameters::getInstance()->getLangExtFromName(langName); + const TCHAR *userExt = (_lsArray.getLexerStylerByName(langName))->getLexerUserExt(); + ::SendDlgItemMessage(_hSelf, IDC_DEF_EXT_EDIT, WM_SETTEXT, 0, (LPARAM)(ext)); + ::SendDlgItemMessage(_hSelf, IDC_USER_EXT_EDIT, WM_SETTEXT, 0, (LPARAM)(userExt)); + } + ::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_USER_EXT_EDIT), 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 ; i < lexerStyler.getNbStyler() ; 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(); +} + +void WordStyleDlg::setVisualFromStyleList() +{ + showGlobalOverrideCtrls(false); + + Style & style = getCurrentStyler(); + + // Global override style + if (lstrcmp(style._styleDesc, TEXT("Global override")) == 0) + { + showGlobalOverrideCtrls(true); + } + + //--Warning text + //bool showWarning = ((_currentLexerIndex == 0) && (style._styleID == STYLE_DEFAULT));//?SW_SHOW:SW_HIDE; + + COLORREF c = 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; + ::SendDlgItemMessage(_hSelf, IDC_LANGUAGES_LIST, LB_GETTEXT, i, (LPARAM)str); + + i = ::SendDlgItemMessage(_hSelf, IDC_STYLES_LIST, LB_GETCURSEL, 0, 0); + if (i == LB_ERR) + return; + TCHAR styleName[64]; + ::SendDlgItemMessage(_hSelf, IDC_STYLES_LIST, LB_GETTEXT, i, (LPARAM)styleName); + + lstrcat(lstrcat(str, TEXT(" : ")), styleName); + + // PAD for fix a display glitch + lstrcat(str, TEXT(" ")); + colourHooker.setColour(c); + ::SetWindowText(_hStyleInfoStaticText, str); + + //-- 2 couleurs : fg et bg + bool isEnable = false; + if (HIBYTE(HIWORD(style._fgColor)) != 0xFF) + { + _pFgColour->setColour(style._fgColor); + _pFgColour->setEnabled((style._colorStyle & COLORSTYLE_FOREGROUND) != 0); + isEnable = true; + } + enableFg(isEnable); + + isEnable = false; + if (HIBYTE(HIWORD(style._bgColor)) != 0xFF) + { + _pBgColour->setColour(style._bgColor); + _pBgColour->setEnabled((style._colorStyle & COLORSTYLE_BACKGROUND) != 0); + isEnable = true; + } + enableBg(isEnable); + + //-- font name + isEnable = false; + int iFontName; + if (style._fontName != NULL) + { + iFontName = ::SendMessage(_hFontNameCombo, CB_FINDSTRING, 1, (LPARAM)style._fontName); + if (iFontName == CB_ERR) + iFontName = 0; + isEnable = true; + } + else + { + iFontName = 0; + } + ::SendMessage(_hFontNameCombo, CB_SETCURSEL, iFontName, 0); + enableFontName(isEnable); + + //-- font size + isEnable = false; + TCHAR intStr[5] = TEXT(""); + int iFontSize = 0; + if (style._fontSize != -1) + { + wsprintf(intStr, TEXT("%d"), style._fontSize); + iFontSize = ::SendMessage(_hFontSizeCombo, CB_FINDSTRING, 1, (LPARAM)intStr); + isEnable = true; + } + ::SendMessage(_hFontSizeCombo, CB_SETCURSEL, iFontSize, 0); + enableFontSize(isEnable); + + //-- font style : bold et italic + isEnable = false; + int isBold, isItalic, isUnderline; + if (style._fontStyle != -1) + { + isBold = (style._fontStyle & FONTSTYLE_BOLD)?BST_CHECKED:BST_UNCHECKED; + isItalic = (style._fontStyle & FONTSTYLE_ITALIC)?BST_CHECKED:BST_UNCHECKED; + isUnderline = (style._fontStyle & FONTSTYLE_UNDERLINE)?BST_CHECKED:BST_UNCHECKED; + ::SendMessage(_hCheckBold, BM_SETCHECK, isBold, 0); + ::SendMessage(_hCheckItalic, BM_SETCHECK, isItalic, 0); + ::SendMessage(_hCheckUnderline, BM_SETCHECK, isUnderline, 0); + isEnable = true; + } + else // -1 est comme 0 + { + ::SendMessage(_hCheckBold, BM_SETCHECK, BST_UNCHECKED, 0); + ::SendMessage(_hCheckItalic, BM_SETCHECK, BST_UNCHECKED, 0); + ::SendMessage(_hCheckUnderline, BM_SETCHECK, BST_UNCHECKED, 0); + } + + enableFontStyle(isEnable); + + + //-- Default Keywords + bool shouldBeDisplayed = style._keywordClass != -1; + if (shouldBeDisplayed) + { + LexerStyler & lexerStyler = _lsArray.getLexerFromIndex(_currentLexerIndex - 1); + + NppParameters *pNppParams = NppParameters::getInstance(); + LangType lType = pNppParams->getLangIDFromStr(lexerStyler.getLexerName()); + if (lType == L_TXT) + { + generic_string str = lexerStyler.getLexerName(); + str += TEXT(" is not defined in NppParameters::getLangIDFromStr()"); + printStr(str.c_str()); + } + const TCHAR *kws = pNppParams->getWordList(lType, style._keywordClass); + if (!kws) + kws = TEXT(""); + ::SendDlgItemMessage(_hSelf, IDC_DEF_KEYWORDS_EDIT, WM_SETTEXT, 0, (LPARAM)(kws)); + + 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); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_DEF_KEYWORDS_STATIC), showOption); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_USER_KEYWORDS_STATIC),showOption); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_PLUSSYMBOL_STATIC),showOption); + + redraw(); +} + +void WordStyleDlg::create(int dialogID, bool isRTL) +{ + StaticDialog::create(dialogID, isRTL); + + if ((NppParameters::getInstance())->isTransparentAvailable()) + { + ::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))) + ::EnableWindow(::GetDlgItem(_hSelf, IDC_SC_PERCENTAGE_SLIDER), FALSE); + } +} + +void WordStyleDlg::apply() +{ + LexerStylerArray & lsa = (NppParameters::getInstance())->getLStylerArray(); + StyleArray & globalStyles = (NppParameters::getInstance())->getGlobalStylers(); + + lsa = _lsArray; + globalStyles = _globalStyles; + + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), FALSE); + //_isDirty = false; + //_isSync = false; + ::SendMessage(_hParent, WM_UPDATESCINTILLAS, 0, 0); +} diff --git a/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.h b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.h new file mode 100644 index 00000000..fd82ef45 --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.h @@ -0,0 +1,249 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#ifndef WORD_STYLE_H +#define WORD_STYLE_H + +#include "Window.h" +#include "ColourPicker.h" +#include "StaticDialog.h" +#include "WordStyleDlgRes.h" +#include "TabBar.h" +#include "Parameters.h" +#include "resource.h" + +#define WM_UPDATESCINTILLAS (WORDSTYLE_USER + 1) //GlobalStyleDlg's msg 2 send 2 its parent + +enum fontStyleType {BOLD_STATUS, ITALIC_STATUS, UNDERLINE_STATUS}; + +const bool C_FOREGROUND = false; +const bool C_BACKGROUND = true; + + +class ColourStaticTextHooker { +public : + ColourStaticTextHooker() : _colour(RGB(0x00, 0x00, 0x00))/*, _hFont(NULL)*/ {}; + + COLORREF setColour(COLORREF colour2Set) { + COLORREF oldColour = _colour; + _colour = colour2Set; + return oldColour; + }; + void hookOn(HWND staticHandle) { + ::SetWindowLongPtr(staticHandle, GWL_USERDATA, (LONG)this); + _oldProc = (WNDPROC)::SetWindowLongPtr(staticHandle, GWL_WNDPROC, (LONG)staticProc); + }; +private : + COLORREF _colour; + WNDPROC _oldProc; + + static BOOL CALLBACK staticProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ + ColourStaticTextHooker *pColourStaticTextHooker = reinterpret_cast(::GetWindowLongPtr(hwnd, GWL_USERDATA)); + return pColourStaticTextHooker->colourStaticProc(hwnd, message, wParam, lParam); + }; + BOOL CALLBACK colourStaticProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); +}; + +class WordStyleDlg : public StaticDialog +{ +public : + WordStyleDlg():_isDirty(false), _isThemeDirty(false), _restoreInvalid(false), /*_isSync(true),*/ _isShownGOCtrls(false){}; + + void init(HINSTANCE hInst, HWND parent) { + Window::init(hInst, parent); + }; + + virtual void create(int dialogID, bool isRTL = false); + + void doDialog(bool isRTL = false) { + if (!isCreated()) + { + create(IDD_STYLER_DLG, isRTL); + prepare2Cancel(); + } + + if (!::IsWindowVisible(_hSelf)) + { + prepare2Cancel(); + } + display(); + }; + + + + void prepare2Cancel() { + _styles2restored = (NppParameters::getInstance())->getLStylerArray(); + _gstyles2restored = (NppParameters::getInstance())->getGlobalStylers(); + _gOverride2restored = (NppParameters::getInstance())->getGlobalOverrideStyle(); + }; + + virtual void redraw() const { + _pFgColour->redraw(); + _pBgColour->redraw(); + ::InvalidateRect(_hStyleInfoStaticText, NULL, TRUE); + ::UpdateWindow(_hStyleInfoStaticText); + }; + + void restoreGlobalOverrideValues() { + GlobalOverride & gOverride = (NppParameters::getInstance())->getGlobalOverrideStyle(); + gOverride = _gOverride2restored; + }; + + void apply(); + + + +private : + ColourPicker *_pFgColour; + ColourPicker *_pBgColour; + + int _currentLexerIndex; + int _currentThemeIndex; + + HWND _hCheckBold; + HWND _hCheckItalic; + HWND _hCheckUnderline; + HWND _hFontNameCombo; + HWND _hFontSizeCombo; + HWND _hSwitch2ThemeCombo; + + HWND _hFgColourStaticText; + HWND _hBgColourStaticText; + HWND _hFontNameStaticText; + HWND _hFontSizeStaticText; + HWND _hStyleInfoStaticText; + //TCHAR _originalWarning[256]; + + LexerStylerArray _lsArray; + StyleArray _globalStyles; + generic_string _themeName; + + LexerStylerArray _styles2restored; + StyleArray _gstyles2restored; + GlobalOverride _gOverride2restored; + bool _restoreInvalid; + + ColourStaticTextHooker colourHooker; + + bool _isDirty; + bool _isThemeDirty; + //bool _isSync; + bool _isShownGOCtrls; + + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); + + + Style & getCurrentStyler() { + int styleIndex = ::SendDlgItemMessage(_hSelf, IDC_STYLES_LIST, LB_GETCURSEL, 0, 0); + if (_currentLexerIndex == 0) + return _globalStyles.getStyler(styleIndex); + else + { + LexerStyler & lexerStyler = _lsArray.getLexerFromIndex(_currentLexerIndex - 1); + return lexerStyler.getStyler(styleIndex); + } + }; + + int whichTabColourIndex() { + int i = ::SendDlgItemMessage(_hSelf, IDC_STYLES_LIST, LB_GETCURSEL, 0, 0); + if (i == LB_ERR) + return -1; + TCHAR styleName[128]; + ::SendDlgItemMessage(_hSelf, IDC_STYLES_LIST, LB_GETTEXT, i, (LPARAM)styleName); + + if (lstrcmp(styleName, TABBAR_ACTIVEFOCUSEDINDCATOR) == 0) + return (int)TabBarPlus::activeFocusedTop; + + if (lstrcmp(styleName, TABBAR_ACTIVEUNFOCUSEDINDCATOR) == 0) + return (int)TabBarPlus::activeUnfocusedTop; + + if (lstrcmp(styleName, TABBAR_ACTIVETEXT) == 0) + return (int)TabBarPlus::activeText; + + if (lstrcmp(styleName, TABBAR_INACTIVETEXT) == 0) + return (int)TabBarPlus::inactiveText; + + return -1; + }; + + void updateColour(bool which); + void updateFontStyleStatus(fontStyleType whitchStyle); + void updateExtension(); + void updateFontName(); + void updateFontSize(); + void updateUserKeywords(); + void switchToTheme(); + void updateThemeName(generic_string themeName); + + void loadLangListFromNppParam(); + + void enableFg(bool isEnable) { + ::EnableWindow(_pFgColour->getHSelf(), isEnable); + ::EnableWindow(_hFgColourStaticText, isEnable); + }; + + void enableBg(bool isEnable) { + ::EnableWindow(_pBgColour->getHSelf(), isEnable); + ::EnableWindow(_hBgColourStaticText, isEnable); + }; + + void enableFontName(bool isEnable) { + ::EnableWindow(_hFontNameCombo, isEnable); + ::EnableWindow(_hFontNameStaticText, isEnable); + }; + + void enableFontSize(bool isEnable) { + ::EnableWindow(_hFontSizeCombo, isEnable); + ::EnableWindow(_hFontSizeStaticText, isEnable); + }; + + void enableFontStyle(bool isEnable) { + ::EnableWindow(_hCheckBold, isEnable); + ::EnableWindow(_hCheckItalic, isEnable); + ::EnableWindow(_hCheckUnderline, isEnable); + }; + long notifyDataModified() { + _isDirty = true; + _isThemeDirty = true; + ::EnableWindow(::GetDlgItem(_hSelf, IDC_SAVECLOSE_BUTTON), TRUE); + return TRUE; + } + void setStyleListFromLexer(int index); + void setVisualFromStyleList(); + + void updateGlobalOverrideCtrls(); + + void showGlobalOverrideCtrls(bool show) + { + if (show) + { + updateGlobalOverrideCtrls(); + } + ::ShowWindow(::GetDlgItem(_hSelf, IDC_GLOBAL_FG_CHECK), show?SW_SHOW:SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_GLOBAL_BG_CHECK), show?SW_SHOW:SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_GLOBAL_FONT_CHECK), show?SW_SHOW:SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_GLOBAL_FONTSIZE_CHECK), show?SW_SHOW:SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_GLOBAL_BOLD_CHECK), show?SW_SHOW:SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_GLOBAL_ITALIC_CHECK), show?SW_SHOW:SW_HIDE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_GLOBAL_UNDERLINE_CHECK), show?SW_SHOW:SW_HIDE); + _isShownGOCtrls = show; + } +}; + +#endif //WORD_STYLE_H diff --git a/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.rc b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.rc new file mode 100644 index 00000000..206f04c9 --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlg.rc @@ -0,0 +1,82 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#include "windows.h" +#include "wordstyledlgres.h" + +#ifndef IDC_STATIC +#define IDC_STATIC -1 +#endif + +IDD_STYLER_DLG DIALOGEX 36, 44, 500, 246 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_TOOLWINDOW +CAPTION "Style Configurator" +FONT 8, "MS Shell Dlg", 0, 0, 0x0 +BEGIN + LTEXT "Switch to theme : ",IDC_SWITCH2THEME_STATIC,6,9,83,8,0,WS_EX_RIGHT + COMBOBOX IDC_SWITCH2THEME_COMBO,95,7,104,78,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + LTEXT "Foreground color",IDC_FG_STATIC,203,72,59,8,0,WS_EX_RIGHT + LTEXT "Background color",IDC_BG_STATIC,203,99,59,8,0,WS_EX_RIGHT + COMBOBOX IDC_FONT_COMBO,371,68,104,78,CBS_DROPDOWNLIST | CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_FONTSIZE_COMBO,442,95,33,82,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_BOLD_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,327,88,63,10 + CONTROL "Italic",IDC_ITALIC_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,327,100,62,10 + GROUPBOX "Font style",IDC_FONTGROUP_STATIC,311,52,169,77 + GROUPBOX "Colour style",IDC_COLOURGROUP_STATIC,191,52,111,77 + LTEXT "Font Name :",IDC_FONTNAME_STATIC,315,71,52,8,0,WS_EX_RIGHT + LTEXT "Font size :",IDC_FONTSIZE_STATIC,388,97,51,8,0,WS_EX_RIGHT + LTEXT "Style :",IDC_STYLEDESC_STATIC,87,34,68,8 + LTEXT " ",IDC_STYLEDESCRIPTION_STATIC,190,30,295,22 + EDITTEXT IDC_DEF_EXT_EDIT,17,215,61,14,ES_AUTOHSCROLL | ES_READONLY + LTEXT "Default ext : ",IDC_DEF_EXT_STATIC,20,203,61,8 + EDITTEXT IDC_USER_EXT_EDIT,93,215,71,14,ES_AUTOHSCROLL + LTEXT "User ext :",IDC_USER_EXT_STATIC,95,204,71,8 + CONTROL "Underline",IDC_UNDERLINE_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,327,112,80,10 + EDITTEXT IDC_DEF_KEYWORDS_EDIT,191,151,136,43,ES_MULTILINE | ES_READONLY | WS_VSCROLL + EDITTEXT IDC_USER_KEYWORDS_EDIT,347,150,134,43,ES_MULTILINE | WS_VSCROLL + LTEXT "Default keywords",IDC_DEF_KEYWORDS_STATIC,193,141,122,8 + LTEXT "User Define keywords",IDC_USER_KEYWORDS_STATIC,349,140,126,8 + LTEXT "+",IDC_PLUSSYMBOL_STATIC,335,166,8,8 + PUSHBUTTON "Cancel",IDCANCEL,332,222,57,14 + PUSHBUTTON "Save && Close",IDC_SAVECLOSE_BUTTON,255,222,69,14 + CONTROL "",IDC_SC_PERCENTAGE_SLIDER,"msctls_trackbar32",TBS_BOTH | TBS_NOTICKS | NOT WS_VISIBLE | WS_TABSTOP,441,235,53,10 + CONTROL "Transparency",IDC_SC_TRANSPARENT_CHECK,"Button",BS_AUTOCHECKBOX | NOT WS_VISIBLE | WS_TABSTOP,431,221,63,10 + LISTBOX IDC_LANGUAGES_LIST,17,46,59,146,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + LISTBOX IDC_STYLES_LIST,87,46,76,146,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_HSCROLL | WS_TABSTOP + GROUPBOX "",IDC_STATIC,7,24,166,212 + LTEXT "Language :",IDC_LANGDESC_STATIC,19,34,61,8 + GROUPBOX "",IDC_STATIC,181,24,310,184 + LTEXT "+",IDC_PLUSSYMBOL2_STATIC,83,217,8,8 + CONTROL "Enable global foreground color",IDC_GLOBAL_FG_CHECK, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,191,138,132,10 + CONTROL "Enable global background color",IDC_GLOBAL_BG_CHECK, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,191,153,131,10 + CONTROL "Enable global font",IDC_GLOBAL_FONT_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,327,134,153,10 + CONTROL "Enable global font size",IDC_GLOBAL_FONTSIZE_CHECK, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,327,149,135,10 + CONTROL "Enable global bold font style",IDC_GLOBAL_BOLD_CHECK, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,328,164,135,10 + CONTROL "Enable global Italic font style",IDC_GLOBAL_ITALIC_CHECK, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,328,179,135,10 + CONTROL "Enable global underline font style",IDC_GLOBAL_UNDERLINE_CHECK, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,328,194,135,10 + +END + diff --git a/PowerEditor/src/WinControls/ColourPicker/WordStyleDlgRes.h b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlgRes.h new file mode 100644 index 00000000..bb624a07 --- /dev/null +++ b/PowerEditor/src/WinControls/ColourPicker/WordStyleDlgRes.h @@ -0,0 +1,65 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#define IDD_STYLER_DLG 2200 + + //#define IDC_STYLETYPE_COMBO (IDD_STYLER_DLG + 1) + #define IDC_FONT_COMBO (IDD_STYLER_DLG + 2) + #define IDC_FONTSIZE_COMBO (IDD_STYLER_DLG + 3) + #define IDC_BOLD_CHECK (IDD_STYLER_DLG + 4) + #define IDC_ITALIC_CHECK (IDD_STYLER_DLG + 5) + #define IDC_FG_STATIC (IDD_STYLER_DLG + 6) + #define IDC_BG_STATIC (IDD_STYLER_DLG + 7) + #define IDC_FONTNAME_STATIC (IDD_STYLER_DLG + 8) + #define IDC_FONTSIZE_STATIC (IDD_STYLER_DLG + 9) + //#define IDC_STYLEDEFAULT_WARNING_STATIC (IDD_STYLER_DLG + 10) for the sake of compablity of traslation xml files, this number (2210) don't be use anymore by Notepad++ + #define IDC_STYLEDESC_STATIC (IDD_STYLER_DLG + 11) + #define IDC_COLOURGROUP_STATIC (IDD_STYLER_DLG + 12) + #define IDC_FONTGROUP_STATIC (IDD_STYLER_DLG + 13) + + #define IDC_DEF_EXT_STATIC (IDD_STYLER_DLG + 14) + #define IDC_DEF_EXT_EDIT (IDD_STYLER_DLG + 15) + #define IDC_USER_EXT_STATIC (IDD_STYLER_DLG + 16) + #define IDC_USER_EXT_EDIT (IDD_STYLER_DLG + 17) + #define IDC_UNDERLINE_CHECK (IDD_STYLER_DLG + 18) + #define IDC_DEF_KEYWORDS_STATIC (IDD_STYLER_DLG + 19) + #define IDC_DEF_KEYWORDS_EDIT (IDD_STYLER_DLG + 20) + #define IDC_USER_KEYWORDS_STATIC (IDD_STYLER_DLG + 21) + #define IDC_USER_KEYWORDS_EDIT (IDD_STYLER_DLG + 22) + #define IDC_PLUSSYMBOL_STATIC (IDD_STYLER_DLG + 23) + #define IDC_PLUSSYMBOL2_STATIC (IDD_STYLER_DLG + 24) + #define IDC_LANGDESC_STATIC (IDD_STYLER_DLG + 25) + + #define IDC_GLOBAL_FG_CHECK (IDD_STYLER_DLG + 26) + #define IDC_GLOBAL_BG_CHECK (IDD_STYLER_DLG + 27) + #define IDC_GLOBAL_FONT_CHECK (IDD_STYLER_DLG + 28) + #define IDC_GLOBAL_FONTSIZE_CHECK (IDD_STYLER_DLG + 29) + #define IDC_GLOBAL_BOLD_CHECK (IDD_STYLER_DLG + 30) + #define IDC_GLOBAL_ITALIC_CHECK (IDD_STYLER_DLG + 31) + #define IDC_GLOBAL_UNDERLINE_CHECK (IDD_STYLER_DLG + 32) + #define IDC_STYLEDESCRIPTION_STATIC (IDD_STYLER_DLG + 33) + +# define IDD_GLOBAL_STYLER_DLG 2300 + #define IDC_SAVECLOSE_BUTTON (IDD_GLOBAL_STYLER_DLG + 1) + #define IDC_SC_PERCENTAGE_SLIDER (IDD_GLOBAL_STYLER_DLG + 2) + #define IDC_SC_TRANSPARENT_CHECK (IDD_GLOBAL_STYLER_DLG + 3) + #define IDC_LANGUAGES_LIST (IDD_GLOBAL_STYLER_DLG + 4) + #define IDC_STYLES_LIST (IDD_GLOBAL_STYLER_DLG + 5) + #define IDC_SWITCH2THEME_STATIC (IDD_GLOBAL_STYLER_DLG + 6) + #define IDC_SWITCH2THEME_COMBO (IDD_GLOBAL_STYLER_DLG + 7) diff --git a/PowerEditor/src/WinControls/ContextMenu/ContextMenu.h b/PowerEditor/src/WinControls/ContextMenu/ContextMenu.h new file mode 100644 index 00000000..12aca7ae --- /dev/null +++ b/PowerEditor/src/WinControls/ContextMenu/ContextMenu.h @@ -0,0 +1,82 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO ( donho@altern.org ) + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#ifndef CONTEXTMENU +#define CONTEXTMENU + +#include +#include + +using namespace std; + +struct MenuItemUnit { + unsigned long _cmdID; + generic_string _itemName; + MenuItemUnit() : _cmdID(0), _itemName(TEXT("")) {}; + MenuItemUnit(unsigned long cmdID, generic_string itemName) : _cmdID(cmdID), _itemName(itemName) {}; + MenuItemUnit(unsigned long cmdID, const TCHAR *itemName) : _cmdID(cmdID){ + if (!itemName) + _itemName = TEXT(""); + else + _itemName = itemName; + }; +}; + +class ContextMenu { +public: + ContextMenu() : _hParent(NULL), _hMenu(NULL) {}; + ~ContextMenu() { + if (isCreated()) + ::DestroyMenu(_hMenu); + }; + void create(HWND hParent, const vector & menuItemArray) { + _hParent = hParent; + _hMenu = ::CreatePopupMenu(); + for (size_t i = 0 ; i < menuItemArray.size() ; i++) + { + unsigned int flag = MF_BYPOSITION | ((menuItemArray[i]._cmdID == 0)?MF_SEPARATOR:0); + ::InsertMenu(_hMenu, i, flag, menuItemArray[i]._cmdID, menuItemArray[i]._itemName.c_str()); + } + }; + 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; + ::EnableMenuItem(_hMenu, cmdID, flag); + }; + + void checkItem(int cmdID, bool doCheck) const { + ::CheckMenuItem(_hMenu, cmdID, MF_BYCOMMAND | (doCheck?MF_CHECKED:MF_UNCHECKED)); + }; + + HMENU getMenuHandle() { + return _hMenu; + }; + +private: + HWND _hParent; + HMENU _hMenu; + +}; + +#endif //CONTEXTMENU diff --git a/PowerEditor/src/WinControls/DockingWnd/CloseDown.bmp b/PowerEditor/src/WinControls/DockingWnd/CloseDown.bmp new file mode 100644 index 0000000000000000000000000000000000000000..da11fcd44bc06dc40e452229c49f2293e6ef18d8 GIT binary patch literal 486 zcmZ?rea6TD24+A~1BiK`n2|vOEWQCKFT@SOU;!ZUp9qkWUwGr?8$1YT22jn+6>ErB z15^(;7S6^r2O + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#ifndef DOCKING_H +#define DOCKING_H + +#include "windows.h" +// ATTENTION : It's a part of interface header, so don't include the others header here + +// styles for containers +#define CAPTION_TOP TRUE +#define CAPTION_BOTTOM FALSE + +// defines for docking manager +#define CONT_LEFT 0 +#define CONT_RIGHT 1 +#define CONT_TOP 2 +#define CONT_BOTTOM 3 +#define DOCKCONT_MAX 4 + +// mask params for plugins of internal dialogs +#define DWS_ICONTAB 0x00000001 // Icon for tabs are available +#define DWS_ICONBAR 0x00000002 // Icon for icon bar are available (currently not supported) +#define DWS_ADDINFO 0x00000004 // Additional information are in use +#define DWS_PARAMSALL (DWS_ICONTAB|DWS_ICONBAR|DWS_ADDINFO) + +// default docking values for first call of plugin +#define DWS_DF_CONT_LEFT (CONT_LEFT << 28) // default docking on left +#define DWS_DF_CONT_RIGHT (CONT_RIGHT << 28) // default docking on right +#define DWS_DF_CONT_TOP (CONT_TOP << 28) // default docking on top +#define DWS_DF_CONT_BOTTOM (CONT_BOTTOM << 28) // default docking on bottom +#define DWS_DF_FLOATING 0x80000000 // default state is floating + + +typedef struct { + HWND hClient; // client Window Handle + TCHAR *pszName; // name of plugin (shown in window) + int dlgID; // a funcItem provides the function pointer to start a dialog. Please parse here these ID + + // user modifications + UINT uMask; // mask params: look to above defines + HICON hIconTab; // icon for tabs + TCHAR *pszAddInfo; // for plugin to display additional informations + + // internal data, do not use !!! + RECT rcFloat; // floating position + int iPrevCont; // stores the privious container (toggling between float and dock) + const TCHAR* pszModuleName; // it's the plugin file name. It's used to identify the plugin +} tTbData; + + +typedef struct { + HWND hWnd; // the docking manager wnd + RECT rcRegion[DOCKCONT_MAX]; // position of docked dialogs +} tDockMgr; + + +#define HIT_TEST_THICKNESS 20 + +#define SPLITTER_WIDTH 4 + + +#endif // DOCKING_H diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp b/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp new file mode 100644 index 00000000..c9b5a869 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingCont.cpp @@ -0,0 +1,1408 @@ +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "dockingResource.h" +#include "math.h" +#include "Docking.h" +#include "DockingCont.h" +#include "DropData.h" +#include "SplitterContainer.h" +#include "WindowInterface.h" +#include "ToolTip.h" +#include +#include "Parameters.h" +#include "Common.h" + +#ifndef WH_MOUSE_LL +#define WH_MOUSE_LL 14 +#endif + +static HWND hWndServer = NULL; +static HHOOK hookMouse = NULL; + +static LRESULT CALLBACK hookProcMouse(UINT nCode, WPARAM wParam, LPARAM lParam) +{ + if(nCode < 0) + { + ::CallNextHookEx(hookMouse, nCode, wParam, lParam); + return 0; + } + + switch (wParam) + { + case WM_MOUSEMOVE: + case WM_NCMOUSEMOVE: + ::PostMessage(hWndServer, wParam, 0, 0); + break; + case WM_LBUTTONUP: + case WM_NCLBUTTONUP: + ::PostMessage(hWndServer, wParam, 0, 0); + break; + default: + break; + } + + return ::CallNextHookEx(hookMouse, nCode, wParam, lParam); +} + + +DockingCont::DockingCont(void) +{ + _isMouseOver = FALSE; + _isMouseClose = FALSE; + _isMouseDown = FALSE; + _isFloating = false; + _isTopCaption = CAPTION_TOP; + _dragFromTab = FALSE; + _hContTab = NULL; + _hDefaultTabProc = NULL; + _beginDrag = FALSE; + _prevItem = 0; + _hFont = NULL; + _bTabTTHover = FALSE; + _bCaptionTT = FALSE; + _bCapTTHover = FALSE; + _hoverMPos = posClose; + _bDrawOgLine = TRUE; + _vTbData.clear(); +} + +DockingCont::~DockingCont() +{ + ::DeleteObject(_hFont); +} + + +void DockingCont::doDialog(bool willBeShown, bool isFloating) +{ + if (!isCreated()) + { + create(IDD_CONTAINER_DLG); + + _isFloating = isFloating; + + if (_isFloating) + { + ::SetWindowLongPtr(_hSelf, GWL_STYLE, POPUP_STYLES); + ::SetWindowLongPtr(_hSelf, GWL_EXSTYLE, POPUP_EXSTYLES); + ::ShowWindow(_hCaption, SW_HIDE); + } + else + { + ::SetWindowLongPtr(_hSelf, GWL_STYLE, CHILD_STYLES); + ::SetWindowLongPtr(_hSelf, GWL_EXSTYLE, CHILD_EXSTYLES); + ::ShowWindow(_hCaption, SW_SHOW); + } + + //If you want defualt GUI font + _hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); + } + + display(willBeShown); +} + + +tTbData* DockingCont::createToolbar(tTbData data, Window **ppWin) +{ + tTbData *pTbData = new tTbData; + + *pTbData = data; + + // force window style of client window + ::SetWindowLongPtr(pTbData->hClient, GWL_STYLE, CHILD_STYLES); + ::SetWindowLongPtr(pTbData->hClient, GWL_EXSTYLE, CHILD_EXSTYLES); + + // restore position if plugin is in floating state + if ((_isFloating) && (::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0) == 0)) + { + reSizeToWH(pTbData->rcFloat); + } + + // set attached child window + ::SetParent(pTbData->hClient, ::GetDlgItem(_hSelf, IDC_CLIENT_TAB)); + + // set names for captions and view toolbar + viewToolbar(pTbData); + + // attach to list + _vTbData.push_back(pTbData); + + return pTbData; +} + + +void DockingCont::removeToolbar(tTbData TbData) +{ + INT iItemCnt = 0; + + // remove from list + for (size_t iTb = 0; iTb < _vTbData.size(); iTb++) + { + if (_vTbData[iTb]->hClient == TbData.hClient) + { + // remove tab + removeTab(_vTbData[iTb]); + + // free resources + delete _vTbData[iTb]; + vector::iterator itr = _vTbData.begin() + iTb; + _vTbData.erase(itr); + } + } +} + + +tTbData* DockingCont::findToolbarByWnd(HWND hClient) +{ + tTbData* pTbData = NULL; + + // find entry by handle + for (size_t iTb = 0; iTb < _vTbData.size(); iTb++) + { + if (hClient == _vTbData[iTb]->hClient) + { + pTbData = _vTbData[iTb]; + } + } + return pTbData; +} + +tTbData* DockingCont::findToolbarByName(TCHAR* pszName) +{ + tTbData* pTbData = NULL; + + // find entry by handle + for (size_t iTb = 0; iTb < _vTbData.size(); iTb++) + { + if (lstrcmp(pszName, _vTbData[iTb]->pszName) == 0) + { + pTbData = _vTbData[iTb]; + } + } + return pTbData; +} + +void DockingCont::setActiveTb(tTbData* pTbData) +{ + INT iItem = SearchPosInTab(pTbData); + setActiveTb(iItem); +} + +void DockingCont::setActiveTb(INT iItem) +{ + //if ((iItem != -1) && (iItem < ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0))) + if (iItem < ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0)) + { + SelectTab(iItem); + } +} + +INT DockingCont::getActiveTb(void) +{ + return ::SendMessage(_hContTab, TCM_GETCURSEL, 0, 0); +} + +tTbData* DockingCont::getDataOfActiveTb(void) +{ + tTbData* pTbData = NULL; + INT iItem = getActiveTb(); + + if (iItem != -1) + { + TCITEM tcItem = {0}; + + tcItem.mask = TCIF_PARAM; + ::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem); + pTbData = (tTbData*)tcItem.lParam; + } + + return pTbData; +} + +vector DockingCont::getDataOfVisTb(void) +{ + vector vTbData; + TCITEM tcItem = {0}; + INT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0); + + tcItem.mask = TCIF_PARAM; + + for(INT iItem = 0; iItem < iItemCnt; iItem++) + { + ::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem); + vTbData.push_back((tTbData*)tcItem.lParam); + } + return vTbData; +} + +bool DockingCont::isTbVis(tTbData* data) +{ + bool bRet = false; + TCITEM tcItem = {0}; + INT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0); + + tcItem.mask = TCIF_PARAM; + + for(INT iItem = 0; iItem < iItemCnt; iItem++) + { + ::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem); + if (((tTbData*)tcItem.lParam) == data) + { + bRet = true; + break; + } + } + return bRet; +} + + +// +// Process function of caption bar +// +LRESULT DockingCont::runProcCaption(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + static ToolTip toolTip; + + switch (Message) + { + case WM_LBUTTONDOWN: + { + _isMouseDown = TRUE; + + if (isInRect(hwnd, LOWORD(lParam), HIWORD(lParam)) == posClose) + { + _isMouseClose = TRUE; + _isMouseOver = TRUE; + + // start hooking + hWndServer = _hCaption; + winVer ver = (NppParameters::getInstance())->getWinVersion(); + hookMouse = ::SetWindowsHookEx(ver >= WV_W2K?WH_MOUSE_LL:WH_MOUSE, (HOOKPROC)hookProcMouse, _hInst, 0); + + if (!hookMouse) + { + DWORD dwError = ::GetLastError(); + TCHAR str[128]; + ::wsprintf(str, TEXT("GetLastError() returned %lu"), dwError); + ::MessageBox(NULL, str, TEXT("SetWindowsHookEx(MOUSE) failed"), MB_OK | MB_ICONERROR); + } + ::RedrawWindow(hwnd, NULL, NULL, TRUE); + } + + focusClient(); + return TRUE; + } + case WM_LBUTTONUP: + { + _isMouseDown = FALSE; + if (_isMouseClose == TRUE) + { + // end hooking + ::UnhookWindowsHookEx(hookMouse); + + if (_isMouseOver == TRUE) + { + doClose(); + } + _isMouseClose = FALSE; + _isMouseOver = FALSE; + } + + focusClient(); + return TRUE; + } + case WM_LBUTTONDBLCLK: + { + if (isInRect(hwnd, LOWORD(lParam), HIWORD(lParam)) == posCaption) + ::SendMessage(_hParent, DMM_FLOATALL, 0, (LPARAM)this); + + focusClient(); + return TRUE; + } + case WM_MOUSEMOVE: + { + POINT pt = {0}; + + // get correct cursor position + ::GetCursorPos(&pt); + ::ScreenToClient(_hCaption, &pt); + + if (_isMouseDown == TRUE) + { + if (_isMouseClose == FALSE) + { + // keep sure that button is still down and within caption + if ((wParam == MK_LBUTTON) && (isInRect(hwnd, pt.x, pt.y) == posCaption)) + { + _dragFromTab = FALSE; + NotifyParent(DMM_MOVE); + _isMouseDown = FALSE; + } + else + { + _isMouseDown = FALSE; + } + } + else + { + BOOL isMouseOver = _isMouseOver; + _isMouseOver = (isInRect(hwnd, pt.x, pt.y) == posClose ? TRUE : FALSE); + + // if state is changed draw new + if (_isMouseOver != isMouseOver) + { + ::SetFocus(NULL); + ::RedrawWindow(hwnd, NULL, NULL, TRUE); + } + } + } + else if (_bCapTTHover == FALSE) + { + _hoverMPos = isInRect(hwnd, LOWORD(lParam), HIWORD(lParam)); + + if ((_bCaptionTT == TRUE) || (_hoverMPos == posClose)) + { + TRACKMOUSEEVENT tme; + tme.cbSize = sizeof(tme); + tme.hwndTrack = hwnd; + tme.dwFlags = TME_LEAVE | TME_HOVER; + tme.dwHoverTime = 1000; + _bCapTTHover = _TrackMouseEvent(&tme); + } + } + else if ((_bCapTTHover == TRUE) && + (_hoverMPos != isInRect(hwnd, LOWORD(lParam), HIWORD(lParam)))) + { + toolTip.destroy(); + _bCapTTHover = FALSE; + } + return TRUE; + } + case WM_MOUSEHOVER: + { + RECT rc = {0}; + POINT pt = {0}; + + + // get mouse position + ::GetCursorPos(&pt); + + toolTip.init(_hInst, hwnd); + if (_hoverMPos == posCaption) + { + toolTip.Show(rc, _pszCaption, pt.x, pt.y + 20); + } + else + { + toolTip.Show(rc, TEXT("Close"), pt.x, pt.y + 20); + } + return TRUE; + } + case WM_MOUSELEAVE: + { + toolTip.destroy(); + _bCapTTHover = FALSE; + return TRUE; + } + case WM_SIZE: + { + ::GetWindowRect(hwnd, &_rcCaption); + ScreenRectToClientRect(hwnd, &_rcCaption); + break; + } + case WM_SETTEXT: + { + ::RedrawWindow(hwnd, NULL, NULL, TRUE); + return TRUE; + } + default: + break; + } + + return ::CallWindowProc(_hDefaultCaptionProc, hwnd, Message, wParam, lParam); +} + +void DockingCont::drawCaptionItem(DRAWITEMSTRUCT *pDrawItemStruct) +{ + HBRUSH bgbrush = NULL; + HFONT hOldFont = NULL; + RECT rc = pDrawItemStruct->rcItem; + HDC hDc = pDrawItemStruct->hDC; + HPEN hPen = ::CreatePen(PS_SOLID, 1, ::GetSysColor(COLOR_BTNSHADOW)); + BITMAP bmp = {0}; + HBITMAP hBmpCur = NULL; + HBITMAP hBmpOld = NULL; + HBITMAP hBmpNew = NULL; + UINT length = lstrlen(_pszCaption); + + INT nSavedDC = ::SaveDC(hDc); + + // begin with paint + ::SetBkMode(hDc, TRANSPARENT); + + if (_isActive == TRUE) { + bgbrush = ::CreateSolidBrush(::GetSysColor(COLOR_ACTIVECAPTION)); + ::SetTextColor(hDc, ::GetSysColor(COLOR_CAPTIONTEXT)); + } else { + bgbrush = ::CreateSolidBrush(::GetSysColor(COLOR_BTNFACE)); + } + + // set text and/or caption grid + if (_isTopCaption == TRUE) + { + if (_isActive == TRUE) + { + // fill background + ::FillRect(hDc, &rc, bgbrush); + rc.right -= 1; + rc.bottom -= 1; + } + else + { + // fill background + rc.right -= 1; + rc.bottom -= 1; + ::FillRect(hDc, &rc, bgbrush); + + // draw grid lines + HPEN hOldPen = (HPEN)::SelectObject(hDc, hPen); + + MoveToEx(hDc, rc.left , rc.top , NULL); + LineTo (hDc, rc.right, rc.top ); + LineTo (hDc, rc.right, rc.bottom ); + LineTo (hDc, rc.left , rc.bottom ); + LineTo (hDc, rc.left , rc.top); + } + + // draw text + rc.left += 2; + rc.top += 1; + rc.right -= 16; + hOldFont = (HFONT)::SelectObject(hDc, _hFont); + ::DrawText(hDc, _pszCaption, length, &rc, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS | DT_NOPREFIX); + + // calculate text size and if its trankated... + SIZE size = {0}; + GetTextExtentPoint32(hDc, _pszCaption, length, &size); + _bCaptionTT = (((rc.right - rc.left) < size.cx) ? TRUE : FALSE); + + ::SelectObject(hDc, hOldFont); + } + else + { + // create local font for vertical draw + HFONT hFont; + + if (_isActive == TRUE) + { + // fill background + ::FillRect(hDc, &rc, bgbrush); + rc.right -= 1; + rc.bottom -= 1; + } + else + { + // fill background + rc.right -= 1; + rc.bottom -= 1; + ::FillRect(hDc, &rc, bgbrush); + + // draw grid lines + HPEN hOldPen = (HPEN)::SelectObject(hDc, hPen); + + MoveToEx(hDc, rc.left , rc.top , NULL); + LineTo (hDc, rc.right, rc.top ); + LineTo (hDc, rc.right, rc.bottom ); + LineTo (hDc, rc.left , rc.bottom ); + LineTo (hDc, rc.left , rc.top); + } + + // draw text + rc.left += 1; + rc.top += HIGH_CAPTION; + // to make ellipsis working + rc.right = rc.bottom - rc.top; + rc.bottom += 14; + + hFont = ::CreateFont(12, 0, 90 * 10, 0, + FW_NORMAL, FALSE, FALSE, FALSE, + ANSI_CHARSET, OUT_DEFAULT_PRECIS, + CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, + DEFAULT_PITCH | FF_ROMAN, + TEXT("MS Shell Dlg")); + + hOldFont = (HFONT)::SelectObject(hDc, hFont); + ::DrawText(hDc, _pszCaption, length, &rc, DT_BOTTOM | DT_SINGLELINE | DT_END_ELLIPSIS | DT_NOPREFIX); + + // calculate text size and if its trankated... + SIZE size = {0}; + GetTextExtentPoint32(hDc, _pszCaption, length, &size); + _bCaptionTT = (((rc.bottom - rc.top) < size.cy) ? TRUE : FALSE); + + ::SelectObject(hDc, hOldFont); + ::DeleteObject(hFont); + } + ::DeleteObject(hPen); + ::DeleteObject(bgbrush); + + // draw button + HDC dcMem = ::CreateCompatibleDC(NULL); + + // select correct bitmap + if ((_isMouseOver == TRUE) && (_isMouseDown == TRUE)) + hBmpCur = ::LoadBitmap(_hInst, MAKEINTRESOURCE(IDB_CLOSE_DOWN)); + else + hBmpCur = ::LoadBitmap(_hInst, MAKEINTRESOURCE(IDB_CLOSE_UP)); + + // blit bitmap into the destination + ::GetObject(hBmpCur, sizeof(bmp), &bmp); + hBmpOld = (HBITMAP)::SelectObject(dcMem, hBmpCur); + hBmpNew = ::CreateCompatibleBitmap(dcMem, bmp.bmWidth, bmp.bmHeight); + + rc = pDrawItemStruct->rcItem; + ::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); + else + ::BitBlt(hDc, CLOSEBTN_POS_LEFT, CLOSEBTN_POS_LEFT, bmp.bmWidth, bmp.bmHeight, dcMem, 0, 0, SRCCOPY); + + ::SelectObject(dcMem, hBmpOld); + ::DeleteObject(hBmpCur); + ::DeleteObject(hBmpNew); + ::DeleteDC(dcMem); + + ::RestoreDC(hDc, nSavedDC); +} + +eMousePos DockingCont::isInRect(HWND hwnd, INT x, INT y) +{ + RECT rc; + eMousePos ret = posOutside; + + ::GetWindowRect(hwnd, &rc); + ScreenRectToClientRect(hwnd, &rc); + + if (_isTopCaption == TRUE) + { + if ((x > rc.left) && (x < rc.right-HIGH_CAPTION) && (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))) + { + ret = posClose; + } + } + else + { + if ((x > rc.left) && (x < rc.right) && (y > rc.top+HIGH_CAPTION) && (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)))) + { + ret = posClose; + } + } + + return ret; +} + + +//---------------------------------------------------------- +// Process function of tab +// +LRESULT DockingCont::runProcTab(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + static ToolTip toolTip; + + switch (Message) + { + case WM_LBUTTONDOWN: + { + _beginDrag = TRUE; + return TRUE; + } + case WM_LBUTTONUP: + { + INT iItem = 0; + TCHITTESTINFO info = {0}; + + // get selected sub item + info.pt.x = LOWORD(lParam); + info.pt.y = HIWORD(lParam); + iItem = ::SendMessage(hwnd, TCM_HITTEST, 0, (LPARAM)&info); + + SelectTab(iItem); + _beginDrag = FALSE; + return TRUE; + } + case WM_LBUTTONDBLCLK: + { + NotifyParent((_isFloating == true)?DMM_DOCK:DMM_FLOAT); + return TRUE; + } + case WM_MBUTTONUP: + { + INT iItem = 0; + TCITEM tcItem = {0}; + TCHITTESTINFO info = {0}; + + // get selected sub item + info.pt.x = LOWORD(lParam); + info.pt.y = HIWORD(lParam); + iItem = ::SendMessage(hwnd, TCM_HITTEST, 0, (LPARAM)&info); + + SelectTab(iItem); + + // get data and hide toolbar + tcItem.mask = TCIF_PARAM; + ::SendMessage(hwnd, TCM_GETITEM, iItem, (LPARAM)&tcItem); + + // notify child windows + if (NotifyParent(DMM_CLOSE) == 0) + { + hideToolbar((tTbData*)tcItem.lParam); + } + return TRUE; + } + case WM_MOUSEMOVE: + { + INT iItem = 0; + TCHITTESTINFO info = {0}; + + // get selected sub item + info.pt.x = LOWORD(lParam); + info.pt.y = HIWORD(lParam); + iItem = ::SendMessage(hwnd, TCM_HITTEST, 0, (LPARAM)&info); + + if ((_beginDrag == TRUE) && (wParam == MK_LBUTTON)) + { + + SelectTab(iItem); + + // send moving message to parent window + _dragFromTab = TRUE; + NotifyParent(DMM_MOVE); + _beginDrag = FALSE; + } + else + { + INT iItemSel = ::SendMessage(hwnd, TCM_GETCURSEL, 0, 0); + + if ((_bTabTTHover == FALSE) && (iItem != iItemSel)) + { + TRACKMOUSEEVENT tme; + tme.cbSize = sizeof(tme); + tme.hwndTrack = hwnd; + tme.dwFlags = TME_LEAVE | TME_HOVER; + tme.dwHoverTime = 1000; + _bTabTTHover = _TrackMouseEvent(&tme); + } + else + { + if (iItem == iItemSel) + { + toolTip.destroy(); + _bTabTTHover = FALSE; + } + else if (iItem != _iLastHovered) + { + TCITEM tcItem = {0}; + RECT rc = {0}; + + // destroy old tooltip + toolTip.destroy(); + + // recalc mouse position + ::ClientToScreen(hwnd, &info.pt); + + // get text of toolbar + tcItem.mask = TCIF_PARAM; + ::SendMessage(hwnd, TCM_GETITEM, iItem, (LPARAM)&tcItem); + + toolTip.init(_hInst, hwnd); + toolTip.Show(rc, ((tTbData*)tcItem.lParam)->pszName, info.pt.x, info.pt.y + 20); + } + } + + // save last hovered item + _iLastHovered = iItem; + + _beginDrag = FALSE; + } + return TRUE; + } + case WM_MOUSEHOVER: + { + INT iItem = 0; + TCITEM tcItem = {0}; + RECT rc = {0}; + TCHITTESTINFO info = {0}; + + // get selected sub item + info.pt.x = LOWORD(lParam); + info.pt.y = HIWORD(lParam); + iItem = ::SendMessage(hwnd, TCM_HITTEST, 0, (LPARAM)&info); + + // recalc mouse position + ::ClientToScreen(hwnd, &info.pt); + + // get text of toolbar + tcItem.mask = TCIF_PARAM; + ::SendMessage(hwnd, TCM_GETITEM, iItem, (LPARAM)&tcItem); + + toolTip.init(_hInst, hwnd); + toolTip.Show(rc, ((tTbData*)tcItem.lParam)->pszName, info.pt.x, info.pt.y + 20); + return TRUE; + } + case WM_MOUSELEAVE: + { + toolTip.destroy(); + _bTabTTHover = FALSE; + return TRUE; + } + case WM_NOTIFY: + { + LPNMHDR lpnmhdr = (LPNMHDR)lParam; + + if ((lpnmhdr->hwndFrom == _hContTab) && (lpnmhdr->code == TCN_GETOBJECT)) + { + INT iItem = 0; + TCHITTESTINFO info = {0}; + + // get selected sub item + info.pt.x = LOWORD(lParam); + info.pt.y = HIWORD(lParam); + iItem = ::SendMessage(hwnd, TCM_HITTEST, 0, (LPARAM)&info); + + SelectTab(iItem); + } + break; + } + default: + break; + } + + return ::CallWindowProc(_hDefaultTabProc, hwnd, Message, wParam, lParam); +} + +void DockingCont::drawTabItem(DRAWITEMSTRUCT *pDrawItemStruct) +{ + TCITEM tcItem = {0}; + RECT rc = pDrawItemStruct->rcItem; + + INT nTab = pDrawItemStruct->itemID; + bool isSelected = (nTab == getActiveTb()); + + // get current selected item + tcItem.mask = TCIF_PARAM; + ::SendMessage(_hContTab, TCM_GETITEM, nTab, (LPARAM)&tcItem); + + TCHAR* text = ((tTbData*)tcItem.lParam)->pszName; + INT length = lstrlen(((tTbData*)tcItem.lParam)->pszName); + + + // get drawing context + HDC hDc = pDrawItemStruct->hDC; + + INT nSavedDC = ::SaveDC(hDc); + + // For some bizarre reason the rcItem you get extends above the actual + // drawing area. We have to workaround this "feature". + rc.top += ::GetSystemMetrics(SM_CYEDGE); + + ::SetBkMode(hDc, TRANSPARENT); + HBRUSH hBrush = ::CreateSolidBrush(::GetSysColor(COLOR_BTNFACE)); + ::FillRect(hDc, &rc, hBrush); + ::DeleteObject((HGDIOBJ)hBrush); + + // draw orange bar + if ((_bDrawOgLine == TRUE) && (isSelected)) + { + RECT barRect = rc; + barRect.top += rc.bottom - 4; + + hBrush = ::CreateSolidBrush(RGB(250, 170, 60)); + ::FillRect(hDc, &barRect, hBrush); + ::DeleteObject((HGDIOBJ)hBrush); + + } + + // draw icon if enabled + if (((tTbData*)tcItem.lParam)->uMask & DWS_ICONTAB) + { + HIMAGELIST hImageList = (HIMAGELIST)::SendMessage(_hParent, DMM_GETIMAGELIST, 0, 0); + INT iPosImage = ::SendMessage(_hParent, DMM_GETICONPOS, 0, (LPARAM)((tTbData*)tcItem.lParam)->hClient); + + if ((hImageList != NULL) && (iPosImage >= 0)) + { + // Get height of image so we + IMAGEINFO info = {0}; + RECT & imageRect = info.rcImage; + + ImageList_GetImageInfo(hImageList, iPosImage, &info); + ImageList_Draw(hImageList, iPosImage, hDc, rc.left + 3, 2, ILD_NORMAL); + + if (isSelected == true) + { + rc.left += imageRect.right - imageRect.left + 5; + } + } + } + + if (isSelected == true) + { + COLORREF _unselectedColor = RGB(0, 0, 0); + ::SetTextColor(hDc, _unselectedColor); + + // draw text + rc.top -= ::GetSystemMetrics(SM_CYEDGE); + ::SelectObject(hDc, _hFont); + ::DrawText(hDc, text, length, &rc, DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX); + } + + ::RestoreDC(hDc, nSavedDC); +} + + +//---------------------------------------------- +// Process function of dialog +// +BOOL CALLBACK DockingCont::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_NCACTIVATE: + { + // Note: lParam to identify the trigger window + if ((INT)lParam != -1) + { + ::SendMessage(_hParent, WM_NCACTIVATE, wParam, 0); + } + break; + } + case WM_INITDIALOG: + { + _hContTab = ::GetDlgItem(_hSelf, IDC_TAB_CONT); + _hCaption = ::GetDlgItem(_hSelf, IDC_BTN_CAPTION); + + // intial subclassing of caption + ::SetWindowLongPtr(_hCaption, GWL_USERDATA, reinterpret_cast(this)); + _hDefaultCaptionProc = reinterpret_cast(::SetWindowLongPtr(_hCaption, GWL_WNDPROC, reinterpret_cast(wndCaptionProc))); + + // intial subclassing of tab + ::SetWindowLongPtr(_hContTab, GWL_USERDATA, reinterpret_cast(this)); + _hDefaultTabProc = reinterpret_cast(::SetWindowLongPtr(_hContTab, GWL_WNDPROC, reinterpret_cast(wndTabProc))); + + // set min tab width + ::SendMessage(_hContTab, TCM_SETMINTABWIDTH, 0, (LPARAM)MIN_TABWIDTH); + break; + } + case WM_NCCALCSIZE: + case WM_SIZE: + { + onSize(); + break; + } + case WM_DRAWITEM : + { + // draw tab or caption + if (((DRAWITEMSTRUCT *)lParam)->CtlID == IDC_TAB_CONT) + { + drawTabItem((DRAWITEMSTRUCT *)lParam); + return TRUE; + } + else + { + drawCaptionItem((DRAWITEMSTRUCT *)lParam); + return TRUE; + } + break; + } + case WM_NCLBUTTONDBLCLK : + { + RECT rcWnd = {0}; + RECT rcClient = {0}; + POINT pt = {HIWORD(lParam), LOWORD(lParam)}; + + getWindowRect(rcWnd); + getClientRect(rcClient); + ClientRectToScreenRect(_hSelf, &rcClient); + rcWnd.bottom = rcClient.top; + + // if in caption + if ((rcWnd.top < pt.x) && (rcWnd.bottom > pt.x) && + (rcWnd.left < pt.y) && (rcWnd.right > pt.y)) + { + NotifyParent(DMM_DOCKALL); + return TRUE; + } + break; + } + case WM_SYSCOMMAND : + { + switch (wParam & 0xfff0) + { + case SC_MOVE: + NotifyParent(DMM_MOVE); + return TRUE; + default: + break; + } + return FALSE; + } + case WM_COMMAND : + { + switch (LOWORD(wParam)) + { + case IDCANCEL: + doClose(); + return TRUE; + default : + break; + } + break; + } + default: + break; + } + + return FALSE; +} + +void DockingCont::onSize(void) +{ + TCITEM tcItem = {0}; + RECT rc = {0}; + RECT rcTemp = {0}; + UINT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0); + UINT iTabOff = 0; + + getClientRect(rc); + + if (iItemCnt >= 1) + { + // resize to docked window + if (_isFloating == false) + { + // 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; + } + else + { + ::SetWindowPos(_hCaption, NULL, rc.left, rc.top, HIGH_CAPTION, rc.bottom, SWP_NOZORDER | SWP_NOACTIVATE); + rc.left += HIGH_CAPTION; + rc.right -= HIGH_CAPTION; + } + + if (iItemCnt >= 2) + { + // resize tab and plugin control if tabs exceeds one + // resize tab + rcTemp = rc; + rcTemp.top = (rcTemp.bottom + rcTemp.top) - (HIGH_TAB+CAPTION_GAP); + rcTemp.bottom = HIGH_TAB; + iTabOff = HIGH_TAB; + + ::SetWindowPos(_hContTab, NULL, + rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom, + SWP_NOZORDER | SWP_SHOWWINDOW | SWP_NOACTIVATE); + } + + // resize client area for plugin + rcTemp = rc; + if (_isTopCaption == TRUE) + { + rcTemp.top += CAPTION_GAP; + rcTemp.bottom -= (iTabOff + CAPTION_GAP); + } + else + { + rcTemp.left += CAPTION_GAP; + rcTemp.right -= CAPTION_GAP; + rcTemp.bottom -= iTabOff; + } + + // set position of client area + ::SetWindowPos(::GetDlgItem(_hSelf, IDC_CLIENT_TAB), NULL, + rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom, + SWP_NOZORDER | SWP_NOACTIVATE); + } + // resize to float window + else + { + // update floating size + if (_isFloating == true) + { + for (size_t iTb = 0; iTb < _vTbData.size(); iTb++) + { + getWindowRect(_vTbData[iTb]->rcFloat); + } + } + + // draw caption + if (iItemCnt >= 2) + { + // resize tab if size of elements exceeds one + rcTemp = rc; + rcTemp.top = rcTemp.bottom - (HIGH_TAB+CAPTION_GAP); + rcTemp.bottom = HIGH_TAB; + + ::SetWindowPos(_hContTab, NULL, + rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom, + SWP_NOZORDER | SWP_SHOWWINDOW); + } + + // resize client area for plugin + rcTemp = rc; + rcTemp.bottom -= ((iItemCnt == 1)?0:HIGH_TAB); + + ::SetWindowPos(::GetDlgItem(_hSelf, IDC_CLIENT_TAB), NULL, + rcTemp.left, rcTemp.top, rcTemp.right, rcTemp.bottom, + SWP_NOZORDER | SWP_NOACTIVATE); + } + + + // get active item data + UINT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0); + + // resize visible plugin windows + for (UINT iItem = 0; iItem < iItemCnt; iItem++) + { + tcItem.mask = TCIF_PARAM; + ::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem); + + ::SetWindowPos(((tTbData*)tcItem.lParam)->hClient, NULL, + 0, 0, rcTemp.right, rcTemp.bottom, + SWP_NOZORDER); + } + } +} + +void DockingCont::doClose(void) +{ + INT iItemOff = 0; + INT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0); + + for (INT iItem = 0; iItem < iItemCnt; iItem++) + { + TCITEM tcItem = {0}; + + // get item data + SelectTab(iItemOff); + tcItem.mask = TCIF_PARAM; + ::SendMessage(_hContTab, TCM_GETITEM, iItemOff, (LPARAM)&tcItem); + + // notify child windows + if (NotifyParent(DMM_CLOSE) == 0) + { + // delete tab + hideToolbar((tTbData*)tcItem.lParam); + } + else + { + iItemOff++; + } + } + + if (iItemOff == 0) + { + // hide dialog first + this->doDialog(false); + ::SendMessage(_hParent, WM_SIZE, 0, 0); + } +} + +void DockingCont::showToolbar(tTbData* pTbData, BOOL state) +{ + if (state == SW_SHOW) + { + viewToolbar(pTbData); + } + else + { + hideToolbar(pTbData); + } +} + +INT DockingCont::hideToolbar(tTbData *pTbData, BOOL hideClient) +{ + INT iItem = SearchPosInTab(pTbData); + + // delete item + if (TRUE == ::SendMessage(_hContTab, TCM_DELETEITEM, iItem, 0)) + { + UINT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0); + + if (iItemCnt != 0) + { + TCITEM tcItem = {0}; + + tcItem.mask = TCIF_PARAM; + + if (iItem == iItemCnt) + { + iItem--; + } + + // activate new selected item and view plugin dialog + _prevItem = iItem; + SelectTab(iItem); + + // hide tabs if only one element + if (iItemCnt == 1) + { + ::ShowWindow(_hContTab, SW_HIDE); + } + } + else + { + // hide dialog + this->doDialog(false); + + // send message to docking manager for resize + if (!_isFloating) + { + ::SendMessage(_hParent, WM_SIZE, 0, 0); + } + } + + // keep sure, that client is hide!!! + if (hideClient == TRUE) + { + ::ShowWindow(pTbData->hClient, SW_HIDE); + } + } + onSize(); + + return iItem; +} + +void DockingCont::viewToolbar(tTbData *pTbData) +{ + TCITEM tcItem = {0}; + INT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0); + + if (iItemCnt > 0) + { + UINT iItem = getActiveTb(); + + tcItem.mask = TCIF_PARAM; + ::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem); + + // hide active dialog + ::ShowWindow(((tTbData*)tcItem.lParam)->hClient, SW_HIDE); + } + + // create new tab if it not exists + INT iTabPos = SearchPosInTab(pTbData); + if (iTabPos == -1) + { + // set only params and text even if icon available + tcItem.mask = TCIF_PARAM; + tcItem.lParam = (LPARAM)pTbData; + ::SendMessage(_hContTab, TCM_INSERTITEM, iItemCnt, (LPARAM)&tcItem); + SelectTab(iItemCnt); + } + // if exists select it and update data + else + { + tcItem.mask = TCIF_PARAM; + tcItem.lParam = (LPARAM)pTbData; + ::SendMessage(_hContTab, TCM_SETITEM, iTabPos, (LPARAM)&tcItem); + SelectTab(iTabPos); + } + + // show dialog and notify parent to update dialog view + if (isVisible() == false) + { + this->doDialog(); + ::SendMessage(_hParent, WM_SIZE, 0, 0); + } + + // set position of client + onSize(); +} + +INT DockingCont::SearchPosInTab(tTbData* pTbData) +{ + TCITEM tcItem = {0}; + INT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0); + INT ret = -1; + + tcItem.mask = TCIF_PARAM; + + for (INT iItem = 0; iItem < iItemCnt; iItem++) + { + ::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem); + + if (((tTbData*)tcItem.lParam)->hClient == pTbData->hClient) + { + ret = iItem; + break; + } + } + return ret; +} + +void DockingCont::SelectTab(INT iTab) +{ + if (iTab != -1) + { + TCHAR *pszMaxTxt = NULL; + TCITEM tcItem = {0}; + SIZE size = {0}; + INT maxWidth = 0; + INT iItemCnt = ::SendMessage(_hContTab, TCM_GETITEMCOUNT, 0, 0); + + // get data of new active dialog + tcItem.mask = TCIF_PARAM; + ::SendMessage(_hContTab, TCM_GETITEM, iTab, (LPARAM)&tcItem); + + // show active dialog + ::ShowWindow(((tTbData*)tcItem.lParam)->hClient, SW_SHOW); + ::SetFocus(((tTbData*)tcItem.lParam)->hClient); + + if (iTab != _prevItem) + { + // hide previous dialog + ::SendMessage(_hContTab, TCM_GETITEM, _prevItem, (LPARAM)&tcItem); + ::ShowWindow(((tTbData*)tcItem.lParam)->hClient, SW_HIDE); + } + + // resize tab item + + // get at first largest item ... + HDC hDc = ::GetDC(_hContTab); + SelectObject(hDc, _hFont); + + for (INT iItem = 0; iItem < iItemCnt; iItem++) + { + TCHAR *pszTabTxt = NULL; + + ::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem); + pszTabTxt = ((tTbData*)tcItem.lParam)->pszName; + + // get current font width + GetTextExtentPoint32(hDc, pszTabTxt, lstrlen(pszTabTxt), &size); + + if (maxWidth < size.cx) + { + maxWidth = size.cx; + pszMaxTxt = pszTabTxt; + } + } + ::ReleaseDC(_hSelf, hDc); + + tcItem.mask = TCIF_TEXT; + for (INT iItem = 0; iItem < iItemCnt; iItem++) + { + if (iItem == iTab) + { + // fake here an icon before text ... + TCHAR szText[64]; + + lstrcpy(szText, TEXT(" ")); + lstrcat(szText, pszMaxTxt); + tcItem.pszText = szText; + tcItem.cchTextMax = lstrlen(szText); + } + else + { + // ... and resize old and new item + tcItem.pszText = TEXT(""); + tcItem.cchTextMax = lstrlen(TEXT("")); + } + ::SendMessage(_hContTab, TCM_SETITEM, iItem, (LPARAM)&tcItem); + } + + // selects the pressed tab and store previous tab + ::SendMessage(_hContTab, TCM_SETCURSEL, iTab, 0); + _prevItem = iTab; + + // update caption text + updateCaption(); + + onSize(); + } +} + +void DockingCont::updateCaption(void) +{ + if (!_hContTab) + return; + + TCITEM tcItem = {0}; + INT iItem = getActiveTb(); + + if (iItem < 0) + return; + + // get data of new active dialog + tcItem.mask = TCIF_PARAM; + ::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem); + + // update caption text + lstrcpy(_pszCaption, ((tTbData*)tcItem.lParam)->pszName); + + // test if additional information are available + if ((((tTbData*)tcItem.lParam)->uMask & DWS_ADDINFO) && + (lstrlen(((tTbData*)tcItem.lParam)->pszAddInfo) != 0)) + { + lstrcat(_pszCaption, TEXT(" - ")); + lstrcat(_pszCaption, ((tTbData*)tcItem.lParam)->pszAddInfo); + } + + if (_isFloating == true) + { + ::SetWindowText(_hSelf, _pszCaption); + } + else + { + ::SetWindowText(_hCaption, _pszCaption); + } +} + +void DockingCont::focusClient(void) +{ + TCITEM tcItem = {0}; + INT iItem = getActiveTb(); + + if (iItem != -1) + { + // get data of new active dialog + tcItem.mask = TCIF_PARAM; + ::SendMessage(_hContTab, TCM_GETITEM, iItem, (LPARAM)&tcItem); + + // set focus + ::SetFocus(((tTbData*)tcItem.lParam)->hClient); + } +} + +LPARAM DockingCont::NotifyParent(UINT message) +{ + return ::SendMessage(_hParent, message, 0, (LPARAM)this); +} + diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingCont.h b/PowerEditor/src/WinControls/DockingWnd/DockingCont.h new file mode 100644 index 00000000..2daae843 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingCont.h @@ -0,0 +1,234 @@ +// this file is part of docking functionality for Notepad++ +// Copyright (C)2005 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. +// +// This program is distributed in the hope that it will be useful, +// 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. + + +#ifndef DOCKINGCONT +#define DOCKINGCONT + +#include "StaticDialog.h" +#include "Resource.h" +#include "Docking.h" +#include +#include +#include +#include + +using namespace std; + + +// window styles +#define POPUP_STYLES (WS_POPUP|WS_CLIPSIBLINGS|WS_CAPTION|WS_SYSMENU|WS_THICKFRAME|WS_MAXIMIZEBOX) +#define POPUP_EXSTYLES (WS_EX_CONTROLPARENT|WS_EX_WINDOWEDGE|WS_EX_TOOLWINDOW) +#define CHILD_STYLES (WS_CHILD) +#define CHILD_EXSTYLES (0x00000000L) + +#define MIN_TABWIDTH 24 + + +enum eMousePos { + posOutside, + posCaption, + posClose +}; + +// some fix modify values for GUI +#define HIGH_CAPTION 18 +#define HIGH_TAB 20 +#define CAPTION_GAP 2 +#define CLOSEBTN_POS_LEFT 3 +#define CLOSEBTN_POS_TOP 3 + + + + +class DockingCont : public StaticDialog +{ +public: + DockingCont(); + ~DockingCont(); + + HWND getTabWnd(void) { + return _hContTab; + }; + HWND getCaptionWnd(void) { + if (_isFloating == false) + return _hCaption; + else + return _hSelf; + }; + + tTbData* createToolbar(tTbData data, Window **ppWin); + void removeToolbar(tTbData data); + tTbData* findToolbarByWnd(HWND hClient); + tTbData* findToolbarByName(TCHAR* pszName); + + void showToolbar(tTbData *pTbData, BOOL state); + + BOOL updateInfo(HWND hClient) { + for (size_t iTb = 0; iTb < _vTbData.size(); iTb++) + { + if (_vTbData[iTb]->hClient == hClient) + { + updateCaption(); + return TRUE; + } + } + return FALSE; + }; + + void setActiveTb(tTbData* pTbData); + void setActiveTb(INT iItem); + INT getActiveTb(void); + tTbData* getDataOfActiveTb(void); + vector getDataOfAllTb(void) { + return _vTbData; + }; + vector getDataOfVisTb(void); + bool isTbVis(tTbData* data); + + void doDialog(bool willBeShown = true, bool isFloating = false); + + bool isFloating(void) { + return _isFloating; + } + + INT getElementCnt(void) { + return _vTbData.size(); + } + + // interface function for gripper + BOOL startMovingFromTab(void) { + BOOL dragFromTabTemp = _dragFromTab; + _dragFromTab = FALSE; + return dragFromTabTemp; + }; + + void setCaptionTop(BOOL isTopCaption) { + _isTopCaption = (isTopCaption == CAPTION_TOP); + onSize(); + }; + + void focusClient(void); + + void SetActive(BOOL bState) { + _isActive = bState; + updateCaption(); + }; + + void setTabStyle(const BOOL & bDrawOgLine) { + _bDrawOgLine = bDrawOgLine; + RedrawWindow(_hContTab, NULL, NULL, 0); + }; + + virtual void destroy() { + for (INT iTb = _vTbData.size(); iTb > 0; iTb--) + { + delete _vTbData[iTb-1]; + } + ::DestroyWindow(_hSelf); + }; + +protected : + + // Subclassing caption + LRESULT runProcCaption(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); + static LRESULT CALLBACK wndCaptionProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { + return (((DockingCont *)(::GetWindowLongPtr(hwnd, GWL_USERDATA)))->runProcCaption(hwnd, Message, wParam, lParam)); + }; + + // Subclassing tab + LRESULT runProcTab(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); + static LRESULT CALLBACK wndTabProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { + return (((DockingCont *)(::GetWindowLongPtr(hwnd, GWL_USERDATA)))->runProcTab(hwnd, Message, wParam, lParam)); + }; + + virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + + // drawing functions + void drawCaptionItem(DRAWITEMSTRUCT *pDrawItemStruct); + void drawTabItem(DRAWITEMSTRUCT *pDrawItemStruct); + void onSize(void); + + // functions for caption handling and drawing + eMousePos isInRect(HWND hwnd, INT x, INT y); + + // handling of toolbars + void doClose(void); + + // return new item + INT SearchPosInTab(tTbData* pTbData); + void SelectTab(INT iTab); + + INT hideToolbar(tTbData* pTbData, BOOL hideClient = TRUE); + void viewToolbar(tTbData *pTbData); + INT removeTab(tTbData* pTbData) { + return hideToolbar(pTbData, FALSE); + }; + + void updateCaption(void); + LPARAM NotifyParent(UINT message); + +private: + // handles + BOOL _isActive; + bool _isFloating; + HWND _hCaption; + HWND _hContTab; + + // horizontal font for caption and tab + HFONT _hFont; + + // caption params + BOOL _isTopCaption; + TCHAR _pszCaption[256]; + BOOL _isMouseDown; + BOOL _isMouseClose; + BOOL _isMouseOver; + RECT _rcCaption; + + // tab style + BOOL _bDrawOgLine; + + // Important value for DlgMoving class + BOOL _dragFromTab; + + // subclassing handle for caption + WNDPROC _hDefaultCaptionProc; + + // subclassing handle for tab + WNDPROC _hDefaultTabProc; + + // for moving and reordering + UINT _prevItem; + BOOL _beginDrag; + HIMAGELIST _hImageList; + + // Is tooltip + BOOL _bTabTTHover; + INT _iLastHovered; + + BOOL _bCaptionTT; + BOOL _bCapTTHover; + eMousePos _hoverMPos; + + // data of added windows + vector _vTbData; +}; + + + +#endif // DOCKINGCONT diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingDlgInterface.h b/PowerEditor/src/WinControls/DockingWnd/DockingDlgInterface.h new file mode 100644 index 00000000..8be2d245 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingDlgInterface.h @@ -0,0 +1,136 @@ +/* +this file is part of Function List Plugin for Notepad++ +Copyright (C)2005 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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#ifndef DOCKINGDLGINTERFACE_H +#define DOCKINGDLGINTERFACE_H + +#include "StaticDialog.h" +#include "dockingResource.h" +#include "Docking.h" +#include + + +class DockingDlgInterface : public StaticDialog +{ +public: + DockingDlgInterface(): StaticDialog() {}; + DockingDlgInterface(int dlgID): StaticDialog(), + _dlgID(dlgID), _isFloating(TRUE), _iDockedPos(0) {}; + + virtual void init(HINSTANCE hInst, HWND parent) + { + StaticDialog::init(hInst, parent); + ::GetModuleFileName((HMODULE)hInst, _moduleName, MAX_PATH); + lstrcpy(_moduleName, PathFindFileName(_moduleName)); + } + + void create(tTbData * data, bool isRTL = false){ + StaticDialog::create(_dlgID, isRTL); + ::GetWindowText(_hSelf, _pluginName, MAX_PATH); + + // user information + data->hClient = _hSelf; + data->pszName = _pluginName; + + // supported features by plugin + data->uMask = 0; + + // icons + //data->hIconBar = ::LoadIcon(hInst, IDB_CLOSE_DOWN); + //data->hIconTab = ::LoadIcon(hInst, IDB_CLOSE_DOWN); + + // additional info + data->pszAddInfo = NULL; + + _data = data; + + }; + + virtual void updateDockingDlg(void) { + ::SendMessage(_hParent, NPPM_DMMUPDATEDISPINFO, 0, (LPARAM)_hSelf); + } + + virtual void destroy() { + }; + + virtual void display(bool toShow = true) const { + ::SendMessage(_hParent, toShow?NPPM_DMMSHOW:NPPM_DMMHIDE, 0, (LPARAM)_hSelf); + }; + + const TCHAR * getPluginFileName() const { + return _moduleName; + }; + +protected : + virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) + { + switch (message) + { + + case WM_NOTIFY: + { + LPNMHDR pnmh = (LPNMHDR)lParam; + + if (pnmh->hwndFrom == _hParent) + { + switch (LOWORD(pnmh->code)) + { + case DMN_CLOSE: + { + //::MessageBox(_hSelf, TEXT("Close Dialog"), TEXT("Plugin Message"), MB_OK); + break; + } + case DMN_FLOAT: + { + //::MessageBox(_hSelf, TEXT("Float Dialog"), TEXT("Plugin Message"), MB_OK); + _isFloating = true; + break; + } + case DMN_DOCK: + { + //TCHAR test[256]; + //wsprintf(test, TEXT("Dock Dialog to %d"), HIWORD(pnmh->code)); + //::MessageBox(_hSelf, test, TEXT("Plugin Message"), MB_OK); + _iDockedPos = HIWORD(pnmh->code); + _isFloating = false; + break; + } + default: + break; + } + } + break; + } + default: + break; + } + return FALSE; + }; + + // Handles + HWND _HSource; + tTbData* _data; + int _dlgID; + bool _isFloating; + int _iDockedPos; + TCHAR _moduleName[MAX_PATH]; + TCHAR _pluginName[MAX_PATH]; +}; + +#endif // DOCKINGDLGINTERFACE_H diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingGUIWidget.rc b/PowerEditor/src/WinControls/DockingWnd/DockingGUIWidget.rc new file mode 100644 index 00000000..64e4e167 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingGUIWidget.rc @@ -0,0 +1,22 @@ + +#include +#include "dockingResource.h" + +IDD_CONTAINER_DLG DIALOGEX 0, 0, 186, 103 +STYLE DS_SETFONT | DS_SETFOREGROUND | WS_MAXIMIZEBOX | WS_POPUP | + WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME +EXSTYLE WS_EX_TOOLWINDOW +CAPTION "Selected Tab" +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x1 +BEGIN + CONTROL "Caption",IDC_BTN_CAPTION,"Button",BS_OWNERDRAW | NOT + WS_VISIBLE,0,0,186,10 + LTEXT "",IDC_CLIENT_TAB,16,28,156,50,NOT WS_GROUP + CONTROL "Tab1",IDC_TAB_CONT,"SysTabControl32",TCS_BOTTOM | + TCS_OWNERDRAWFIXED | NOT WS_VISIBLE,0,14,185,88 +END + + +IDB_CLOSE_DOWN BITMAP "CloseDown.bmp" +IDB_CLOSE_UP BITMAP "CloseUp.bmp" + diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingManager.cpp b/PowerEditor/src/WinControls/DockingWnd/DockingManager.cpp new file mode 100644 index 00000000..4311ffc8 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingManager.cpp @@ -0,0 +1,876 @@ +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + + +#include "DockingCont.h" +#include "DockingManager.h" +#include "Gripper.h" +#include +#include + + +BOOL DockingManager::_isRegistered = FALSE; + +//Window of event handling DockingManager (can only be one) +static HWND hWndServer = NULL; +//Next hook in line +static HHOOK gWinCallHook = NULL; +LRESULT CALLBACK FocusWndProc(int nCode, WPARAM wParam, LPARAM lParam); + +/* Callback function that handles messages (to test focus) */ +LRESULT CALLBACK FocusWndProc(int nCode, WPARAM wParam, LPARAM lParam) { + if (nCode == HC_ACTION && hWndServer) { + DockingManager *pDockingManager = (DockingManager *)::GetWindowLongPtr(hWndServer, GWL_USERDATA); + if (pDockingManager) { + vector & vcontainer = pDockingManager->getContainerInfo(); + CWPSTRUCT * pCwp = (CWPSTRUCT*)lParam; + if (pCwp->message == WM_KILLFOCUS) { + for (int i = 0; i < DOCKCONT_MAX; i++) + { + vcontainer[i]->SetActive(FALSE); //deactivate all containers + } + } else if (pCwp->message == WM_SETFOCUS) { + for (int i = 0; i < DOCKCONT_MAX; i++) + { + vcontainer[i]->SetActive(IsChild(vcontainer[i]->getHSelf(), pCwp->hwnd)); //activate the container that contains the window with focus, this can be none + } + } + } + } + return CallNextHookEx(gWinCallHook, nCode, wParam, lParam); +} + +DockingManager::DockingManager() +{ + _isInitialized = FALSE; + _hImageList = NULL; + memset(_iContMap, -1, CONT_MAP_MAX); + + _iContMap[0] = CONT_LEFT; + _iContMap[1] = CONT_RIGHT; + _iContMap[2] = CONT_TOP; + _iContMap[3] = CONT_BOTTOM; + + /* create four containers with splitters */ + for (int i = 0; i < DOCKCONT_MAX; i++) + { + DockingCont* _pDockCont = new DockingCont; + _vContainer.push_back(_pDockCont); + + DockingSplitter* _pSplitter = new DockingSplitter; + _vSplitter.push_back(_pSplitter); + } +} + + +void DockingManager::init(HINSTANCE hInst, HWND hWnd, Window ** ppWin) +{ + Window::init(hInst, hWnd); + + if (!_isRegistered) + { + WNDCLASS clz; + + clz.style = 0; + clz.lpfnWndProc = staticWinProc; + clz.cbClsExtra = 0; + clz.cbWndExtra = 0; + clz.hInstance = _hInst; + clz.hIcon = NULL; + clz.hCursor = ::LoadCursor(NULL, IDC_ARROW); + clz.hbrBackground = NULL; + clz.lpszMenuName = NULL; + clz.lpszClassName = DSPC_CLASS_NAME; + + if (!::RegisterClass(&clz)) + { + systemMessage(TEXT("System Err")); + throw int(98); + } + _isRegistered = TRUE; + } + + _hSelf = ::CreateWindowEx( + 0, + DSPC_CLASS_NAME, + TEXT(""), + WS_CHILD | WS_CLIPCHILDREN, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + _hParent, + NULL, + _hInst, + (LPVOID)this); + + if (!_hSelf) + { + systemMessage(TEXT("System Err")); + throw int(777); + } + + setClientWnd(ppWin); + + /* create docking container */ + for (int iCont = 0; iCont < DOCKCONT_MAX; iCont++) + { + _vContainer[iCont]->init(_hInst, _hSelf); + _vContainer[iCont]->doDialog(false); + ::SetParent(_vContainer[iCont]->getHSelf(), _hParent); + + if ((iCont == CONT_TOP) || (iCont == CONT_BOTTOM)) + _vSplitter[iCont]->init(_hInst, _hParent, _hSelf, DMS_HORIZONTAL); + else + _vSplitter[iCont]->init(_hInst, _hParent, _hSelf, DMS_VERTICAL); + } + /* register window event hooking */ + if (!hWndServer) + hWndServer = _hSelf; + CoInitialize(NULL); + if (!gWinCallHook) //only set if not already done + gWinCallHook = SetWindowsHookEx(WH_CALLWNDPROC, FocusWndProc, hInst, GetCurrentThreadId()); + + if (!gWinCallHook) + { + systemMessage(TEXT("System Err")); + throw int(1000); + } + + _dockData.hWnd = _hSelf; + + _isInitialized = TRUE; +} + +LRESULT CALLBACK DockingManager::staticWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + DockingManager *pDockingManager = NULL; + switch (message) + { + case WM_NCCREATE : + pDockingManager = (DockingManager *)(((LPCREATESTRUCT)lParam)->lpCreateParams); + pDockingManager->_hSelf = hwnd; + ::SetWindowLongPtr(hwnd, GWL_USERDATA, reinterpret_cast(pDockingManager)); + return TRUE; + + default : + pDockingManager = (DockingManager *)::GetWindowLongPtr(hwnd, GWL_USERDATA); + if (!pDockingManager) + return ::DefWindowProc(hwnd, message, wParam, lParam); + return pDockingManager->runProc(hwnd, message, wParam, lParam); + } +} + +LRESULT DockingManager::runProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_NCACTIVATE: + { + /* activate/deactivate titlebar of toolbars */ + for (size_t iCont = DOCKCONT_MAX; iCont < _vContainer.size(); iCont++) + { + ::SendMessage(_vContainer[iCont]->getHSelf(), WM_NCACTIVATE, wParam, (LPARAM)-1); + } + + if ((int)lParam != -1) + { + ::SendMessage(_hParent, WM_NCACTIVATE, wParam, (LPARAM)-1); + } + break; + } + case WM_MOVE: + case WM_SIZE: + { + onSize(); + break; + } + case WM_DESTROY: + { + /* unregister window event hooking BEFORE EVERYTHING ELSE */ + if (hWndServer == hwnd) { + UnhookWindowsHookEx(gWinCallHook); + gWinCallHook = NULL; + hWndServer = NULL; + } + + /* destroy imagelist if it exists */ + if (_hImageList != NULL) + { + ::ImageList_Destroy(_hImageList); + } + + /* destroy containers */ + for (int i = _vContainer.size(); i > 0; i--) + { + _vContainer[i-1]->destroy(); + delete _vContainer[i-1]; + } + CoUninitialize(); + break; + } + case DMM_LBUTTONUP: //is this message still relevant? + { + if (::GetActiveWindow() != _hParent) + break; + + /* set respective activate state */ + for (int i = 0; i < DOCKCONT_MAX; i++) + { + _vContainer[i]->SetActive(IsChild(_vContainer[i]->getHSelf(), ::GetFocus())); + } + return TRUE; + } + case DMM_MOVE: + { + Gripper* pGripper = new Gripper; + pGripper->init(_hInst, _hParent); + pGripper->startGrip((DockingCont*)lParam, this, pGripper); + break; + } + case DMM_MOVE_SPLITTER: + { + INT offset = (INT)wParam; + + for (int iCont = 0; iCont < DOCKCONT_MAX; iCont++) + { + if (_vSplitter[iCont]->getHSelf() == (HWND)lParam) + { + switch (iCont) + { + case CONT_TOP: + _dockData.rcRegion[iCont].bottom -= offset; + if (_dockData.rcRegion[iCont].bottom < 0) + { + _dockData.rcRegion[iCont].bottom = 0; + } + if ((_rcWork.bottom < (-SPLITTER_WIDTH)) && (offset < 0)) + { + _dockData.rcRegion[iCont].bottom += offset; + } + break; + case CONT_BOTTOM: + _dockData.rcRegion[iCont].bottom += offset; + if (_dockData.rcRegion[iCont].bottom < 0) + { + _dockData.rcRegion[iCont].bottom = 0; + } + if ((_rcWork.bottom < (-SPLITTER_WIDTH)) && (offset > 0)) + { + _dockData.rcRegion[iCont].bottom -= offset; + } + break; + case CONT_LEFT: + _dockData.rcRegion[iCont].right -= offset; + if (_dockData.rcRegion[iCont].right < 0) + { + _dockData.rcRegion[iCont].right = 0; + } + if ((_rcWork.right < SPLITTER_WIDTH) && (offset < 0)) + { + _dockData.rcRegion[iCont].right += offset; + } + break; + case CONT_RIGHT: + _dockData.rcRegion[iCont].right += offset; + if (_dockData.rcRegion[iCont].right < 0) + { + _dockData.rcRegion[iCont].right = 0; + } + if ((_rcWork.right < SPLITTER_WIDTH) && (offset > 0)) + { + _dockData.rcRegion[iCont].right -= offset; + } + break; + } + onSize(); + break; + } + } + break; + } + case DMM_DOCK: + case DMM_FLOAT: + { + toggleActiveTb((DockingCont*)lParam, message); + return FALSE; + } + case DMM_CLOSE: + { + tTbData TbData = *((DockingCont*)lParam)->getDataOfActiveTb(); + return SendNotify(TbData.hClient, DMN_CLOSE); + } + case DMM_FLOATALL: + { + toggleVisTb((DockingCont*)lParam, DMM_FLOAT); + return FALSE; + } + case DMM_DOCKALL: + { + toggleVisTb((DockingCont*)lParam, DMM_DOCK); + return FALSE; + } + case DMM_GETIMAGELIST: + { + return (LPARAM)_hImageList; + } + case DMM_GETICONPOS: + { + for (UINT uImageCnt = 0; uImageCnt < _vImageList.size(); uImageCnt++) + { + if ((HWND)lParam == _vImageList[uImageCnt]) + { + return uImageCnt; + } + } + return -1; + } + default : + break; + } + + return ::DefWindowProc(_hSelf, message, wParam, lParam); +} + +void DockingManager::onSize() +{ + reSizeTo(_rect); +} + +void DockingManager::reSizeTo(RECT & rc) +{ + // store current size of client area + _rect = rc; + + // prepare size of work area + _rcWork = rc; + + if (_isInitialized == FALSE) + return; + + // set top container + _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()) + { + _rcWork.top += _dockData.rcRegion[CONT_TOP].bottom + SPLITTER_WIDTH; + _rcWork.bottom -= _dockData.rcRegion[CONT_TOP].bottom + SPLITTER_WIDTH; + + // set size of splitter + RECT rc = {_dockData.rcRegion[CONT_TOP].left , + _dockData.rcRegion[CONT_TOP].top + _dockData.rcRegion[CONT_TOP].bottom, + _dockData.rcRegion[CONT_TOP].right , + SPLITTER_WIDTH}; + _vSplitter[CONT_TOP]->reSizeTo(rc); + } + + // set bottom container + _dockData.rcRegion[CONT_BOTTOM].left = rc.left; + _dockData.rcRegion[CONT_BOTTOM].top = rc.top + rc.bottom - _dockData.rcRegion[CONT_BOTTOM].bottom; + _dockData.rcRegion[CONT_BOTTOM].right = rc.right-rc.left; + + // create temporary rect for bottom container + RECT rcBottom = _dockData.rcRegion[CONT_BOTTOM]; + + _vSplitter[CONT_BOTTOM]->display(false); + + if (_vContainer[CONT_BOTTOM]->isVisible()) + { + _rcWork.bottom -= _dockData.rcRegion[CONT_BOTTOM].bottom + SPLITTER_WIDTH; + + // correct the visibility of bottom container when height is NULL + if (_rcWork.bottom < rc.top) + { + rcBottom.top = _rcWork.top + rc.top + SPLITTER_WIDTH; + rcBottom.bottom += _rcWork.bottom - rc.top; + _rcWork.bottom = rc.top; + } + if ((rcBottom.bottom + SPLITTER_WIDTH) < 0) + { + _rcWork.bottom = rc.bottom - _dockData.rcRegion[CONT_TOP].bottom; + } + + // set size of splitter + RECT rc = {rcBottom.left, + rcBottom.top - SPLITTER_WIDTH, + rcBottom.right, + SPLITTER_WIDTH}; + _vSplitter[CONT_BOTTOM]->reSizeTo(rc); + } + + // set left container + _dockData.rcRegion[CONT_LEFT].left = rc.left; + _dockData.rcRegion[CONT_LEFT].top = _rcWork.top; + _dockData.rcRegion[CONT_LEFT].bottom = _rcWork.bottom; + + _vSplitter[CONT_LEFT]->display(false); + + if (_vContainer[CONT_LEFT]->isVisible()) + { + _rcWork.left += _dockData.rcRegion[CONT_LEFT].right + SPLITTER_WIDTH; + _rcWork.right -= _dockData.rcRegion[CONT_LEFT].right + SPLITTER_WIDTH; + + // set size of splitter + RECT rc = {_dockData.rcRegion[CONT_LEFT].right, + _dockData.rcRegion[CONT_LEFT].top, + SPLITTER_WIDTH, + _dockData.rcRegion[CONT_LEFT].bottom}; + _vSplitter[CONT_LEFT]->reSizeTo(rc); + } + + // set right container + _dockData.rcRegion[CONT_RIGHT].left = rc.right - _dockData.rcRegion[CONT_RIGHT].right; + _dockData.rcRegion[CONT_RIGHT].top = _rcWork.top; + _dockData.rcRegion[CONT_RIGHT].bottom = _rcWork.bottom; + + // create temporary rect for right container + RECT rcRight = _dockData.rcRegion[CONT_RIGHT]; + + _vSplitter[CONT_RIGHT]->display(false); + if (_vContainer[CONT_RIGHT]->isVisible()) + { + _rcWork.right -= _dockData.rcRegion[CONT_RIGHT].right + SPLITTER_WIDTH; + + // correct the visibility of right container when width is NULL + if (_rcWork.right < 15) + { + rcRight.left = _rcWork.left + 15 + SPLITTER_WIDTH; + rcRight.right += _rcWork.right - 15; + _rcWork.right = 15; + } + + // set size of splitter + RECT rc = {rcRight.left - SPLITTER_WIDTH, + rcRight.top, + SPLITTER_WIDTH, + rcRight.bottom}; + _vSplitter[CONT_RIGHT]->reSizeTo(rc); + } + + // set window positions of container + if (_vContainer[CONT_BOTTOM]->isVisible()) + { + ::SetWindowPos(_vContainer[CONT_BOTTOM]->getHSelf(), NULL, + rcBottom.left , + rcBottom.top , + rcBottom.right , + rcBottom.bottom, + SWP_NOZORDER); + _vSplitter[CONT_BOTTOM]->display(); + } + + if (_vContainer[CONT_TOP]->isVisible()) + { + ::SetWindowPos(_vContainer[CONT_TOP]->getHSelf(), NULL, + _dockData.rcRegion[CONT_TOP].left , + _dockData.rcRegion[CONT_TOP].top , + _dockData.rcRegion[CONT_TOP].right , + _dockData.rcRegion[CONT_TOP].bottom, + SWP_NOZORDER); + _vSplitter[CONT_TOP]->display(); + } + + if (_vContainer[CONT_RIGHT]->isVisible()) + { + ::SetWindowPos(_vContainer[CONT_RIGHT]->getHSelf(), NULL, + rcRight.left , + rcRight.top , + rcRight.right , + rcRight.bottom, + SWP_NOZORDER); + _vSplitter[CONT_RIGHT]->display(); + } + + if (_vContainer[CONT_LEFT]->isVisible()) + { + ::SetWindowPos(_vContainer[CONT_LEFT]->getHSelf(), NULL, + _dockData.rcRegion[CONT_LEFT].left , + _dockData.rcRegion[CONT_LEFT].top , + _dockData.rcRegion[CONT_LEFT].right , + _dockData.rcRegion[CONT_LEFT].bottom, + SWP_NOZORDER); + _vSplitter[CONT_LEFT]->display(); + } + (*_ppMainWindow)->reSizeTo(_rcWork); +} + +void DockingManager::createDockableDlg(tTbData data, int iCont, bool isVisible) +{ + /* add icons */ + if (data.uMask & DWS_ICONTAB) + { + /* create image list if not exist */ + if (_hImageList == NULL) + { + _hImageList = ::ImageList_Create(14,14,ILC_COLOR8, 0, 0); + } + + /* add icon */ + ::ImageList_AddIcon(_hImageList, data.hIconTab); + + /* do the reference here to find later the correct position */ + _vImageList.push_back(data.hClient); + } + + /* create additional containers if necessary */ + RECT rc = {0,0,0,0}; + DockingCont* pCont = NULL; + + /* if floated rect not set */ + if (memcmp(&data.rcFloat, &rc, sizeof(RECT)) == 0) + { + /* set default rect state */ + ::GetWindowRect(data.hClient, &data.rcFloat); + + /* test if dialog is first time created */ + if (iCont == -1) + { + /* set default visible state */ + isVisible = (::IsWindowVisible(data.hClient) == TRUE); + + if (data.uMask & DWS_DF_FLOATING) + { + /* create new container */ + pCont = new DockingCont; + _vContainer.push_back(pCont); + + /* initialize */ + pCont->init(_hInst, _hSelf); + pCont->doDialog(isVisible, true); + + /* get previous position and set container id */ + data.iPrevCont = (data.uMask & 0x30000000) >> 28; + iCont = _vContainer.size()-1; + } + else + { + /* set position */ + iCont = (data.uMask & 0x30000000) >> 28; + + /* previous container is not selected */ + data.iPrevCont = -1; + } + } + } + /* if one of the container was not created before */ + else if ((iCont >= DOCKCONT_MAX) || (data.iPrevCont >= DOCKCONT_MAX)) + { + /* test if current container is in floating state */ + if (iCont >= DOCKCONT_MAX) + { + /* no mapping for available store mapping */ + if (_iContMap[iCont] == -1) + { + /* create new container */ + pCont = new DockingCont; + _vContainer.push_back(pCont); + + /* initialize and map container id */ + pCont->init(_hInst, _hSelf); + pCont->doDialog(isVisible, true); + _iContMap[iCont] = _vContainer.size()-1; + } + + /* get current container from map */ + iCont = _iContMap[iCont]; + } + /* previous container is in floating state */ + else + { + /* no mapping for available store mapping */ + if (_iContMap[data.iPrevCont] == -1) + { + /* create new container */ + pCont = new DockingCont; + _vContainer.push_back(pCont); + + /* initialize and map container id */ + pCont->init(_hInst, _hSelf); + pCont->doDialog(false, true); + pCont->reSizeToWH(data.rcFloat); + _iContMap[data.iPrevCont] = _vContainer.size()-1; + } + data.iPrevCont = _iContMap[data.iPrevCont]; + } + } + + /* attach toolbar */ + _vContainer[iCont]->createToolbar(data, _ppMainWindow); + + /* notify client app */ + if (iCont < DOCKCONT_MAX) + SendNotify(data.hClient, MAKELONG(DMN_DOCK, iCont)); + else + SendNotify(data.hClient, MAKELONG(DMN_FLOAT, iCont)); +} + +void DockingManager::setActiveTab(int iCont, int iItem) +{ + if ((iCont == -1) || (_iContMap[iCont] == -1)) + return; + + _vContainer[_iContMap[iCont]]->setActiveTb(iItem); +} + +DockingCont* DockingManager::toggleActiveTb(DockingCont* pContSrc, UINT message, BOOL bNew, LPRECT prcFloat) +{ + tTbData TbData = *pContSrc->getDataOfActiveTb(); + int iContSrc = GetContainer(pContSrc); + int iContPrev = TbData.iPrevCont; + BOOL isCont = ContExists(iContPrev); + DockingCont* pContTgt = NULL; + + /* if new float position is given */ + if (prcFloat != NULL) + { + TbData.rcFloat = *prcFloat; + } + + if ((isCont == FALSE) || (bNew == TRUE)) + { + /* find an empty container */ + int iContNew = FindEmptyContainer(); + + if (iContNew == -1) + { + /* if no free container is available create a new one */ + pContTgt = new DockingCont; + pContTgt->init(_hInst, _hSelf); + pContTgt->doDialog(true, true); + + /* change only on toggling */ + if ((bNew == FALSE) || (!pContSrc->isFloating())) + TbData.iPrevCont = iContSrc; + + pContTgt->createToolbar(TbData, _ppMainWindow); + _vContainer.push_back(pContTgt); + } + else + { + /* set new target */ + pContTgt = _vContainer[iContNew]; + + /* change only on toggling */ + if ((pContSrc->isFloating()) != (pContTgt->isFloating())) + TbData.iPrevCont = iContSrc; + + pContTgt->createToolbar(TbData, _ppMainWindow); + } + } + else + { + /* set new target */ + pContTgt = _vContainer[iContPrev]; + + /* change data normaly */ + TbData.iPrevCont = iContSrc; + pContTgt->createToolbar(TbData, _ppMainWindow); + } + + /* notify client app */ + SendNotify(TbData.hClient, MAKELONG(message==DMM_DOCK?DMN_DOCK:DMN_FLOAT, GetContainer(pContTgt))); + + /* remove toolbar from source */ + _vContainer[iContSrc]->removeToolbar(TbData); + + return pContTgt; +} + +DockingCont* DockingManager::toggleVisTb(DockingCont* pContSrc, UINT message, LPRECT prcFloat) +{ + vector vTbData = pContSrc->getDataOfVisTb(); + tTbData* pTbData = pContSrc->getDataOfActiveTb(); + + int iContSrc = GetContainer(pContSrc); + int iContPrev = pTbData->iPrevCont; + BOOL isCont = ContExists(iContPrev); + DockingCont* pContTgt = NULL; + + /* at first hide container and resize */ + pContSrc->doDialog(false); + onSize(); + + for (size_t iTb = 0; iTb < vTbData.size(); iTb++) + { + /* get data one by another */ + tTbData TbData = *vTbData[iTb]; + + /* if new float position is given */ + if (prcFloat != NULL) + { + TbData.rcFloat = *prcFloat; + } + + if (isCont == FALSE) + { + /* create new container */ + pContTgt = new DockingCont; + pContTgt->init(_hInst, _hSelf); + pContTgt->doDialog(true, true); + + TbData.iPrevCont = iContSrc; + pContTgt->createToolbar(TbData, _ppMainWindow); + _vContainer.push_back(pContTgt); + + /* now container exists */ + isCont = TRUE; + iContPrev = GetContainer(pContTgt); + } + else + { + /* set new target */ + pContTgt = _vContainer[iContPrev]; + + TbData.iPrevCont = iContSrc; + pContTgt->createToolbar(TbData, _ppMainWindow); + } + + SendNotify(TbData.hClient, MAKELONG(message==DMM_DOCK?DMN_DOCK:DMN_FLOAT, GetContainer(pContTgt))); + + /* remove toolbar from anywhere */ + _vContainer[iContSrc]->removeToolbar(TbData); + } + + _vContainer[iContPrev]->setActiveTb(pTbData); + return pContTgt; +} + +void DockingManager::toggleActiveTb(DockingCont* pContSrc, DockingCont* pContTgt) +{ + tTbData TbData = *pContSrc->getDataOfActiveTb(); + + toggleTb(pContSrc, pContTgt, TbData); +} + +void DockingManager::toggleVisTb(DockingCont* pContSrc, DockingCont* pContTgt) +{ + vector vTbData = pContSrc->getDataOfVisTb(); + tTbData* pTbData = pContSrc->getDataOfActiveTb(); + + /* at first hide container and resize */ + pContSrc->doDialog(false); + onSize(); + + for (size_t iTb = 0; iTb < vTbData.size(); iTb++) + { + /* get data one by another */ + tTbData TbData = *vTbData[iTb]; + toggleTb(pContSrc, pContTgt, TbData); + } + pContTgt->setActiveTb(pTbData); +} + +void DockingManager::toggleTb(DockingCont* pContSrc, DockingCont* pContTgt, tTbData TbData) +{ + int iContSrc = GetContainer(pContSrc); + int iContTgt = GetContainer(pContTgt); + + /* test if container state changes from docking to floating or vice versa */ + if (((iContSrc < DOCKCONT_MAX) && (iContTgt >= DOCKCONT_MAX)) || + ((iContSrc >= DOCKCONT_MAX) && (iContTgt < DOCKCONT_MAX))) + { + /* change states */ + TbData.iPrevCont = iContSrc; + } + + /* notify client app */ + if (iContTgt < DOCKCONT_MAX) + SendNotify(TbData.hClient, MAKELONG(DMN_DOCK, iContTgt)); + else + SendNotify(TbData.hClient, MAKELONG(DMN_FLOAT, iContTgt)); + + /* create new toolbar */ + pContTgt->createToolbar(TbData, _ppMainWindow); + + /* remove toolbar from source */ + _vContainer[iContSrc]->removeToolbar(TbData); +} + +BOOL DockingManager::ContExists(size_t iCont) +{ + BOOL bRet = FALSE; + + if (iCont < _vContainer.size()) + { + bRet = TRUE; + } + + return bRet; +} + +int DockingManager::GetContainer(DockingCont* pCont) +{ + int iRet = -1; + + for (size_t iCont = 0; iCont < _vContainer.size(); iCont++) + { + if (_vContainer[iCont] == pCont) + { + iRet = iCont; + break; + } + } + + return iRet; +} + +int DockingManager::FindEmptyContainer(void) +{ + int iRetCont = -1; + BOOL* pPrevDockList = (BOOL*) new BOOL[_vContainer.size()+1]; + BOOL* pArrayPos = &pPrevDockList[1]; + + /* delete all entries */ + for (size_t iCont = 0; iCont < _vContainer.size()+1; iCont++) + { + pPrevDockList[iCont] = FALSE; + } + + /* search for used floated containers */ + for (size_t iCont = 0; iCont < DOCKCONT_MAX; iCont++) + { + vector vTbData = _vContainer[iCont]->getDataOfAllTb(); + + for (size_t iTb = 0; iTb < vTbData.size(); iTb++) + { + pArrayPos[vTbData[iTb]->iPrevCont] = TRUE; + } + } + + /* find free container */ + for (size_t iCont = DOCKCONT_MAX; iCont < _vContainer.size(); iCont++) + { + if (pArrayPos[iCont] == FALSE) + { + /* and test if container is hidden */ + if (!_vContainer[iCont]->isVisible()) + { + iRetCont = iCont; + break; + } + } + } + + delete [] pPrevDockList; + + /* search for empty arrays */ + return iRetCont; +} + + diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingManager.h b/PowerEditor/src/WinControls/DockingWnd/DockingManager.h new file mode 100644 index 00000000..eef88c1b --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingManager.h @@ -0,0 +1,213 @@ +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef DOCKINGMANAGER_H +#define DOCKINGMANAGER_H + +#include "Docking.h" +#include "Window.h" +#include "DockingCont.h" +#include "DockingSplitter.h" +#include +#include +#include "SplitterContainer.h" +#include "dockingResource.h" +#include "Parameters.h" + +#define DSPC_CLASS_NAME TEXT("dockingManager") + +using namespace std; + + +#define CONT_MAP_MAX 50 + + +class DockingManager : public Window +{ +public : + DockingManager(); + ~DockingManager(){ + // delete 4 splitters + for (int i = 0; i < DOCKCONT_MAX; i++) + { + delete _vSplitter[i]; + } + }; + + void init(HINSTANCE hInst, HWND hWnd, Window ** ppWin); + virtual void reSizeTo(RECT & rc); + + void setClientWnd(Window ** ppWin) { + _ppWindow = ppWin; + _ppMainWindow = ppWin; + }; + + void showContainer(HWND hCont, BOOL view = TRUE) { + for (size_t iCont = 0; iCont < _vContainer.size(); iCont++) + { + if (_vContainer[iCont]->getHSelf() == hCont) + showContainer(iCont, view); + } + } + + void showContainer(UINT uCont, BOOL view = TRUE) { + _vContainer[uCont]->doDialog((view == TRUE)); + onSize(); + } + + void updateContainerInfo(HWND hClient) { + for (size_t iCont = 0; iCont < _vContainer.size(); iCont++) + { + if (_vContainer[iCont]->updateInfo(hClient) == TRUE) + { + break; + } + } + }; + + void createDockableDlg(tTbData data, int iCont = CONT_LEFT, bool isVisible = false); + void setActiveTab(int iCont, int iItem); + + void showDockableDlg(HWND hDlg, BOOL view) { + tTbData* pTbData = NULL; + + for (size_t i = 0; i < _vContainer.size(); i++) + { + pTbData = _vContainer[i]->findToolbarByWnd(hDlg); + if (pTbData != NULL) + { + _vContainer[i]->showToolbar(pTbData, view); + return; + } + } + }; + + void showDockableDlg(TCHAR* pszName, BOOL view) { + tTbData* pTbData = NULL; + + for (size_t i = 0; i < _vContainer.size(); i++) + { + pTbData = _vContainer[i]->findToolbarByName(pszName); + if (pTbData != NULL) + { + _vContainer[i]->showToolbar(pTbData, view); + return; + } + } + }; + + DockingCont* toggleActiveTb(DockingCont* pContSrc, UINT message, BOOL bNew = FALSE, LPRECT rcFloat = NULL); + DockingCont* toggleVisTb(DockingCont* pContSrc, UINT message, LPRECT rcFloat = NULL); + void toggleActiveTb(DockingCont* pContSrc, DockingCont* pContTgt); + void toggleVisTb(DockingCont* pContSrc, DockingCont* pContTgt); + + /* get number of container */ + int GetContainer(DockingCont* pCont); + + /* get all container in vector */ + vector & getContainerInfo(void) { + return _vContainer; + }; + /* get dock data (sized areas) */ + void getDockInfo(tDockMgr *pDockData) { + *pDockData = _dockData; + }; + + /* setting styles of docking */ + void setStyleCaption(BOOL captionOnTop) { + _vContainer[CONT_TOP]->setCaptionTop(captionOnTop); + _vContainer[CONT_BOTTOM]->setCaptionTop(captionOnTop); + }; + + void setTabStyle(BOOL orangeLine) { + for (size_t i = 0; i < _vContainer.size(); i++) + _vContainer[i]->setTabStyle(orangeLine); + }; + + int getDockedContSize(int iCont) + { + if ((iCont == CONT_TOP) || (iCont == CONT_BOTTOM)) + return _dockData.rcRegion[iCont].bottom; + else if ((iCont == CONT_LEFT) || (iCont == CONT_RIGHT)) + return _dockData.rcRegion[iCont].right; + else + return -1; + }; + + void setDockedContSize(int iCont, int iSize) + { + if ((iCont == CONT_TOP) || (iCont == CONT_BOTTOM)) + _dockData.rcRegion[iCont].bottom = iSize; + else if ((iCont == CONT_LEFT) || (iCont == CONT_RIGHT)) + _dockData.rcRegion[iCont].right = iSize; + else + return; + onSize(); + }; + + virtual void destroy() { + ::DestroyWindow(_hSelf); + }; + +private : + + static LRESULT CALLBACK staticWinProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); + LRESULT runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); + void onSize(void); + + void toggleTb(DockingCont* pContSrc, DockingCont* pContTgt, tTbData TbData); + + /* test if container exists */ + BOOL ContExists(size_t iCont); + int FindEmptyContainer(void); + + LRESULT SendNotify(HWND hWnd, UINT message) { + NMHDR nmhdr; + + nmhdr.code = message; + nmhdr.hwndFrom = _hParent; + nmhdr.idFrom = ::GetDlgCtrlID(_hParent); + ::SendMessage(hWnd, WM_NOTIFY, nmhdr.idFrom, (LPARAM)&nmhdr); + return ::GetWindowLongPtr(hWnd, DWL_MSGRESULT); + }; + +private: + /* Handles */ + Window **_ppWindow; + + RECT _rcWork; + RECT _rect; + Window **_ppMainWindow; + + /* handles all the icons */ + vector _vImageList; + HIMAGELIST _hImageList; + + vector _vContainer; + tDockMgr _dockData; + + static BOOL _isRegistered; + BOOL _isInitialized; + + /* container map for startup (restore settings) */ + int _iContMap[CONT_MAP_MAX]; + + /* splitter data */ + vector _vSplitter; +}; + +#endif //DOCKINGMANAGER_H diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingSplitter.cpp b/PowerEditor/src/WinControls/DockingWnd/DockingSplitter.cpp new file mode 100644 index 00000000..c93d0153 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingSplitter.cpp @@ -0,0 +1,207 @@ +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + + +#include "DockingSplitter.h" +#include "Common.h" +#include "Notepad_plus_msgs.h" +#include "Parameters.h" + +BOOL DockingSplitter::_isVertReg = FALSE; +BOOL DockingSplitter::_isHoriReg = FALSE; + +static HWND hWndMouse = NULL; +static HHOOK hookMouse = NULL; + +#ifndef WH_MOUSE_LL +#define WH_MOUSE_LL 14 +#endif + +static LRESULT CALLBACK hookProcMouse(UINT nCode, WPARAM wParam, LPARAM lParam) +{ + if(nCode >= 0) + { + switch (wParam) + { + case WM_MOUSEMOVE: + case WM_NCMOUSEMOVE: + ::PostMessage(hWndMouse, wParam, 0, 0); + break; + case WM_LBUTTONUP: + case WM_NCLBUTTONUP: + ::PostMessage(hWndMouse, wParam, 0, 0); + return TRUE; + default: + break; + } + } + + return ::CallNextHookEx(hookMouse, nCode, wParam, lParam); +} + +void DockingSplitter::init(HINSTANCE hInst, HWND hWnd, HWND hMessage, UINT flags) +{ + Window::init(hInst, hWnd); + _hMessage = hMessage; + _flags = flags; + + WNDCLASS wc; + + if (flags & DMS_HORIZONTAL) + { + //double sided arrow pointing north-south as cursor + wc.hCursor = ::LoadCursor(NULL,IDC_SIZENS); + wc.lpszClassName = TEXT("nsdockspliter"); + } + else + { + // double sided arrow pointing east-west as cursor + wc.hCursor = ::LoadCursor(NULL,IDC_SIZEWE); + wc.lpszClassName = TEXT("wedockspliter"); + } + + if (((_isHoriReg == FALSE) && (flags & DMS_HORIZONTAL)) || + ((_isVertReg == FALSE) && (flags & DMS_VERTICAL))) + { + wc.style = CS_HREDRAW | CS_VREDRAW; + wc.lpfnWndProc = staticWinProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = _hInst; + wc.hIcon = NULL; + wc.hbrBackground = (HBRUSH)(COLOR_3DFACE+1); + wc.lpszMenuName = NULL; + + if (!::RegisterClass(&wc)) + { + systemMessage(TEXT("System Err")); + throw int(98); + } + else if (flags & DMS_HORIZONTAL) + { + _isHoriReg = TRUE; + } + else + { + _isVertReg = TRUE; + } + } + + /* create splitter windows and initialize it */ + _hSelf = ::CreateWindowEx( 0, wc.lpszClassName, TEXT(""), WS_CHILD | WS_VISIBLE, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + _hParent, NULL, _hInst, (LPVOID)this); + + if (!_hSelf) + { + systemMessage(TEXT("System Err")); + throw int(777); + } +} + + + +LRESULT CALLBACK DockingSplitter::staticWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + DockingSplitter *pDockingSplitter = NULL; + switch (message) + { + case WM_NCCREATE : + pDockingSplitter = (DockingSplitter *)(((LPCREATESTRUCT)lParam)->lpCreateParams); + pDockingSplitter->_hSelf = hwnd; + ::SetWindowLongPtr(hwnd, GWL_USERDATA, reinterpret_cast(pDockingSplitter)); + return TRUE; + + default : + pDockingSplitter = (DockingSplitter *)::GetWindowLongPtr(hwnd, GWL_USERDATA); + if (!pDockingSplitter) + return ::DefWindowProc(hwnd, message, wParam, lParam); + return pDockingSplitter->runProc(hwnd, message, wParam, lParam); + } +} + + +LRESULT DockingSplitter::runProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_LBUTTONDOWN: + { + hWndMouse = hwnd; + + winVer ver = (NppParameters::getInstance())->getWinVersion(); + hookMouse = ::SetWindowsHookEx(ver >= WV_W2K?WH_MOUSE_LL:WH_MOUSE, (HOOKPROC)hookProcMouse, _hInst, 0); + + + if (!hookMouse) + { + DWORD dwError = ::GetLastError(); + TCHAR str[128]; + ::wsprintf(str, TEXT("GetLastError() returned %lu"), dwError); + ::MessageBox(NULL, str, TEXT("SetWindowsHookEx(MOUSE) failed"), MB_OK | MB_ICONERROR); + } + else + { + ::SetCapture(_hSelf); + ::GetCursorPos(&_ptOldPos); + _isLeftButtonDown = TRUE; + } + break; + } + case WM_LBUTTONUP: + case WM_NCLBUTTONUP: + { + /* end hooking */ + if (hookMouse) + { + ::UnhookWindowsHookEx(hookMouse); + ::SetCapture(NULL); + hookMouse = NULL; + } + _isLeftButtonDown = FALSE; + break; + } + case WM_MOUSEMOVE: + case WM_NCMOUSEMOVE: + { + if (_isLeftButtonDown == TRUE) + { + POINT pt; + + ::GetCursorPos(&pt); + + if ((_flags & DMS_HORIZONTAL) && (_ptOldPos.y != pt.y)) + { + ::SendMessage(_hMessage, DMM_MOVE_SPLITTER, (WPARAM)_ptOldPos.y - pt.y, (LPARAM)_hSelf); + } + else if (_ptOldPos.x != pt.x) + { + ::SendMessage(_hMessage, DMM_MOVE_SPLITTER, (WPARAM)_ptOldPos.x - pt.x, (LPARAM)_hSelf); + } + _ptOldPos = pt; + } + break; + } + default : + break; + } + return ::DefWindowProc(hwnd, message, wParam, lParam); +} + + + + diff --git a/PowerEditor/src/WinControls/DockingWnd/DockingSplitter.h b/PowerEditor/src/WinControls/DockingWnd/DockingSplitter.h new file mode 100644 index 00000000..7aa047c5 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DockingSplitter.h @@ -0,0 +1,59 @@ +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + + +#ifndef DOCKINGSPLITTER_H +#define DOCKINGSPLITTER_H + +#include "Docking.h" +#include "dockingResource.h" +#include "window.h" + + +#define DMS_VERTICAL 0x00000001 +#define DMS_HORIZONTAL 0x00000002 + + + +class DockingSplitter : public Window +{ +public : + DockingSplitter() : _isLeftButtonDown(FALSE), _hMessage(NULL) {}; + ~DockingSplitter(){}; + + virtual void destroy() {}; + +public: + void init(HINSTANCE hInst, HWND hWnd, HWND hMessage, UINT flags); + +protected: + + static LRESULT CALLBACK staticWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); + LRESULT runProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); + +private: + HWND _hMessage; + + BOOL _isLeftButtonDown; + POINT _ptOldPos; + UINT _flags; + + static BOOL _isVertReg; + static BOOL _isHoriReg; +}; + +#endif // DOCKINGSPLITTER_H diff --git a/PowerEditor/src/WinControls/DockingWnd/DropData.cpp.bak b/PowerEditor/src/WinControls/DockingWnd/DropData.cpp.bak new file mode 100644 index 00000000..bf820039 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DropData.cpp.bak @@ -0,0 +1,214 @@ +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "DropData.h" +#include +#include +#include "dockingResource.h" + +DropData::DropData(HWND hWnd, DockingCont* pCont) +{ + _lRefCount = 1; + _pCont = pCont; + _hWnd = hWnd; + _pAreasData = NULL; + _hTab = _pCont->getTabWnd(); + _hCaption = _pCont->getCaptionWnd(); +} + +DropData::~DropData() +{ + if (_pAreasData != NULL) + { + delete [] _pAreasData; + } +} + +HRESULT __stdcall DropData::QueryInterface (REFIID iid, void ** ppvObject) +{ + if(iid == IID_IDropTarget || iid == IID_IUnknown) + { + AddRef(); + *ppvObject = this; + return S_OK; + } + else + { + *ppvObject = 0; + return E_NOINTERFACE; + } +} + +ULONG __stdcall DropData::AddRef(void) +{ + return InterlockedIncrement(&_lRefCount); +} + +ULONG __stdcall DropData::Release(void) +{ + LONG count = InterlockedDecrement(&_lRefCount); + + if(count == 0) + { + delete this; + return 0; + } + else + { + return count; + } +} + +DWORD DropData::DropEffect(DWORD grfKeyState, POINTL ptl, DWORD dwAllowed) +{ + DWORD dwEffect = DROPEFFECT_NONE; + POINT pt = {ptl.x, ptl.y}; + + for (int iElem = 0; iElem < _iElemCnt; iElem++) + { + /* test if cursor points in a rect */ + if (::PtInRect(&_pAreasData[iElem].rcDropArea, pt) == TRUE) + { + dwEffect = DROPEFFECT_COPY; + break; + } + } + + return dwEffect; +} + +HRESULT __stdcall DropData::DragEnter(IDataObject * pDataObject, DWORD grfKeyState, POINTL ptl, DWORD * pdwEffect) +{ + int iItem = 0; + int iItemCnt = 0; + TCITEM tcItem = {0}; + + /* initial element count */ + _iElemCnt = 0; + + /* get amount of element in tab and add caption */ + iItemCnt = ::SendMessage(_hTab, TCM_GETITEMCOUNT, 0, 0) + 1; + + /* allocate resources */ + _pAreasData = (tAreaData*) new tAreaData[iItemCnt]; + + /* get allowed areas */ + tcItem.mask = TCIF_PARAM; + + if (::IsWindowVisible(_hTab) == TRUE) + { + /* get possible areas for all tabs */ + for (iItem = 0; iItem < (iItemCnt - 1); iItem++) + { + ::SendMessage(_hTab, TCM_GETITEM, iItem, (LPARAM)&tcItem); + + if (((tTbData*)tcItem.lParam)->uMask & DWS_ACCEPTDATA) + { + if (pDataObject->QueryGetData(((tTbData*)tcItem.lParam)->pFETC) == S_OK) + { + _pAreasData[_iElemCnt].targetWnd = ((tTbData*)tcItem.lParam)->hClient; + ::SendMessage(_hTab, TCM_GETITEMRECT, iItem, (LPARAM)&_pAreasData[_iElemCnt].rcDropArea); + ClientToScreen(_hTab, &_pAreasData[_iElemCnt++].rcDropArea); + } + } + } + } + + /* get caption area when current selected tab allowes data drop */ + iItem = ::SendMessage(_hTab, TCM_GETCURSEL, 0, 0); + ::SendMessage(_hTab, TCM_GETITEM, iItem, (LPARAM)&tcItem); + if (((tTbData*)tcItem.lParam)->uMask & DWS_ACCEPTDATA) + { + if (pDataObject->QueryGetData(((tTbData*)tcItem.lParam)->pFETC) == S_OK) + { + _pAreasData[_iElemCnt].targetWnd = ((tTbData*)tcItem.lParam)->hClient; + + if (_pCont->isFloating()) + { + _pCont->getWindowRect(_pAreasData[_iElemCnt].rcDropArea); + _pAreasData[_iElemCnt].rcDropArea.bottom = _pAreasData[_iElemCnt].rcDropArea.top + 24; + } + else + { + ::GetWindowRect(_hCaption, &_pAreasData[_iElemCnt].rcDropArea); + } + _iElemCnt++; + } + } + + *pdwEffect = DropEffect(grfKeyState, ptl, *pdwEffect); + + return S_OK; +} + +HRESULT __stdcall DropData::DragOver(DWORD grfKeyState, POINTL ptl, DWORD * pdwEffect) +{ + *pdwEffect = DropEffect(grfKeyState, ptl, *pdwEffect); + + return S_OK; +} + +HRESULT __stdcall DropData::DragLeave(void) +{ + return S_OK; +} + +HRESULT __stdcall DropData::Drop(IDataObject * pDataObject, DWORD grfKeyState, POINTL ptl, DWORD * pdwEffect) +{ + POINT pt = {ptl.x, ptl.y}; + + /* initial elements */ + *pdwEffect = DROPEFFECT_NONE; + + for (int iElem = 0; iElem < _iElemCnt; iElem++) + { + /* test if cursor points in a rect */ + if (::PtInRect(&_pAreasData[iElem].rcDropArea, (POINT)pt) == TRUE) + { + /* notify child windows */ + ::SendMessage(_pAreasData[iElem].targetWnd, LMM_DROPDATA, 0, (LPARAM)pDataObject); + + *pdwEffect = DROPEFFECT_COPY; + break; + } + } + + return S_OK; +} + +void RegisterDropWindow(HWND hwnd, DockingCont* pCont, IDropTarget **ppDropTarget) +{ + DropData *pDropTarget = new DropData(hwnd, pCont); + + // tell OLE that the window is a drop target + ::RegisterDragDrop(hwnd, pDropTarget); + + *ppDropTarget = pDropTarget; +} + +void UnregisterDropWindow(HWND hwnd, IDropTarget *pDropTarget) +{ + // remove drag+drop + ::RevokeDragDrop(hwnd); + + // remove the strong lock + CoLockObjectExternal(pDropTarget, FALSE, TRUE); + + // release our own reference + pDropTarget->Release(); +} + diff --git a/PowerEditor/src/WinControls/DockingWnd/DropData.h b/PowerEditor/src/WinControls/DockingWnd/DropData.h new file mode 100644 index 00000000..4f4a264b --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/DropData.h @@ -0,0 +1,74 @@ +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + + +#ifndef DROP_TARGET_H +#define DROP_TARGET_H + +#include "DockingCont.h" +#include + + +void RegisterDropWindow(HWND hwnd, DockingCont* pCont, IDropTarget **ppDropTarget); +void UnregisterDropWindow(HWND hwnd, IDropTarget *pDropTarget); + + +typedef struct { + HWND targetWnd; + RECT rcDropArea; +} tAreaData; + + +class DropData : public IDropTarget +{ +public: + /* IUnknown implementation */ + HRESULT __stdcall QueryInterface(REFIID iid, void** ppvObject); + ULONG __stdcall AddRef(void); + ULONG __stdcall Release(void); + + /* IDropTarget implementation */ + HRESULT __stdcall DragEnter(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect); + HRESULT __stdcall DragOver(DWORD grfKeyState, POINTL pt, DWORD* pdwEffect); + HRESULT __stdcall DragLeave(void); + HRESULT __stdcall Drop(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect); + + // Constructor + DropData(HWND hwnd, DockingCont* pCont); + ~DropData(); + +private: + /* internal helper function */ + DWORD DropEffect(DWORD grfKeyState, POINTL pt, DWORD dwAllowed); + bool QueryDataObject(IDataObject *pDataObject); + + +private: + LONG _lRefCount; + + HWND _hWnd; + HWND _hCaption; + HWND _hTab; + + DockingCont* _pCont; + + tAreaData* _pAreasData; + int _iElemCnt; +}; + + +#endif // DROP_TARGET_H \ No newline at end of file diff --git a/PowerEditor/src/WinControls/DockingWnd/Gripper.cpp b/PowerEditor/src/WinControls/DockingWnd/Gripper.cpp new file mode 100644 index 00000000..214b8088 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/Gripper.cpp @@ -0,0 +1,793 @@ +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + + +#include "dockingResource.h" +#include "math.h" +#include "Docking.h" +#include "Gripper.h" + +#ifndef WH_KEYBOARD_LL +#define WH_KEYBOARD_LL 13 +#endif + +#ifndef WH_MOUSE_LL +#define WH_MOUSE_LL 14 +#endif + + +BOOL Gripper::_isRegistered = FALSE; + +static HWND hWndServer = NULL; +static HHOOK hookMouse = NULL; +static HHOOK hookKeyboard = NULL; + +static LRESULT CALLBACK hookProcMouse(INT nCode, WPARAM wParam, LPARAM lParam) +{ + if (nCode >= 0) + { + switch (wParam) + { + case WM_MOUSEMOVE: + case WM_NCMOUSEMOVE: + //::PostMessage(hWndServer, wParam, 0, 0); + ::SendMessage(hWndServer, wParam, 0, 0); + break; + case WM_LBUTTONUP: + case WM_NCLBUTTONUP: + //::PostMessage(hWndServer, wParam, 0, 0); + ::SendMessage(hWndServer, wParam, 0, 0); + return TRUE; + default: + break; + } + } + return ::CallNextHookEx(hookMouse, nCode, wParam, lParam); +} + +static LRESULT CALLBACK hookProcKeyboard(INT nCode, WPARAM wParam, LPARAM lParam) +{ + if (nCode >= 0) + { + if (wParam == VK_ESCAPE) + { + ::PostMessage(hWndServer, DMM_CANCEL_MOVE, 0, 0); + return FALSE; + } + } + + return ::CallNextHookEx(hookKeyboard, nCode, wParam, lParam); +} + +Gripper::Gripper(void) +{ + _hInst = NULL; + _hParent = NULL; + _hSelf = NULL; + + _pDockMgr = NULL; + _pCont = NULL; + + _ptOffset.x = 0; + _ptOffset.y = 0; + + _ptOld.x = 0; + _ptOld.y = 0; + _bPtOldValid = FALSE; + + _hTab = NULL; + _hTabSource = NULL; + _startMovingFromTab = FALSE; + _iItem = 0; + + _hdc = NULL; + _hbm = NULL; + _hbrush = NULL; + + + memset(&_rcItem, 0, sizeof(RECT)); + memset(&_tcItem, 0, sizeof(TCITEM)); + memset(&_dockData, 0, sizeof(tDockMgr)); +} + + +void Gripper::startGrip(DockingCont* pCont, DockingManager* pDockMgr, void* pRes) +{ + MSG msg = {0}; + BOOL bIsRel = FALSE; + HWND hWnd = NULL; + + _pDockMgr = pDockMgr; + _pCont = pCont; + _pRes = pRes; + + _pDockMgr->getDockInfo(&_dockData); + + if (!_isRegistered) + { + WNDCLASS clz; + + clz.style = 0; + clz.lpfnWndProc = staticWinProc; + clz.cbClsExtra = 0; + clz.cbWndExtra = 0; + clz.hInstance = _hInst; + clz.hIcon = NULL; + clz.hCursor = ::LoadCursor(NULL, IDC_ARROW); + + clz.hbrBackground = NULL; + clz.lpszMenuName = NULL; + clz.lpszClassName = MDLG_CLASS_NAME; + + if (!::RegisterClass(&clz)) + { + systemMessage(TEXT("System Err")); + throw int(98); + } + _isRegistered = TRUE; + } + + _hSelf = ::CreateWindowEx( + 0, + MDLG_CLASS_NAME, + TEXT(""), 0, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + NULL, + NULL, + _hInst, + (LPVOID)this); + hWndServer = _hSelf; + + if (!_hSelf) + { + systemMessage(TEXT("System Err")); + throw int(777); + } +} + + +LRESULT CALLBACK Gripper::staticWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + Gripper *pDlgMoving = NULL; + switch (message) + { + case WM_NCCREATE : + pDlgMoving = (Gripper *)(((LPCREATESTRUCT)lParam)->lpCreateParams); + pDlgMoving->_hSelf = hwnd; + ::SetWindowLongPtr(hwnd, GWL_USERDATA, reinterpret_cast(pDlgMoving)); + return TRUE; + + default : + pDlgMoving = (Gripper *)::GetWindowLongPtr(hwnd, GWL_USERDATA); + if (!pDlgMoving) + return ::DefWindowProc(hwnd, message, wParam, lParam); + return pDlgMoving->runProc(message, wParam, lParam); + } +} + +LRESULT Gripper::runProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_CREATE: + { + create(); + break; + } + case WM_MOUSEMOVE: + case WM_NCMOUSEMOVE: + { + onMove(); + return TRUE; + } + case WM_LBUTTONUP: + case WM_NCLBUTTONUP: + { + /* end hooking */ + if (hookMouse) + { + ::UnhookWindowsHookEx(hookMouse); + ::UnhookWindowsHookEx(hookKeyboard); + hookMouse = NULL; + hookKeyboard = NULL; + } + + onButtonUp(); + + ::DestroyWindow(_hSelf); + return TRUE; + } + case DMM_CANCEL_MOVE: + { + POINT pt = {0,0}; + POINT ptBuf = {0,0}; + RECT rc = {0}; + + ::GetCursorPos(&pt); + getMousePoints(&pt, &ptBuf); + + /* erase last drawn rectangle */ + drawRectangle(ptBuf); + + /* end hooking */ + ::UnhookWindowsHookEx(hookMouse); + ::UnhookWindowsHookEx(hookKeyboard); + + ::DestroyWindow(_hSelf); + return FALSE; + } + case WM_DESTROY: + { + mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); + ::SetWindowPos(_hParent, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); + _pCont->focusClient(); + delete _pRes; + break; + } + default: + break; + } + + return ::DefWindowProc(_hSelf, message, wParam, lParam); +} + + +void Gripper::create(void) +{ + RECT rc = {0}; + POINT pt = {0}; + + // start hooking + ::SetWindowPos(_pCont->getHSelf(), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); + ::SetCapture(_hSelf); + winVer ver = (NppParameters::getInstance())->getWinVersion(); + hookMouse = ::SetWindowsHookEx(ver >= WV_W2K?WH_MOUSE_LL:WH_MOUSE, (HOOKPROC)hookProcMouse, _hInst, 0); + + if (!hookMouse) + { + DWORD dwError = ::GetLastError(); + TCHAR str[128]; + ::wsprintf(str, TEXT("GetLastError() returned %lu"), dwError); + ::MessageBox(NULL, str, TEXT("SetWindowsHookEx(MOUSE) failed"), MB_OK | MB_ICONERROR); + } + + if (ver < WV_VISTA) + { + hookKeyboard = ::SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)hookProcKeyboard, _hInst, 0); + if (!hookKeyboard) + { + DWORD dwError = ::GetLastError(); + TCHAR str[128]; + ::wsprintf(str, TEXT("GetLastError() returned %lu"), dwError); + ::MessageBox(NULL, str, TEXT("SetWindowsHookEx(KEYBOARD) failed"), MB_OK | MB_ICONERROR); + } + } +// Removed regarding W9x systems +// mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); + + // calculate the mouse pt within dialog + ::GetCursorPos(&pt); + + // get tab informations + initTabInformation(pt); + + if (_pCont->isFloating() == true) + { + ::GetWindowRect(_pCont->getHSelf(), &rc); + } + else + { + _pCont->getClientRect(rc); + ::ScreenToClient(_pCont->getHSelf(), &pt); + } + + _ptOffset.x = pt.x - rc.left; + _ptOffset.y = pt.y - rc.top; +} + + +void Gripper::onMove(void) +{ + POINT pt = {0,0}; + POINT ptBuf = {0,0}; + + ::GetCursorPos(&pt); + getMousePoints(&pt, &ptBuf); + + /* On first time: Do not erase previous rect, because it dosn't exist */ + if (_bPtOldValid == TRUE) + drawRectangle(ptBuf); + + /* tab reordering only when tab was selected */ + if (_startMovingFromTab == TRUE) + { + doTabReordering(pt); + } + + drawRectangle(pt); + _bPtOldValid = TRUE; +} + + +void Gripper::onButtonUp(void) +{ + POINT pt = {0,0}; + POINT ptBuf = {0,0}; + RECT rc = {0}; + RECT rcCorr = {0}; + DockingCont* pContMove = NULL; + + ::GetCursorPos(&pt); + getMousePoints(&pt, &ptBuf); + + /* do nothing, when old point is not valid */ + if (_bPtOldValid == FALSE) + return; + + /* erase last drawn rectangle */ + drawRectangle(ptBuf); + + /* look if current position is within dockable area */ + DockingCont* pDockCont = contHitTest(pt); + + if (pDockCont == NULL) + { + pDockCont = workHitTest(pt); + } + + /* add dependency to other container class */ + if (pDockCont == NULL) + { + /* calculate new position */ + rc = _pCont->getDataOfActiveTb()->rcFloat; + _pCont->getClientRect(rcCorr); + + CalcRectToScreen(_dockData.hWnd, &rc); + CalcRectToScreen(_dockData.hWnd, &rcCorr); + + rc.left = pt.x - _ptOffset.x; + rc.top = pt.y - _ptOffset.y; + + /* correct rectangle position when mouse is not within */ + DoCalcGripperRect(&rc, rcCorr, pt); + + /* change location of toolbars */ + if (_startMovingFromTab == TRUE) + { + /* when tab is moved */ + if ((!_pCont->isFloating()) || + ((_pCont->isFloating()) && (::SendMessage(_hTabSource, TCM_GETITEMCOUNT, 0, 0) > 1))) + { + pContMove = _pDockMgr->toggleActiveTb(_pCont, DMM_FLOAT, TRUE, &rc); + } + } + else if (!_pCont->isFloating()) + { + /* when all windows are moved */ + pContMove = _pDockMgr->toggleVisTb(_pCont, DMM_FLOAT, &rc); + } + + /* set moving container */ + if (pContMove == NULL) + { + pContMove = _pCont; + } + + /* update window position */ + ::MoveWindow(pContMove->getHSelf(), rc.left, rc.top, rc.right, rc.bottom, TRUE); + ::SendMessage(pContMove->getHSelf(), WM_SIZE, 0, 0); + } + else if (_pCont != pDockCont) + { + /* change location of toolbars */ + if ((_startMovingFromTab == TRUE) && (::SendMessage(_hTabSource, TCM_GETITEMCOUNT, 0, 0) != 1)) + { + /* when tab is moved */ + _pDockMgr->toggleActiveTb(_pCont, pDockCont); + } + else + { + /* when all windows are moved */ + _pDockMgr->toggleVisTb(_pCont, pDockCont); + } + } +} + + +void Gripper::doTabReordering(POINT pt) +{ + vector vCont = _pDockMgr->getContainerInfo(); + BOOL inTab = FALSE; + HWND hTab = NULL; + HWND hTabOld = _hTab; + int iItem = -1; + int iItemOld = _iItem; + + /* search for every tab entry */ + for (size_t iCont = 0; iCont < vCont.size(); iCont++) + { + hTab = vCont[iCont]->getTabWnd(); + + /* search only if container is visible */ + if (::IsWindowVisible(hTab) == TRUE) + { + RECT rc = {0}; + + ::GetWindowRect(hTab, &rc); + + /* test if cursor points in tab window */ + if (::PtInRect(&rc, pt) == TRUE) + { + TCHITTESTINFO info = {0}; + TCITEM tcItem = {0}; + + if (_hTab == NULL) + { + initTabInformation(pt); + hTabOld = _hTab; + iItemOld = _iItem; + } + + /* get pointed tab item */ + info.pt = pt; + ::ScreenToClient(hTab, &info.pt); + iItem = ::SendMessage(hTab, TCM_HITTEST, 0, (LPARAM)&info); + + if (iItem != -1) + { + /* prevent flickering of tabs with different sizes */ + ::SendMessage(hTab, TCM_GETITEMRECT, iItem, (LPARAM)&rc); + ClientRectToScreenRect(hTab, &rc); + + if ((rc.left + (_rcItem.right - _rcItem.left)) < pt.x) + { + return; + } + + _iItem = iItem; + } + else if ((hTab != _hTab) || (_iItem == -1)) + { + /* test if cusor points after last tab */ + int iLastItem = ::SendMessage(hTab, TCM_GETITEMCOUNT, 0, 0) - 1; + + ::SendMessage(hTab, TCM_GETITEMRECT, iLastItem, (LPARAM)&rc); + if ((rc.left + rc.right) < pt.x) + { + _iItem = iLastItem + 1; + } + } + + _hTab = hTab; + inTab = TRUE; + break; + } + } + } + + /* set and remove tabs correct */ + if ((inTab == TRUE) && (iItemOld != _iItem)) + { + if (_hTab == _hTabSource) + { + /* delete item if switching back to source tab */ + int iSel = ::SendMessage(_hTab, TCM_GETCURSEL, 0, 0); + ::SendMessage(_hTab, TCM_DELETEITEM, iSel, 0); + } + else if (_hTab == hTabOld) + { + /* delete item on switch between tabs */ + ::SendMessage(_hTab, TCM_DELETEITEM, iItemOld, 0); + } + else + { + if (_hTab == hTabOld) + { + /* delete item on switch between tabs */ + ::SendMessage(_hTab, TCM_DELETEITEM, iItemOld, 0); + } + } + } + else if (inTab == FALSE) + { + if (hTabOld != _hTabSource) + { + ::SendMessage(hTabOld, TCM_DELETEITEM, iItemOld, 0); + } + _iItem = -1; + } + + /* insert new entry when mouse doesn't point to current hovered tab */ + if ((_hTab != hTabOld) || (_iItem != iItemOld)) + { + _tcItem.mask = TCIF_PARAM | (_hTab == _hTabSource ? TCIF_TEXT : 0); + ::SendMessage(_hTab, TCM_INSERTITEM, _iItem, (LPARAM)&_tcItem); + } + + /* select the tab only in source tab window */ + if ((_hTab == _hTabSource) && (_iItem != -1)) + { + ::SendMessage(_hTab, TCM_SETCURSEL, _iItem, 0); + } + +#if 0 + extern HWND g_hMainWnd; + TCHAR str[128]; + wsprintf(str, TEXT("Size: %i"), vCont.size()); + ::SetWindowText(g_hMainWnd, str); +#endif + + ::UpdateWindow(_hParent); +} + + +void Gripper::drawRectangle(POINT pt) +{ + HANDLE hbrushOrig = NULL; + RECT rc = {0}; + + if (!_hdc) + _hdc = ::GetDC(NULL); + + // Create a brush with the appropriate bitmap pattern to draw our drag rectangle + if (!_hbm) + _hbm = ::CreateBitmap(8, 8, 1, 1, DotPattern); + if (!_hbrush) + _hbrush = ::CreatePatternBrush(_hbm); + + + // Determine whether to draw a solid drag rectangle or checkered + getMovingRect(pt, &rc); + + ::SetBrushOrgEx(_hdc, rc.left, rc.top, 0); + hbrushOrig = ::SelectObject(_hdc, _hbrush); + + // line: left + ::PatBlt(_hdc, rc.left, rc.top, 3, rc.bottom - 3, PATINVERT); + // line: top + ::PatBlt(_hdc, rc.left + 3, rc.top, rc.right - 3, 3, PATINVERT); + // line: right + ::PatBlt(_hdc, rc.left + rc.right - 3, rc.top + 3, 3, rc.bottom - 3, PATINVERT); + // line: bottom + ::PatBlt(_hdc, rc.left, rc.top + rc.bottom - 3, rc.right - 3, 3, PATINVERT); + + // destroy resources + ::SelectObject(_hdc, hbrushOrig); + +} + + +void Gripper::getMousePoints(POINT* pt, POINT* ptPrev) +{ + *ptPrev = _ptOld; + _ptOld = *pt; +} + + +void Gripper::getMovingRect(POINT pt, RECT *rc) +{ + RECT rcCorr = {0}; + DockingCont* pContHit = NULL; + + /* test if mouse hits a container */ + pContHit = contHitTest(pt); + + if (pContHit != NULL) + { + /* get rect of client */ + ::GetWindowRect(pContHit->getHSelf(), rc); + + /* get rect for correction */ + if (_pCont->isFloating() == TRUE) + rcCorr = _pCont->getDataOfActiveTb()->rcFloat; + else + _pCont->getClientRect(rcCorr); + + ShrinkRcToSize(rc); + ShrinkRcToSize(&rcCorr); + + /* correct rectangle position when mouse is not within */ + DoCalcGripperRect(rc, rcCorr, pt); + } + else + { + /* test if mouse is within work area */ + pContHit = workHitTest(pt, rc); + + /* calcutlates the rect and its position */ + if (pContHit == NULL) + { + /* calcutlates the rect and draws it */ + if (!_pCont->isFloating()) + *rc = _pCont->getDataOfActiveTb()->rcFloat; + else + _pCont->getWindowRect(*rc); + _pCont->getClientRect(rcCorr); + + CalcRectToScreen(_dockData.hWnd, rc); + CalcRectToScreen(_dockData.hWnd, &rcCorr); + + rc->left = pt.x - _ptOffset.x; + rc->top = pt.y - _ptOffset.y; + + /* correct rectangle position when mouse is not within */ + DoCalcGripperRect(rc, rcCorr, pt); + } + } +} + + +DockingCont* Gripper::contHitTest(POINT pt) +{ + vector vCont = _pDockMgr->getContainerInfo(); + HWND hWnd = ::WindowFromPoint(pt); + + for (UINT iCont = 0; iCont < vCont.size(); iCont++) + { + /* test if within caption */ + if (hWnd == vCont[iCont]->getCaptionWnd()) + { + if (vCont[iCont]->isFloating()) + { + RECT rc = {0}; + + vCont[iCont]->getWindowRect(rc); + if ((rc.top < pt.y) && (pt.y < (rc.top + 24))) + { + /* when it is the same container start moving immediately */ + if (vCont[iCont] == _pCont) + { + return NULL; + } + else + { + return vCont[iCont]; + } + } + } + else + { + return vCont[iCont]; + } + } + + /* test only tabs that are visible */ + if (::IsWindowVisible(vCont[iCont]->getTabWnd())) + { + /* test if within tab (rect test is used, because of drag and drop behaviour) */ + RECT rc = {0}; + + ::GetWindowRect(vCont[iCont]->getTabWnd(), &rc); + if (::PtInRect(&rc, pt)) + { + return vCont[iCont]; + } + } + } + + /* doesn't hit a container */ + return NULL; +} + + +DockingCont* Gripper::workHitTest(POINT pt, RECT *rc) +{ + RECT rcCont = {0}; + vector vCont = _pDockMgr->getContainerInfo(); + + /* at first test if cursor points into a visible container */ + for (size_t iCont = 0; iCont < vCont.size(); iCont++) + { + if (vCont[iCont]->isVisible()) + { + vCont[iCont]->getWindowRect(rcCont); + + if (::PtInRect(&rcCont, pt) == TRUE) + { + /* when it does, return with non found docking area */ + return NULL; + } + } + } + + /* now search if cusor hits a possible docking area */ + for (int iWork = 0; iWork < DOCKCONT_MAX; iWork++) + { + if (!vCont[iWork]->isVisible()) + { + rcCont = _dockData.rcRegion[iWork]; + rcCont.right += rcCont.left; + rcCont.bottom += rcCont.top; + + if (rc != NULL) + { + *rc = rcCont; + } + + /* set fix hit test with */ + switch(iWork) + { + case CONT_LEFT: + rcCont.right = rcCont.left + HIT_TEST_THICKNESS; + rcCont.left -= HIT_TEST_THICKNESS; + break; + case CONT_RIGHT: + rcCont.left = rcCont.right - HIT_TEST_THICKNESS; + rcCont.right += HIT_TEST_THICKNESS; + break; + case CONT_TOP: + rcCont.bottom = rcCont.top + HIT_TEST_THICKNESS; + rcCont.top -= HIT_TEST_THICKNESS; + break; + case CONT_BOTTOM: + rcCont.top = rcCont.bottom - HIT_TEST_THICKNESS; + rcCont.bottom += HIT_TEST_THICKNESS; + break; + default: + break; + } + ClientRectToScreenRect(_dockData.hWnd, &rcCont); + + if (::PtInRect(&rcCont, pt) == TRUE) + { + if (rc != NULL) + { + ClientRectToScreenRect(_dockData.hWnd, rc); + rc->right -= rc->left; + rc->bottom -= rc->top; + } + return vCont[iWork]; + } + } + } + + /* no docking area found */ + return NULL; +} + + +void Gripper::initTabInformation(POINT pt) +{ + /* for tab reordering */ + + /* remember handle */ + _hTabSource = _pCont->getTabWnd(); + _startMovingFromTab = _pCont->startMovingFromTab(); + if ((_startMovingFromTab == FALSE) && (::SendMessage(_hTabSource, TCM_GETITEMCOUNT, 0, 0) == 1)) + { + _startMovingFromTab = TRUE; + _iItem = 0; + } + else + { + /* get active tab item */ + _iItem = ::SendMessage(_hTabSource, TCM_GETCURSEL, 0, 0); + } + + /* get size of item */ + _hTab = _hTabSource; + ::SendMessage(_hTabSource, TCM_GETITEMRECT, _iItem, (LPARAM)&_rcItem); + + /* store item data */ + static TCHAR szText[64]; + _tcItem.mask = TCIF_PARAM | TCIF_TEXT; + _tcItem.pszText = szText; + _tcItem.cchTextMax = 64; + ::SendMessage(_hTabSource, TCM_GETITEM, _iItem, (LPARAM)&_tcItem); +} + diff --git a/PowerEditor/src/WinControls/DockingWnd/Gripper.h b/PowerEditor/src/WinControls/DockingWnd/Gripper.h new file mode 100644 index 00000000..d542e80d --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/Gripper.h @@ -0,0 +1,138 @@ +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef GRIPPER_H +#define GRIPPER_H + +#include "Resource.h" +#include "Docking.h" +#include "DockingCont.h" +#include "DockingManager.h" +#include "commctrl.h" + + +// Used by getRectAndStyle() to draw the drag rectangle +static const WORD DotPattern[] = +{ + 0x00aa, 0x0055, 0x00aa, 0x0055, 0x00aa, 0x0055, 0x00aa, 0x0055 +}; + + +#define MDLG_CLASS_NAME TEXT("moveDlg") + + +class Gripper +{ +public: + Gripper(); + + void init(HINSTANCE hInst, HWND hParent) { + _hInst = hInst; + _hParent = hParent; + }; + + void startGrip(DockingCont* pCont, DockingManager* pDockMgr, void* pRes); + + ~Gripper() + { + if (_hdc) + {::ReleaseDC(0, _hdc);} + if (_hbm) + {::DeleteObject(_hbm);} + if (_hbrush) + {::DeleteObject(_hbrush);} + + } + +protected : + + void create(void); + + static LRESULT CALLBACK staticWinProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); + LRESULT runProc(UINT Message, WPARAM wParam, LPARAM lParam); + + void onMove(void); + void onButtonUp(void); + + void doTabReordering(POINT pt); + void drawRectangle(POINT pt); + void getMousePoints(POINT* pt, POINT* ptPrev); + void getMovingRect(POINT pt, RECT *rc); + DockingCont* contHitTest(POINT pt); + DockingCont* workHitTest(POINT pt, RECT *rcCont = NULL); + + void initTabInformation(POINT pt); + + void CalcRectToScreen(HWND hWnd, RECT *rc) { + ClientRectToScreenRect(hWnd, rc); + ShrinkRcToSize(rc); + }; + void CalcRectToClient(HWND hWnd, RECT *rc) { + ScreenRectToClientRect(hWnd, rc); + ShrinkRcToSize(rc); + }; + void ShrinkRcToSize(RECT *rc) { + rc->right -= rc->left; + rc->bottom -= rc->top; + }; + void DoCalcGripperRect(RECT* rc, RECT rcCorr, POINT pt) { + if ((rc->left + rc->right) < pt.x) + rc->left = pt.x - 20; + if ((rc->top + rc->bottom) < pt.y) + rc->top += rcCorr.bottom - rc->bottom; + }; + +private: + /* Handle */ + HINSTANCE _hInst; + HWND _hParent; + HWND _hSelf; + + /* data of container */ + tDockMgr _dockData; + DockingManager* _pDockMgr; + DockingCont* _pCont; + + /* mouse offset in moving rectangle */ + POINT _ptOffset; + + /* remembers old mouse point */ + POINT _ptOld; + BOOL _bPtOldValid; + + /* for sorting tabs */ + HWND _hTab; + HWND _hTabSource; + BOOL _startMovingFromTab; + int _iItem; + RECT _rcItem; + TCITEM _tcItem; + + /* resource pointer of THIS class */ + void* _pRes; + + HDC _hdc; + HBITMAP _hbm; + HBRUSH _hbrush; + + /* is class registered */ + static BOOL _isRegistered; +}; + + + +#endif // GRIPPER_H \ No newline at end of file diff --git a/PowerEditor/src/WinControls/DockingWnd/dockingResource.h b/PowerEditor/src/WinControls/DockingWnd/dockingResource.h new file mode 100644 index 00000000..c3370066 --- /dev/null +++ b/PowerEditor/src/WinControls/DockingWnd/dockingResource.h @@ -0,0 +1,46 @@ +#ifndef DOCKING_RESOURCE_H +#define DOCKING_RESOURCE_H + +#define IDD_PLUGIN_DLG 103 +#define IDC_EDIT1 1000 + + +#define IDB_CLOSE_DOWN 137 +#define IDB_CLOSE_UP 138 +#define IDD_CONTAINER_DLG 139 + +#define IDC_TAB_CONT 1027 +#define IDC_CLIENT_TAB 1028 +#define IDC_BTN_CAPTION 1050 + +#define DMM_MSG 0x5000 + #define DMM_CLOSE (DMM_MSG + 1) + #define DMM_DOCK (DMM_MSG + 2) + #define DMM_FLOAT (DMM_MSG + 3) + #define DMM_DOCKALL (DMM_MSG + 4) + #define DMM_FLOATALL (DMM_MSG + 5) + #define DMM_MOVE (DMM_MSG + 6) + #define DMM_UPDATEDISPINFO (DMM_MSG + 7) + #define DMM_GETIMAGELIST (DMM_MSG + 8) + #define DMM_GETICONPOS (DMM_MSG + 9) + #define DMM_DROPDATA (DMM_MSG + 10) + #define DMM_MOVE_SPLITTER (DMM_MSG + 11) + #define DMM_CANCEL_MOVE (DMM_MSG + 12) + #define DMM_LBUTTONUP (DMM_MSG + 13) + +#define DMN_FIRST 1050 + #define DMN_CLOSE (DMN_FIRST + 1) + //nmhdr.code = DWORD(DMN_CLOSE, 0)); + //nmhdr.hwndFrom = hwndNpp; + //nmhdr.idFrom = ctrlIdNpp; + + #define DMN_DOCK (DMN_FIRST + 2) + #define DMN_FLOAT (DMN_FIRST + 3) + //nmhdr.code = DWORD(DMN_XXX, int newContainer); + //nmhdr.hwndFrom = hwndNpp; + //nmhdr.idFrom = ctrlIdNpp; + + + +#endif //DOCKING_RESOURCE_H + diff --git a/PowerEditor/src/WinControls/Grid/BabyGrid.cpp b/PowerEditor/src/WinControls/Grid/BabyGrid.cpp new file mode 100644 index 00000000..a2ec08fe --- /dev/null +++ b/PowerEditor/src/WinControls/Grid/BabyGrid.cpp @@ -0,0 +1,3268 @@ +//BABYGRID code is copyrighted (C) 20002 by David Hillard +// +//This code must retain this copyright message +// +//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 +*/ + +#include "babygrid.h" +#include "Common.h" + +#define MAX_GRIDS 20 + +#define MAX_ROWS 32000 +#define MAX_COLS 256 + + +//global variables + + + +HFONT hfontbody,hfontheader,hfonttitle; + +HFONT holdfont; + +struct _gridhandlestruct + { + UINT gridmenu; + HWND hlist1; + TCHAR protect[2]; + TCHAR title[305]; + TCHAR editstring[305]; + TCHAR editstringdisplay[305]; + int rows; + int cols; + int gridwidth; + int gridheight; + int homerow; + int homecol; + int rowheight; + int leftvisiblecol; + int rightvisiblecol; + int topvisiblerow; + int bottomvisiblerow; + int headerrowheight; + int cursorrow; + int cursorcol; + int ownerdrawitem; + int visiblecolumns; + int titleheight; + int fontascentheight; + COLORREF cursorcolor; + COLORREF protectcolor; + COLORREF unprotectcolor; + COLORREF textcolor; + COLORREF highlightcolor; + COLORREF gridlinecolor; + COLORREF highlighttextcolor; + BOOL DRAWHIGHLIGHT; + BOOL ADVANCEROW; + BOOL CURRENTCELLPROTECTED; + BOOL GRIDHASFOCUS; + BOOL AUTOROW; + RECT activecellrect; + HFONT hfont; + HFONT hcolumnheadingfont; + HFONT htitlefont; + BOOL ROWSNUMBERED; + BOOL COLUMNSNUMBERED; + BOOL EDITABLE; + BOOL EDITING; + BOOL EXTENDLASTCOLUMN; + BOOL HSCROLL; + BOOL VSCROLL; + BOOL SHOWINTEGRALROWS; + BOOL SIZING; + BOOL ELLIPSIS; + BOOL COLAUTOWIDTH; + BOOL COLUMNSIZING; + BOOL ALLOWCOLUMNRESIZING; + int columntoresize; + int columntoresizeinitsize; + int columntoresizeinitx; + int cursortype; + int columnwidths[MAX_COLS+1]; + BOOL REMEMBERINTEGRALROWS; + int wannabeheight; + int wannabewidth; + + } BGHS[MAX_GRIDS]; + + +_BGCELL BGcell,*LPBGcell; + +int BG_GridIndex; +int FindResult; +TCHAR data[1000]; + + + + + + + +CREATESTRUCT cs,*lpcs; + + +int AddGrid(UINT); +int FindGrid(UINT); +void ShowVscroll(HWND,int); +void ShowHscroll(HWND,int); +int BinarySearchListBox(HWND,TCHAR*); +void DisplayEditString(HWND ,int ,TCHAR*); +int CountGrids(void); + + + + +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////// +int HomeColumnNthVisible(int SI) + { + int j,hc,count; + count=0; + hc=BGHS[SI].homecol; + for(j=1;j<=hc;j++) + { + if(BGHS[SI].columnwidths[j]>0) + { + count++; + } + } + return count; + } + + +void RefreshGrid(HWND hWnd) + { + RECT rect; + int SI; + GetClientRect(hWnd,&rect); + InvalidateRect(hWnd,&rect,FALSE); + SI=FindGrid((UINT)GetMenu(hWnd)); + if(BGHS[SI].EDITING) + { + DisplayEditString(hWnd, SI, TEXT("")); + } + + } + +int GetNextColWithWidth(int SI, int startcol, int direction) + { + //calls with direction == 1 for right, direction == -1 for left + //returns 0 if no more cols in that direction, else column number + int j; + int ReturnValue; + j=startcol; + if(direction == 1){j++;} + if(direction != 1){j--;} + + while((BGHS[SI].columnwidths[j] == 0)&&(j<=BGHS[SI].cols)&&(j>0)) + { + if(direction == 1){j++;} + if(direction != 1){j--;} + } + if((BGHS[SI].columnwidths[j] > 0)&&(j<=BGHS[SI].cols)) + { + ReturnValue = j; + } + else + { + ReturnValue = 0; + } + return ReturnValue; + } + + +int GetRowOfMouse(int SI,int y) + { + int ReturnValue; + if(y<=(BGHS[SI].titleheight)) + { + return -1; + } + if((y>=BGHS[SI].titleheight)&&(y<=BGHS[SI].headerrowheight + BGHS[SI].titleheight)) + { + return 0; + } + + + y=y-(BGHS[SI].headerrowheight + BGHS[SI].titleheight); + y=y/BGHS[SI].rowheight; + ReturnValue = BGHS[SI].homerow + y; + if(ReturnValue > BGHS[SI].rows){ReturnValue = -1;} + return ReturnValue; + } + + +int GetColOfMouse(int SI,int x) + { + int ReturnValue; + int j; + if(x<=BGHS[SI].columnwidths[0]) + { + return 0; + } + + x-=BGHS[SI].columnwidths[0]; + + j=BGHS[SI].homecol; + while(x>0) + { + x-=BGHS[SI].columnwidths[j]; + j++; + } + j--; + + ReturnValue = j; + if(BGHS[SI].EXTENDLASTCOLUMN) + { + if(j>BGHS[SI].cols){ReturnValue = BGHS[SI].cols;} + } + else + { + if(j>BGHS[SI].cols){ReturnValue = -1;} + } + return ReturnValue; + } + +BOOL OutOfRange(_BGCELL *cell) + { + if((cell->row > MAX_ROWS)||(cell->col > MAX_COLS)) + {return TRUE;} + else + {return FALSE;} + } + +void SetCell(_BGCELL *cell,int row, int col) + { + cell->row = row; + cell->col = col; + } +/* +int DetermineDataType(TCHAR* data) + { + //return values: + // 1 = Text or Alpha + // 2 = Numeric + // 3 = Boolean TRUE + // 4 = Boolean FALSE + // 5 = Graphic - user drawn (cell text begins with ~) + int j,k,numberofperiods,numberofpositives,numberofnegatives; + TCHAR tbuffer[1000]; + BOOL DIGIT,ALPHA,PERIOD,WHITESPACE,SYMBOL,POSITIVE,NEGATIVE; + lstrcpy(tbuffer,data); + k=lstrlen(tbuffer); + strupr(tbuffer); + //is it boolean? + if(!lstrcmp(tbuffer,"TRUE")) + { + return 3; + } + if(!lstrcmp(tbuffer,"FALSE")) + { + return 4; + } + //is it graphic (~) + if(tbuffer[0]=='~') + { + return 5; + } + DIGIT=FALSE; + ALPHA=FALSE; + PERIOD=FALSE; + WHITESPACE=FALSE; + SYMBOL=FALSE; + POSITIVE=FALSE; + NEGATIVE=FALSE; + + numberofperiods=0; + numberofpositives=0; + numberofnegatives=0; + for(j=0;j0){ALPHA=TRUE;}} + if(tbuffer[j]=='-'){if(j>0){ALPHA=TRUE;}} + } + if((ALPHA)||(WHITESPACE)) + { + return 1; + } + if((DIGIT)&&(!ALPHA)&&(!WHITESPACE)) + { + if(numberofperiods>1) + { + return 1; + } + else + { + return 2; + } + } + return 1; + } +*/ + +void CalcVisibleCellBoundaries(int SelfIndex) +{ + int gridx,gridy; + int j; + gridx=BGHS[SelfIndex].gridwidth; + gridy=BGHS[SelfIndex].gridheight; + + + + j= BGHS[SelfIndex].homecol; + BGHS[SelfIndex].leftvisiblecol = BGHS[SelfIndex].homecol; + BGHS[SelfIndex].topvisiblerow = BGHS[SelfIndex].homerow; + //calc columns visible + //first subtract the width of col 0; + gridx = gridx - BGHS[SelfIndex].columnwidths[0]; + do + { + gridx = gridx - BGHS[SelfIndex].columnwidths[j]; + j++; + }while ((gridx >= 0)&&(jBGHS[SelfIndex].cols){j=BGHS[SelfIndex].cols;} + BGHS[SelfIndex].rightvisiblecol = j; + + + + + //calc rows visible; + gridy = gridy - BGHS[SelfIndex].headerrowheight; + j= BGHS[SelfIndex].homerow; + do + { + gridy = gridy - BGHS[SelfIndex].rowheight; + j++; + }while ((gridy > 0)&&(jBGHS[SelfIndex].rows){j=BGHS[SelfIndex].rows;} + BGHS[SelfIndex].bottomvisiblerow = j; +} + + +RECT GetCellRect(HWND hWnd,int SI, int r, int c) + { + RECT rect; + int offset; + int j; + //c and r must be greater than zero + + //get column offset + //first get col 0 width + offset=BGHS[SI].columnwidths[0]; + for(j=BGHS[SI].homecol;j BGHS[SI].columnwidths[c]) + { + rect.right = offset + (trect.right - rect.left); + } + } + } + + //now get the top and bottom of the rect + offset = BGHS[SI].headerrowheight+BGHS[SI].titleheight; + for(j=BGHS[SI].homerow;j0) + { + int high,low; + high = ((c-1)/26); + low = c % 26; + if(high == 0){high = 32;}else{high+=64;} + if(low == 0){low=26;} + low += 64; + wsprintf(buffer, TEXT("%c%c"), high,low); + } + } + rectsave=rect; + DrawEdge(gdc,&rect,EDGE_ETCHED,BF_MIDDLE|BF_RECT|BF_ADJUST); + DrawTextEx(gdc,buffer,-1,&rect,DT_END_ELLIPSIS|DT_CENTER|DT_WORDBREAK|DT_NOPREFIX,NULL); + rect=rectsave; + + r=BGHS[SI].topvisiblerow; + //set font for grid body + SelectObject(gdc,hfont); + while(r<=BGHS[SI].bottomvisiblerow) + { + + //try to set cursor row to different display color + if((r==BGHS[SI].cursorrow)&&(c>0)&&(BGHS[SI].DRAWHIGHLIGHT)) + { + if(BGHS[SI].GRIDHASFOCUS) + { + SetTextColor(gdc,BGHS[SI].highlighttextcolor); + } + else + { + SetTextColor(gdc,RGB(0,0,0));//set black text for nonfocus grid hilight + } + } + else + { + SetTextColor(gdc,RGB(0,0,0)); + } + + rect.top = rect.bottom; + rect.bottom = rect.top + BGHS[SI].rowheight; + rectsave=rect; + SetCell(&BGcell,r,c); + lstrcpy(buffer, TEXT("")); + SendMessage(hWnd,BGM_GETCELLDATA,(WPARAM)&BGcell,(LPARAM)buffer); + if((c==0)&&(BGHS[SI].ROWSNUMBERED)) + { + wsprintf(buffer, TEXT("%d"), r); + } + if(c==0) + { + DrawEdge(gdc,&rect,EDGE_ETCHED,BF_MIDDLE|BF_RECT|BF_ADJUST); + + } + else + { + HBRUSH hbrush,holdbrush; + HPEN hpen,holdpen; + iProtection=SendMessage(hWnd,BGM_GETPROTECTION,(WPARAM)&BGcell,0); + if(BGHS[SI].DRAWHIGHLIGHT)//highlight on + { + if(r==BGHS[SI].cursorrow) + { + if(BGHS[SI].GRIDHASFOCUS) + { + hbrush=CreateSolidBrush(BGHS[SI].highlightcolor); + } + else + { + hbrush=CreateSolidBrush(RGB(200,200,200)); + } + } + + else + { + if(iProtection == 1) + { + hbrush=CreateSolidBrush(BGHS[SI].protectcolor); + } + else + { + hbrush=CreateSolidBrush(BGHS[SI].unprotectcolor); + } + } + } + else + { + if(iProtection == 1) + { + hbrush=CreateSolidBrush(BGHS[SI].protectcolor); + } + else + { + hbrush=CreateSolidBrush(BGHS[SI].unprotectcolor); + } + + } + hpen=CreatePen(PS_SOLID,1,BGHS[SI].gridlinecolor); + holdbrush=(HBRUSH)SelectObject(gdc,hbrush); + holdpen=(HPEN)SelectObject(gdc,hpen); + Rectangle(gdc,rect.left,rect.top,rect.right,rect.bottom); + SelectObject(gdc,holdbrush); + SelectObject(gdc,holdpen); + DeleteObject(hbrush); + DeleteObject(hpen); + } + rect.right -= 2; + rect.left += 2; + + iDataType=SendMessage(hWnd,BGM_GETTYPE,(WPARAM)&BGcell,0); + if((iDataType < 1)||(iDataType > 5)) + { + iDataType = 1;//default to alphanumeric data type.. can't happen + } + if(c==0){iDataType = 2;} + + if(iDataType == 1)//ALPHA + { + if(BGHS[SI].ELLIPSIS) + { + DrawTextEx(gdc,buffer,-1,&rect,DT_END_ELLIPSIS|DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX,NULL); + } + else + { + DrawTextEx(gdc,buffer,-1,&rect,DT_LEFT|DT_WORDBREAK|DT_EDITCONTROL|DT_NOPREFIX,NULL); + } + } + + if(iDataType == 2)//NUMERIC + { + DrawTextEx(gdc,buffer,-1,&rect,DT_END_ELLIPSIS|DT_RIGHT|DT_VCENTER|DT_SINGLELINE|DT_NOPREFIX,NULL); + } + + if(iDataType == 3)//BOOLEAN TRUE + { + int k,excess; + k=2; + rect.top +=k; + rect.bottom -=k; + rect.left +=0; + rect.right -=0; + if((rect.bottom - rect.top)>24) + { + excess=(rect.bottom - rect.top)-16; + rect.top += (int)(excess/2); + rect.bottom -= (int)(excess/2); + } + DrawFrameControl(gdc,&rect,DFC_BUTTON,DFCS_BUTTONCHECK|DFCS_CHECKED); + } + + if(iDataType == 4)//BOOLEAN FALSE + { + int k,excess; + k=2; + rect.top +=k; + rect.bottom -=k; + rect.left +=0; + rect.right -=0; + if((rect.bottom - rect.top)>24) + { + excess=(rect.bottom - rect.top)-16; + rect.top += (int)(excess/2); + rect.bottom -= (int)(excess/2); + } + + + DrawFrameControl(gdc,&rect,DFC_BUTTON,DFCS_BUTTONCHECK); + } + + if(iDataType == 5) //user drawn graphic + { + WPARAM wParam; + buffer[0]=0x20; + BGHS[SI].ownerdrawitem = generic_atoi(buffer); + wParam=MAKEWPARAM((UINT)::GetMenu(hWnd),BGN_OWNERDRAW); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,(LPARAM)&rect); + } + + if(BGHS[SI].EDITING) + { + DisplayEditString(hWnd, SI, TEXT("")); + } + + rect=rectsave; + r++; + }//end while r<=bottomvisiblerow + + { + //repaint bottom of grid + RECT trect; + HBRUSH holdbrush; + HPEN holdpen; + GetClientRect(hWnd,&trect); + trect.top = rect.bottom; + trect.left = rect.left; + trect.right = rect.right; + + holdbrush=(HBRUSH)SelectObject(gdc,GetStockObject(GRAY_BRUSH)); + holdpen=(HPEN)SelectObject(gdc,GetStockObject(NULL_PEN)); + + Rectangle(gdc,trect.left,trect.top,trect.right+1,trect.bottom+1); + + SelectObject(gdc,holdbrush); + SelectObject(gdc,holdpen); + + } + + + SelectObject(gdc,holdfont); + DeleteObject(holdfont); + ReleaseDC(hWnd,gdc); + + + +} + + + + + +void DrawCursor(HWND hWnd,int SI) + { + RECT rect,rectwhole; + HDC gdc; + HPEN hpen,holdpen; + int rop; + if(BGHS[SI].rows == 0){return;} + GetClientRect(hWnd,&rect); + //if active cell has scrolled off the top, don't draw a focus rectangle + if(BGHS[SI].cursorrow < BGHS[SI].homerow){return;} + //if active cell has scrolled off to the left, don't draw a focus rectangle + if(BGHS[SI].cursorcol < BGHS[SI].homecol){return;} + + rect = GetCellRect(hWnd,SI,BGHS[SI].cursorrow,BGHS[SI].cursorcol); + rectwhole=rect; + gdc=GetDC(hWnd); + BGHS[SI].activecellrect = rect; + rop=GetROP2(gdc); + SetROP2(gdc,R2_XORPEN); + SelectObject(gdc,(HBRUSH)GetStockObject(NULL_BRUSH)); + hpen=CreatePen(PS_SOLID,3,BGHS[SI].cursorcolor); //width of 3 + holdpen=(HPEN)SelectObject(gdc,hpen); + Rectangle(gdc,rect.left,rect.top,rect.right,rect.bottom); + SelectObject(gdc,holdpen); + DeleteObject(hpen); + SetROP2(gdc,rop); + ReleaseDC(hWnd,gdc); + } + +void SetCurrentCellStatus(HWND hWnd,int SelfIndex) + { + SetCell(&BGcell,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + if(SendMessage(hWnd,BGM_GETPROTECTION,(WPARAM)&BGcell,0)) + { + BGHS[SelfIndex].CURRENTCELLPROTECTED = TRUE; + } + else + { + BGHS[SelfIndex].CURRENTCELLPROTECTED = FALSE; + } + + } + + + +TCHAR GetASCII(WPARAM wParam, LPARAM lParam) + { + int returnvalue; + TCHAR mbuffer[100]; + int result; + BYTE keys[256]; + WORD dwReturnedValue; + GetKeyboardState(keys); + result=ToAscii(wParam,(lParam >> 16) && 0xff,keys,&dwReturnedValue,0); + returnvalue = (TCHAR) dwReturnedValue; + if(returnvalue < 0){returnvalue = 0;} + wsprintf(mbuffer, TEXT("return value = %d"), returnvalue); + if(result!=1){returnvalue = 0;} + return (TCHAR)returnvalue; + + } + + + +void SetHomeRow(HWND hWnd,int SI,int row,int col) + { + RECT gridrect,cellrect; + //get rect of grid window + GetClientRect(hWnd,&gridrect); + //get rect of current cell + cellrect=GetCellRect(hWnd,SI,row,col); + if((cellrect.bottom > gridrect.bottom)&&((cellrect.bottom - cellrect.top)<(gridrect.bottom-(BGHS[SI].headerrowheight+BGHS[SI].titleheight)))) + { + while(cellrect.bottom > gridrect.bottom) + { + BGHS[SI].homerow ++; + if(row==BGHS[SI].rows) + { + gridrect.top = gridrect.bottom - (BGHS[SI].rowheight); + InvalidateRect(hWnd,&gridrect,TRUE); + } + else + { + InvalidateRect(hWnd,&gridrect,FALSE); + } + cellrect=GetCellRect(hWnd,SI,row,col); + } + } + else + { + if((cellrect.bottom - cellrect.top)>=(gridrect.bottom - (BGHS[SI].headerrowheight+BGHS[SI].titleheight))) + { + BGHS[SI].homerow++; + } + } + cellrect=GetCellRect(hWnd,SI,row,col); + { + while((row < BGHS[SI].homerow)) + { + BGHS[SI].homerow --; + InvalidateRect(hWnd,&gridrect,FALSE); + cellrect=GetCellRect(hWnd,SI,row,col); + } + } + //set the vertical scrollbar position + SetScrollPos(hWnd,SB_VERT,BGHS[SI].homerow,TRUE); + } + + + +void SetHomeCol(HWND hWnd,int SI,int row,int col) + { + RECT gridrect,cellrect; + BOOL LASTCOLVISIBLE; + //get rect of grid window + GetClientRect(hWnd,&gridrect); + //get rect of current cell + cellrect = GetCellRect(hWnd,SI,row,col); + //determine if scroll left or right is needed + while((cellrect.right > gridrect.right)&&(cellrect.left != BGHS[SI].columnwidths[0])) + { + //scroll right is needed + BGHS[SI].homecol++; + //see if last column is visible + cellrect = GetCellRect(hWnd,SI,row,BGHS[SI].cols); + if(cellrect.right <= gridrect.right) + { + LASTCOLVISIBLE=TRUE; + } + else + { + LASTCOLVISIBLE=FALSE; + } + cellrect = GetCellRect(hWnd,SI,row,col); + InvalidateRect(hWnd,&gridrect,FALSE); + } + cellrect = GetCellRect(hWnd,SI,row,col); + while((BGHS[SI].cursorcol < BGHS[SI].homecol)&&(BGHS[SI].homecol > 1)) + + { + //scroll left is needed + BGHS[SI].homecol--; + //see if last column is visible + cellrect = GetCellRect(hWnd,SI,row,BGHS[SI].cols); + if(cellrect.right <= gridrect.right) + { + LASTCOLVISIBLE=TRUE; + } + else + { + LASTCOLVISIBLE=FALSE; + } + + cellrect = GetCellRect(hWnd,SI,row,col); + InvalidateRect(hWnd,&gridrect,FALSE); + } + { + int k; + k=HomeColumnNthVisible(SI); + SetScrollPos(hWnd,SB_HORZ,k,TRUE); + } + } + + + +void ShowVscroll(HWND hWnd,int SI) + { + //if more rows than can be visible on grid, display vertical scrollbar + //otherwise, hide it. + RECT gridrect; + int totalpixels; + int rowsvisibleonscreen; + GetClientRect(hWnd,&gridrect); + totalpixels = gridrect.bottom; + totalpixels -= BGHS[SI].titleheight; + totalpixels -= BGHS[SI].headerrowheight; + totalpixels -= (BGHS[SI].rowheight * BGHS[SI].rows); + rowsvisibleonscreen = (gridrect.bottom - (BGHS[SI].headerrowheight+BGHS[SI].titleheight)) / BGHS[SI].rowheight; + if(totalpixels < 0) + { + //show vscrollbar + ShowScrollBar(hWnd,SB_VERT,TRUE); + SetScrollRange(hWnd,SB_VERT,1,(BGHS[SI].rows-rowsvisibleonscreen)+1,TRUE); + BGHS[SI].VSCROLL = TRUE; + } + else + { + //hide vscrollbar + ShowScrollBar(hWnd,SB_VERT,FALSE); + BGHS[SI].VSCROLL = FALSE; + } + + } + +void ShowHscroll(HWND hWnd,int SI) + { + //if more rows than can be visible on grid, display vertical scrollbar + //otherwise, hide it. + RECT gridrect; + int totalpixels; + int colswithwidth; + int j; + GetClientRect(hWnd,&gridrect); + totalpixels = gridrect.right; + totalpixels -= BGHS[SI].columnwidths[0]; + colswithwidth = 0; + for(j=1;j<=BGHS[SI].cols;j++) + { + totalpixels -= BGHS[SI].columnwidths[j]; + if(BGHS[SI].columnwidths[j]>0) + { + colswithwidth++; + } + } + if(totalpixels < 0) + { + //show hscrollbar + ShowScrollBar(hWnd,SB_HORZ,TRUE); + SetScrollRange(hWnd,SB_HORZ,1,colswithwidth,TRUE); + BGHS[SI].HSCROLL = TRUE; + } + else + { + //hide hscrollbar + ShowScrollBar(hWnd,SB_HORZ,FALSE); + BGHS[SI].HSCROLL = FALSE; + } + + } + + + +void NotifyRowChanged(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_ROWCHANGED); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_SELCHANGE); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + } + + +void NotifyColChanged(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_COLCHANGED); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_SELCHANGE); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + + } + + +void NotifyEndEdit(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_EDITEND); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + + } + + +void NotifyDelete(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_DELETECELL); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + + } + + +void NotifyEditBegin(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_EDITBEGIN); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + + } + +void NotifyEditEnd(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_EDITEND); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + + } + +/* +void NotifyF1(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_F1); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + + } + +void NotifyF2(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_F2); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + + } + +void NotifyF3(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_F3); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + + } + +void NotifyF4(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_F4); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + + } + +void NotifyF5(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_F5); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + + } + +void NotifyF6(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_F6); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + + } + +void NotifyF7(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_F7); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + + } + +void NotifyF8(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_F8); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + + } + +void NotifyF9(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_F9); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + + } + +void NotifyF10(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_F10); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + + } + +void NotifyF11(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_F11); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + + } + +void NotifyF12(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_F12); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + + } +*/ +void NotifyCellClicked(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_CELLCLICKED); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + + } + +void NotifyCellDbClicked(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_CELLDBCLICKED); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + } + +void NotifyCellRClicked(HWND hWnd,int SI) + { + WPARAM wParam; + LPARAM lParam; + lParam = MAKELPARAM(BGHS[SI].cursorrow,BGHS[SI].cursorcol); + wParam=MAKEWPARAM((UINT)BGHS[SI].gridmenu,BGN_CELLRCLICKED); + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + } +void GetVisibleColumns(HWND hWnd,int SI) + { + int j; + int value; + value=0; + for(j=1;j<=BGHS[SI].cols;j++) + { + if(BGHS[SI].columnwidths[j] > 0) + { + value++; + } + } + BGHS[SI].visiblecolumns = value; + SetScrollRange(hWnd,SB_HORZ,1,value,TRUE); + } + +int GetNthVisibleColumn(HWND hWnd,int SI,int n) + { + int j,count; + int value; + j=1; + count=0; + value = n-1; + while(j<=BGHS[SI].cols) + { + if(BGHS[SI].columnwidths[j]>0) + { + count++; + if(count==n) + { + value = j; + } + } + j++; + } + return value; + } + + +void CloseEdit(HWND hWnd,int SI) + { + int r,c; + _BGCELL cell; + r=BGHS[SI].cursorrow; + c=BGHS[SI].cursorcol; + cell.row = r; + cell.col = c; + SendMessage(hWnd,BGM_SETCELLDATA,(WPARAM)&cell,(LPARAM)BGHS[SI].editstring); + lstrcpy(BGHS[SI].editstring, TEXT("")); + RefreshGrid(hWnd); + BGHS[SI].EDITING = FALSE; + HideCaret(hWnd); + NotifyEditEnd(hWnd,SI); + } + +void DisplayEditString(HWND hWnd,int SI,TCHAR* tstring) + { + int r,c; + HFONT holdfont; + RECT rt; + HDC cdc; + r=BGHS[SI].cursorrow; + c=BGHS[SI].cursorcol; + ShowCaret(hWnd); + if((rcx > longest) + { + longest=size->cx; + } + p = generic_strtok('\0', TEXT("\n")); + } + return longest; + } + + +LRESULT CALLBACK GridProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + int wmId, wmEvent; + PAINTSTRUCT ps; + HDC hdc; + TCHAR buffer[1000]; + int SelfIndex; + int ReturnValue; + UINT SelfMenu; + HINSTANCE hInst; + int iDataType; + static int ASCII; + + + SelfIndex=FindGrid((UINT)GetMenu(hWnd)); + SelfMenu=BGHS[SelfIndex].gridmenu; + + //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; + + } + + ReturnValue = 0; + + switch (message) + { + case WM_COMMAND: + wmId = LOWORD(wParam); + wmEvent = HIWORD(wParam); + // Parse the menu selections: + switch (wmId) + { + case 1: + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + break; + + case WM_PAINT: + hdc = BeginPaint(hWnd, &ps); + RECT rt; + GetClientRect(hWnd, &rt); + CalcVisibleCellBoundaries(SelfIndex); + //display title + DisplayTitle(hWnd,SelfIndex,BGHS[SelfIndex].htitlefont); + //display column 0; + + DisplayColumn(hWnd,SelfIndex,0,0,BGHS[SelfIndex].hfont,BGHS[SelfIndex].hcolumnheadingfont); + { + int c,j,k,offset; + offset = BGHS[SelfIndex].columnwidths[0]; + j=BGHS[SelfIndex].leftvisiblecol; + k=BGHS[SelfIndex].rightvisiblecol; + for(c=j;c<=k;c++) + { + DisplayColumn(hWnd,SelfIndex,c,offset,BGHS[SelfIndex].hfont,BGHS[SelfIndex].hcolumnheadingfont); + offset+=BGHS[SelfIndex].columnwidths[c]; + } + + } + EndPaint(hWnd, &ps); + // + if(GetFocus()==hWnd) + { + PostMessage(hWnd,BGM_DRAWCURSOR,(UINT)SelfIndex,0); + } + + + break; + + + case BGM_PAINTGRID: + { + RECT rect; + GetClientRect(hWnd, &rect); + InvalidateRect(hWnd,&rect,TRUE); + UpdateWindow(hWnd); + MessageBeep(0); + } + break; + case WM_SETTEXT: + { + int j,linecount; + SIZE size; + HDC gdc; + HFONT holdfont; + if(lstrlen((TCHAR*)lParam)>300) + { + lstrcpy(BGHS[SelfIndex].title, TEXT("Title too long (300 chars max)")); + } + else + { + 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++) + { + if(BGHS[SelfIndex].title[j]=='\n') + { + linecount++; + } + + } + holdfont=(HFONT)SelectObject(gdc,BGHS[SelfIndex].htitlefont); + GetTextExtentPoint32(gdc,BGHS[SelfIndex].title,lstrlen(BGHS[SelfIndex].title),&size); + SelectObject(gdc,holdfont); + BGHS[SelfIndex].titleheight = (int)((size.cy*1.2) * linecount); + } + else + { + //no title + BGHS[SelfIndex].titleheight = 0; + } + ReleaseDC(hWnd,gdc); + + + RefreshGrid(hWnd); + SizeGrid(hWnd,SelfIndex); + + } + break; + case BGM_GETROWS: + ReturnValue = BGHS[SelfIndex].rows; + break; + + case BGM_GETCOLS: + ReturnValue = BGHS[SelfIndex].cols; + break; + + case BGM_GETCOLWIDTH: + ReturnValue = BGHS[SelfIndex].columnwidths[wParam]; + break; + + case BGM_GETROWHEIGHT: + ReturnValue = BGHS[SelfIndex].rowheight; + break; + + case BGM_GETHEADERROWHEIGHT: + ReturnValue = BGHS[SelfIndex].headerrowheight; + break; + + case BGM_GETOWNERDRAWITEM: + ReturnValue = BGHS[SelfIndex].ownerdrawitem; + break; + + case BGM_DRAWCURSOR: + DrawCursor(hWnd,wParam); + break; + case BGM_SETCURSORPOS: + DrawCursor(hWnd,SelfIndex); + if((((int)wParam <= BGHS[SelfIndex].rows)&&((int)wParam > 0))&& + (((int)lParam <= BGHS[SelfIndex].cols)&&((int)lParam > 0))) + { + BGHS[SelfIndex].cursorrow=wParam; + BGHS[SelfIndex].cursorcol=lParam; + } + else + { + DrawCursor(hWnd,SelfIndex); + break; + } + SetHomeRow(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + SetHomeCol(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + DrawCursor(hWnd,SelfIndex); + RefreshGrid(hWnd); + + break; + case BGM_SHOWHILIGHT: + BGHS[SelfIndex].DRAWHIGHLIGHT = (BOOL)wParam; + RefreshGrid(hWnd); + break; + case BGM_EXTENDLASTCOLUMN: + BGHS[SelfIndex].EXTENDLASTCOLUMN = (BOOL)wParam; + RefreshGrid(hWnd); + break; + + case BGM_SHOWINTEGRALROWS: + BGHS[SelfIndex].SHOWINTEGRALROWS = (BOOL)wParam; + SizeGrid(hWnd,SelfIndex); + RefreshGrid(hWnd); + break; + + case BGM_SETCOLAUTOWIDTH: + BGHS[SelfIndex].COLAUTOWIDTH = (BOOL)wParam; + break; + + case BGM_SETALLOWCOLRESIZE: + BGHS[SelfIndex].ALLOWCOLUMNRESIZING = (BOOL)wParam; + break; + + case BGM_PROTECTCELL: + LPBGcell=(_BGCELL*)wParam; + if(OutOfRange(LPBGcell)) + { + wParam=MAKEWPARAM((UINT)GetMenu(hWnd),BGN_OUTOFRANGE); + lParam = 0; + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + ReturnValue = -1; + break; + } + wsprintf(buffer, TEXT("%05d-%03d"), LPBGcell->row,LPBGcell->col); + //see if that cell is already loaded + FindResult = BinarySearchListBox(BGHS[SelfIndex].hlist1,buffer); + if(FindResult != LB_ERR) + { + //it was found, get the text, modify text delete it from list, add modified to list + SendMessage(BGHS[SelfIndex].hlist1,LB_GETTEXT,FindResult,(LPARAM)buffer); + if((BOOL)lParam) + { + buffer[10] = 'P'; + } + else + { + buffer[10] = 'U'; + } + SendMessage(BGHS[SelfIndex].hlist1,LB_DELETESTRING,FindResult,0); + SendMessage(BGHS[SelfIndex].hlist1,LB_ADDSTRING,FindResult,(LPARAM)buffer); + } + else + { + //protecting or unprotecting a cell that isn't in the list + //add it as blank; + lstrcat(buffer, TEXT("|")); + if((BOOL)lParam) + { + lstrcat(buffer, TEXT("PA")); + } + else + { + lstrcat(buffer, TEXT("UA")); + } + lstrcat(buffer, TEXT("|")); + SendMessage(BGHS[SelfIndex].hlist1,LB_ADDSTRING,FindResult,(LPARAM)buffer); + } + + break; + case BGM_NOTIFYROWCHANGED: + NotifyRowChanged(hWnd,SelfIndex); + break; + case BGM_NOTIFYCOLCHANGED: + NotifyColChanged(hWnd,SelfIndex); + break; + case BGM_SETPROTECT: + if((BOOL)wParam) + { + lstrcpy(BGHS[SelfIndex].protect, TEXT("P")); + } + else + { + lstrcpy(BGHS[SelfIndex].protect, TEXT("U")); + } + break; + + case BGM_AUTOROW: + if((BOOL)wParam) + { + BGHS[SelfIndex].AUTOROW = TRUE; + } + else + { + BGHS[SelfIndex].AUTOROW = FALSE; + } + break; + case BGM_SETEDITABLE: + if((BOOL)wParam) + { + BGHS[SelfIndex].EDITABLE = TRUE; + } + else + { + BGHS[SelfIndex].EDITABLE = FALSE; + } + break; + + case BGM_SETCELLDATA: + LPBGcell=(_BGCELL*)wParam; + if(OutOfRange(LPBGcell)) + { + wParam=MAKEWPARAM((UINT)GetMenu(hWnd),BGN_OUTOFRANGE); + lParam = 0; + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + ReturnValue = -1; + break; + } + wsprintf(buffer, TEXT("%05d-%03d"), LPBGcell->row,LPBGcell->col); + //see if that cell is already loaded + FindResult = BinarySearchListBox(BGHS[SelfIndex].hlist1,buffer); + if(FindResult != LB_ERR) + { + //it was found, delete it + SendMessage(BGHS[SelfIndex].hlist1,LB_DELETESTRING,FindResult,0); + } + //now add it + lstrcat(buffer, TEXT("|")); + lstrcat(buffer,BGHS[SelfIndex].protect); + //determine data type (text,numeric, or boolean)(1,2,3) + //iDataType=DetermineDataType((TCHAR*)lParam); + + iDataType = 1; + if(iDataType==1){lstrcat(buffer, TEXT("A"));} + if(iDataType==2){lstrcat(buffer, TEXT("N"));} + if(iDataType==3){lstrcat(buffer, TEXT("T"));} + if(iDataType==4){lstrcat(buffer, TEXT("F"));} + if(iDataType==5){lstrcat(buffer, TEXT("G"));} + + lstrcat(buffer, TEXT("|")); + lstrcat(buffer, (TCHAR*)lParam); + FindResult=SendMessage(BGHS[SelfIndex].hlist1,LB_ADDSTRING,0,(LPARAM)buffer); + + if(FindResult==LB_ERR) + { + MessageBeep(0); + } + { + RECT rect; + rect=GetCellRect(hWnd,SelfIndex,LPBGcell->row,LPBGcell->col); + InvalidateRect(hWnd,&rect,FALSE); + } + //get the last line and adjust grid dimmensions + if(BGHS[SelfIndex].AUTOROW) + { + int j; + j=SendMessage(BGHS[SelfIndex].hlist1,LB_GETCOUNT,0,0); + if(j>0) + { + SendMessage(BGHS[SelfIndex].hlist1,LB_GETTEXT,j-1,(LPARAM)buffer); + buffer[5]=0x00; + j=generic_atoi(buffer); + if(j>SendMessage(hWnd,BGM_GETROWS,0,0)) + { + SendMessage(hWnd,BGM_SETGRIDDIM,j,BGHS[SelfIndex].cols); + } + } + else + { + //no items in the list + SendMessage(hWnd,BGM_SETGRIDDIM,j,BGHS[SelfIndex].cols); + } + } + + //adjust the column width if COLAUTOWIDTH==TRUE + if((BGHS[SelfIndex].COLAUTOWIDTH)||(LPBGcell->row == 0)) + { + HDC hdc; + SIZE size; + int required_width; + int current_width; + int required_height = 30; + int current_height; + int longestline; + HFONT holdfont; + hdc=GetDC(hWnd); + if(LPBGcell->row == 0) + { + holdfont=(HFONT)SelectObject(hdc,BGHS[SelfIndex].hcolumnheadingfont); + } + else + { + holdfont=(HFONT)SelectObject(hdc,BGHS[SelfIndex].hfont); + } + //if there are \n codes in the generic_string, find the longest line + longestline=FindLongestLine(hdc,(TCHAR*)lParam,&size); + //GetTextExtentPoint32(hdc,(TCHAR*)lParam,lstrlen((TCHAR*)lParam),&size); + required_width = longestline+15; + required_height = size.cy; + //count lines + { + int count=1; + TCHAR tbuffer[255]; + lstrcpy(tbuffer,(TCHAR*)lParam); + for(int j=0;j<(int)lstrlen(tbuffer);j++) + { + if(tbuffer[j]=='\n'){count++;} + } + if((!BGHS[SelfIndex].ELLIPSIS)||(LPBGcell->row == 0)) + { + required_height *= count; + } + required_height +=5; + } + SelectObject(hdc,holdfont); + ReleaseDC(hWnd,hdc); + current_width = BGHS[SelfIndex].columnwidths[LPBGcell->col]; + if(LPBGcell->row == 0) + { + current_height = BGHS[SelfIndex].headerrowheight; + if(required_height > current_height) + { + SendMessage(hWnd,BGM_SETHEADERROWHEIGHT,required_height,0); + } + } + else + { + current_height = BGHS[SelfIndex].rowheight; + if(required_height > current_height) + { + SendMessage(hWnd, BGM_SETROWHEIGHT, /*required_height*/20, 0); + } + + } + if(required_width > current_width) + { + SendMessage(hWnd,BGM_SETCOLWIDTH,LPBGcell->col,required_width); + } + ReleaseDC(hWnd,hdc); + } + + break; + + case BGM_GETCELLDATA: + LPBGcell=(_BGCELL*)wParam; + if(OutOfRange(LPBGcell)) + { + wParam=MAKEWPARAM((UINT)GetMenu(hWnd),BGN_OUTOFRANGE); + lParam = 0; + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + ReturnValue = -1; + break; + } + wsprintf(buffer, TEXT("%05d-%03d"),LPBGcell->row,LPBGcell->col); + //see if that cell is already loaded + FindResult = BinarySearchListBox(BGHS[SelfIndex].hlist1,buffer); + if(FindResult != LB_ERR) + { + int j,k,c; + TCHAR tbuffer[1000]; + //it was found, get it + SendMessage(BGHS[SelfIndex].hlist1,LB_GETTEXT,FindResult,(long)lParam); + lstrcpy(tbuffer,(TCHAR*)lParam); + k=lstrlen(tbuffer); + c=0; + for(j=13;jrow,LPBGcell->col); + //see if that cell is already loaded + FindResult = BinarySearchListBox(BGHS[SelfIndex].hlist1,buffer); + if(FindResult != LB_ERR) + { + //it was found, delete it + SendMessage(BGHS[SelfIndex].hlist1,LB_DELETESTRING,FindResult,0); + NotifyEndEdit(hWnd,SelfIndex); + } + break; + case BGM_SETGRIDDIM: + if((wParam>=0)&&(wParam<=MAX_ROWS)) + { + BGHS[SelfIndex].rows = wParam; + } + else + { + if(wParam<0) + { + BGHS[SelfIndex].rows = 0; + } + else + { + BGHS[SelfIndex].rows = MAX_ROWS; + } + } + + if((lParam>0)&&(lParam<=MAX_COLS)) + { + BGHS[SelfIndex].cols = lParam; + } + else + { + if(lParam <= 0) + { + BGHS[SelfIndex].cols = 1; + } + else + { + BGHS[SelfIndex].cols = MAX_COLS; + } + } + {RECT rect; + GetClientRect(hWnd,&rect); + InvalidateRect(hWnd,&rect,TRUE); + } + GetVisibleColumns(hWnd,SelfIndex); + break; + + + case BGM_SETCOLWIDTH: + if((wParam <= MAX_COLS)&&(wParam >= 0) && (lParam >= 0)) + { + RECT rect; + BGHS[SelfIndex].columnwidths[wParam] = lParam; + GetClientRect(hWnd,&rect); + InvalidateRect(hWnd,&rect,FALSE); + GetVisibleColumns(hWnd,SelfIndex); + } + break; + case BGM_SETHEADERROWHEIGHT: + if(wParam >= 0) + { + RECT rect; + BGHS[SelfIndex].headerrowheight = wParam; + SizeGrid(hWnd,SelfIndex); + GetClientRect(hWnd,&rect); + InvalidateRect(hWnd,&rect,FALSE); + } + break; + + case BGM_GETROW: + ReturnValue = BGHS[SelfIndex].cursorrow; + break; + case BGM_GETCOL: + ReturnValue = BGHS[SelfIndex].cursorcol; + break; + + case BGM_GETTYPE: + LPBGcell=(_BGCELL*)wParam; + if(OutOfRange(LPBGcell)) + { + wParam=MAKEWPARAM((UINT)GetMenu(hWnd),BGN_OUTOFRANGE); + lParam = 0; + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + ReturnValue = -1; + break; + } + wsprintf(buffer, TEXT("%05d-%03d"),LPBGcell->row,LPBGcell->col); + //see if that cell is already loaded + FindResult = BinarySearchListBox(BGHS[SelfIndex].hlist1,buffer); + if(FindResult != LB_ERR) + { + //it was found, get it + SendMessage(BGHS[SelfIndex].hlist1,LB_GETTEXT,FindResult,(LPARAM)buffer); + switch (buffer[11]) + { + case 'A':ReturnValue=1;break; + case 'N':ReturnValue=2;break; + case 'T':ReturnValue=3;break; + case 'F':ReturnValue=4;break; + case 'G':ReturnValue=5;break; + default: ReturnValue =1;break; + } + } + break; + case BGM_GETPROTECTION: + LPBGcell=(_BGCELL*)wParam; + if(OutOfRange(LPBGcell)) + { + wParam=MAKEWPARAM((UINT)GetMenu(hWnd),BGN_OUTOFRANGE); + lParam = 0; + SendMessage(GetParent(hWnd),WM_COMMAND,wParam,lParam); + ReturnValue = -1; + break; + } + wsprintf(buffer, TEXT("%05d-%03d"),LPBGcell->row,LPBGcell->col); + //see if that cell is already loaded + ReturnValue = 0; + FindResult = BinarySearchListBox(BGHS[SelfIndex].hlist1,buffer); + if(FindResult != LB_ERR) + { + //it was found, get it + SendMessage(BGHS[SelfIndex].hlist1,LB_GETTEXT,FindResult,(LPARAM)buffer); + switch (buffer[10]) + { + case 'U':ReturnValue=0;break; + case 'P':ReturnValue=1;break; + default: ReturnValue =0;break; + } + } + + break; + case BGM_SETROWHEIGHT: + if(wParam <1){wParam=1;} + BGHS[SelfIndex].rowheight = wParam; + SetHomeRow(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + SetHomeCol(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + SizeGrid(hWnd,SelfIndex); + + { + RECT rect; + GetClientRect(hWnd,&rect); + InvalidateRect(hWnd,&rect,FALSE); + } + break; + + case BGM_SETTITLEHEIGHT: + if(wParam<0){wParam =0;} + BGHS[SelfIndex].titleheight = wParam; + SetHomeRow(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + SetHomeCol(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + { + RECT rect; + GetClientRect(hWnd,&rect); + InvalidateRect(hWnd,&rect,FALSE); + } + break; + case BGM_SETGRIDLINECOLOR: + DrawCursor(hWnd,SelfIndex); + BGHS[SelfIndex].gridlinecolor = (COLORREF)wParam; + DrawCursor(hWnd,SelfIndex); + RefreshGrid(hWnd); + break; + + case BGM_SETCURSORCOLOR: + DrawCursor(hWnd,SelfIndex); + BGHS[SelfIndex].cursorcolor = (COLORREF)wParam; + DrawCursor(hWnd,SelfIndex); + RefreshGrid(hWnd); + break; + + case BGM_SETHILIGHTTEXTCOLOR: + BGHS[SelfIndex].highlighttextcolor = (COLORREF)wParam; + { + RECT rect; + GetClientRect(hWnd,&rect); + InvalidateRect(hWnd,&rect,FALSE); + } + break; + + case BGM_SETHILIGHTCOLOR: + BGHS[SelfIndex].highlightcolor = (COLORREF)wParam; + { + RECT rect; + GetClientRect(hWnd,&rect); + InvalidateRect(hWnd,&rect,FALSE); + } + break; + + + case BGM_SETPROTECTCOLOR: + BGHS[SelfIndex].protectcolor = (COLORREF)wParam; + { + RECT rect; + GetClientRect(hWnd,&rect); + InvalidateRect(hWnd,&rect,FALSE); + } + break; + case BGM_SETUNPROTECTCOLOR: + BGHS[SelfIndex].unprotectcolor = (COLORREF)wParam; + { + RECT rect; + GetClientRect(hWnd,&rect); + InvalidateRect(hWnd,&rect,FALSE); + } + break; + + case BGM_SETELLIPSIS: + BGHS[SelfIndex].ELLIPSIS = (BOOL)wParam; + { + RECT rect; + GetClientRect(hWnd,&rect); + InvalidateRect(hWnd,&rect,FALSE); + } + + break; + + + case BGM_SETTITLEFONT: + BGHS[SelfIndex].htitlefont = (HFONT)wParam; + { + RECT rect; + GetClientRect(hWnd,&rect); + InvalidateRect(hWnd,&rect,FALSE); + } + + break; + + case BGM_SETHEADINGFONT: + BGHS[SelfIndex].hcolumnheadingfont = (HFONT)wParam; + { + RECT rect; + GetClientRect(hWnd,&rect); + InvalidateRect(hWnd,&rect,FALSE); + } + + break; + + + + + case BGM_SETROWSNUMBERED: + BGHS[SelfIndex].ROWSNUMBERED = (BOOL)wParam; + { + RECT rect; + GetClientRect(hWnd,&rect); + InvalidateRect(hWnd,&rect,FALSE); + } + + break; + + case BGM_SETCOLSNUMBERED: + BGHS[SelfIndex].COLUMNSNUMBERED = (BOOL)wParam; + { + RECT rect; + GetClientRect(hWnd,&rect); + InvalidateRect(hWnd,&rect,FALSE); + } + + break; + + case WM_ENABLE: + if(wParam == FALSE) + { + BGHS[SelfIndex].textcolor = RGB(120,120,120); + } + else + { + BGHS[SelfIndex].textcolor = RGB(0,0,0); + } + + case WM_MOUSEMOVE: + int x,y,r,c,t,z; + x=LOWORD(lParam); + y=HIWORD(lParam); + r=GetRowOfMouse(SelfIndex,y); + c=GetColOfMouse(SelfIndex,x); + t=GetColOfMouse(SelfIndex,x+10); + z=GetColOfMouse(SelfIndex,x-10); + + if(BGHS[SelfIndex].COLUMNSIZING) + { + int dx,nx,cr; + dx=x-BGHS[SelfIndex].columntoresizeinitx; + nx=BGHS[SelfIndex].columntoresizeinitsize + dx; + if(nx<=0){nx=0;} + cr=BGHS[SelfIndex].columntoresize; + SendMessage(hWnd,BGM_SETCOLWIDTH,cr,nx); + + } + if((r==0)&&(c>=-1)&&((t!=c)||(z!=c))&&(!BGHS[SelfIndex].COLUMNSIZING)) + { + if((BGHS[SelfIndex].cursortype != 2)&&(BGHS[SelfIndex].ALLOWCOLUMNRESIZING)) + { + BGHS[SelfIndex].cursortype = 2; + SetCursor(LoadCursor(NULL, IDC_SIZEWE)); + } + + } + else + { + if((BGHS[SelfIndex].cursortype != 1)&&(!BGHS[SelfIndex].COLUMNSIZING)) + { + BGHS[SelfIndex].cursortype = 1; + SetCursor(LoadCursor(NULL, IDC_ARROW)); + } + } + break; + + case WM_LBUTTONUP: + if(BGHS[SelfIndex].COLUMNSIZING) + { + BGHS[SelfIndex].COLUMNSIZING = FALSE; + SetCursor(LoadCursor(NULL, IDC_ARROW)); + BGHS[SelfIndex].cursortype = 1; + BGHS[SelfIndex].SHOWINTEGRALROWS=BGHS[SelfIndex].REMEMBERINTEGRALROWS; + SizeGrid(hWnd,SelfIndex); + } + break; + + case WM_RBUTTONUP : + case WM_LBUTTONDBLCLK : + case WM_LBUTTONDOWN: + { + int x,y,r,c; + //check for column sizing + if(BGHS[SelfIndex].cursortype == 2) + { + int c,x,t,z; + //start column sizing + if(!BGHS[SelfIndex].COLUMNSIZING) + { + BGHS[SelfIndex].REMEMBERINTEGRALROWS = BGHS[SelfIndex].SHOWINTEGRALROWS; + } + BGHS[SelfIndex].COLUMNSIZING = TRUE; + BGHS[SelfIndex].SHOWINTEGRALROWS = FALSE; + x=LOWORD(lParam); + BGHS[SelfIndex].columntoresizeinitx=x; + t=GetColOfMouse(SelfIndex,x+10); + z=GetColOfMouse(SelfIndex,x-10); + c=GetColOfMouse(SelfIndex,x); + if(t!=c) + { + //resizing column c + BGHS[SelfIndex].columntoresize = c; + } + if(z!=c) + { + //resizing hidden column to the left of cursor + if(c==-1) + { + c=SendMessage(hWnd,BGM_GETCOLS,0,0); + } + else + { + c-=1; + } + BGHS[SelfIndex].columntoresize = c; + } + + BGHS[SelfIndex].columntoresizeinitsize = BGHS[SelfIndex].columnwidths[c]; + } + + if(BGHS[SelfIndex].EDITING) + { + CloseEdit(hWnd,SelfIndex); + } + else + { + + SetFocus(hWnd); + } + BOOL NRC,NCC; + NRC=FALSE; + NCC=FALSE; + + if(GetFocus()==hWnd) + { + + x=LOWORD(lParam); + y=HIWORD(lParam); + r=GetRowOfMouse(SelfIndex,y); + c=GetColOfMouse(SelfIndex,x); + DrawCursor(hWnd,SelfIndex); + if((r>0)&&(c>0)) + { + if(r != BGHS[SelfIndex].cursorrow) + { + BGHS[SelfIndex].cursorrow = r; + NRC=TRUE; + } + else + { + BGHS[SelfIndex].cursorrow = r; + } + if(c != BGHS[SelfIndex].cursorcol) + { + BGHS[SelfIndex].cursorcol = c; + NCC=TRUE; + } + else + { + 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); + SetHomeCol(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + RefreshGrid(hWnd); + + if (message == WM_LBUTTONDOWN) + NotifyCellClicked(hWnd,SelfIndex); + else if (message == WM_LBUTTONDBLCLK) + NotifyCellDbClicked(hWnd,SelfIndex); + else // (message == WM_RBUTTONUP) + NotifyCellRClicked(hWnd,SelfIndex); + } + else + { + SetFocus(hWnd); + } + } + break; + + case WM_ERASEBKGND: + return TRUE; + break; + + case WM_GETDLGCODE: + + ReturnValue = DLGC_WANTARROWS|DLGC_WANTCHARS|DLGC_DEFPUSHBUTTON; + if(wParam == 13) + { + //same as arrow down + if(BGHS[SelfIndex].EDITING) + { + CloseEdit(hWnd,SelfIndex); + } + DrawCursor(hWnd,SelfIndex); + BGHS[SelfIndex].cursorrow ++; + if(BGHS[SelfIndex].cursorrow > BGHS[SelfIndex].rows) + { + BGHS[SelfIndex].cursorrow = BGHS[SelfIndex].rows; + } + else + { + NotifyRowChanged(hWnd,SelfIndex); + } + DrawCursor(hWnd,SelfIndex); + SetCurrentCellStatus(hWnd,SelfIndex); + SetHomeRow(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + RefreshGrid(hWnd); + BGHS[SelfIndex].EDITING = FALSE; + break; + } + + if(wParam == VK_ESCAPE) + { + if(BGHS[SelfIndex].EDITING) + { + BGHS[SelfIndex].EDITING = FALSE; + lstrcpy(BGHS[SelfIndex].editstring, TEXT("")); + HideCaret(hWnd); + RefreshGrid(hWnd); + NotifyEditEnd(hWnd,SelfIndex); + } + else + { + ReturnValue = 0; + } + break; + } + break; + case WM_KEYDOWN: + + if(wParam == VK_ESCAPE) + { + if(BGHS[SelfIndex].EDITING) + { + BGHS[SelfIndex].EDITING = FALSE; + lstrcpy(BGHS[SelfIndex].editstring, TEXT("")); + HideCaret(hWnd); + RefreshGrid(hWnd); + NotifyEditEnd(hWnd,SelfIndex); + } + break; + } +/* + if(wParam == VK_F1) + { + NotifyF1(hWnd,SelfIndex); + break; + } + + if(wParam == VK_F2) + { + NotifyF2(hWnd,SelfIndex); + break; + } + if(wParam == VK_F3) + { + NotifyF3(hWnd,SelfIndex); + break; + } + if(wParam == VK_F4) + { + NotifyF4(hWnd,SelfIndex); + break; + } + if(wParam == VK_F5) + { + NotifyF5(hWnd,SelfIndex); + break; + } + if(wParam == VK_F6) + { + NotifyF6(hWnd,SelfIndex); + break; + } + if(wParam == VK_F7) + { + NotifyF7(hWnd,SelfIndex); + break; + } + if(wParam == VK_F8) + { + NotifyF8(hWnd,SelfIndex); + break; + } + if(wParam == VK_F9) + { + NotifyF9(hWnd,SelfIndex); + break; + } + if(wParam == VK_F10) + { + NotifyF10(hWnd,SelfIndex); + break; + } + if(wParam == VK_F11) + { + NotifyF11(hWnd,SelfIndex); + break; + } + if(wParam == VK_F12) + { + NotifyF12(hWnd,SelfIndex); + break; + } +*/ + if(wParam == VK_DELETE) + { + NotifyDelete(hWnd,SelfIndex); + break; + } + if(wParam == VK_TAB) + { + SetFocus(GetParent(hWnd)); + break; + } + if(wParam == VK_NEXT) + { + RECT gridrect; + int rpp; + if(BGHS[SelfIndex].EDITING) + { + CloseEdit(hWnd,SelfIndex); + } + + if(BGHS[SelfIndex].rows == 0){break;} + if(BGHS[SelfIndex].cursorrow == BGHS[SelfIndex].rows){break;} + //get rows per page + GetClientRect(hWnd,&gridrect); + 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; + } + NotifyRowChanged(hWnd,SelfIndex); + DrawCursor(hWnd,SelfIndex); + SetCurrentCellStatus(hWnd,SelfIndex); + SetHomeRow(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + SetHomeCol(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + RefreshGrid(hWnd); + break; + + } + if(wParam == VK_PRIOR) + { + RECT gridrect; + int rpp; + if(BGHS[SelfIndex].EDITING) + { + CloseEdit(hWnd,SelfIndex); + } + + if(BGHS[SelfIndex].rows == 0){break;} + if(BGHS[SelfIndex].cursorrow == 1){break;} + //get rows per page + GetClientRect(hWnd,&gridrect); + rpp = (gridrect.bottom - (BGHS[SelfIndex].headerrowheight+BGHS[SelfIndex].titleheight))/BGHS[SelfIndex].rowheight; + DrawCursor(hWnd,SelfIndex); + BGHS[SelfIndex].cursorrow -= rpp; + if(BGHS[SelfIndex].cursorrow < 1) + { + BGHS[SelfIndex].cursorrow = 1; + } + NotifyRowChanged(hWnd,SelfIndex); + DrawCursor(hWnd,SelfIndex); + SetCurrentCellStatus(hWnd,SelfIndex); + SetHomeRow(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + SetHomeCol(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + RefreshGrid(hWnd); + break; + } + if(wParam == VK_DOWN) + { + if(BGHS[SelfIndex].EDITING) + { + CloseEdit(hWnd,SelfIndex); + } + + if(BGHS[SelfIndex].rows == 0){break;} + if(BGHS[SelfIndex].cursorrow == BGHS[SelfIndex].rows){break;} + DrawCursor(hWnd,SelfIndex); + BGHS[SelfIndex].cursorrow ++; + if(BGHS[SelfIndex].cursorrow > BGHS[SelfIndex].rows) + { + BGHS[SelfIndex].cursorrow = BGHS[SelfIndex].rows; + } + else + { + NotifyRowChanged(hWnd,SelfIndex); + } + DrawCursor(hWnd,SelfIndex); + SetCurrentCellStatus(hWnd,SelfIndex); + SetHomeRow(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + SetHomeCol(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + RefreshGrid(hWnd); + break; + } + if(wParam == VK_UP) + { + if(BGHS[SelfIndex].EDITING) + { + CloseEdit(hWnd,SelfIndex); + } + + if(BGHS[SelfIndex].rows == 0){break;} + if(BGHS[SelfIndex].cursorrow == 1){break;} + + DrawCursor(hWnd,SelfIndex); + BGHS[SelfIndex].cursorrow --; + if(BGHS[SelfIndex].cursorrow < 1) + { + BGHS[SelfIndex].cursorrow = 1; + } + else + { + NotifyRowChanged(hWnd,SelfIndex); + } + DrawCursor(hWnd,SelfIndex); + SetCurrentCellStatus(hWnd,SelfIndex); + SetHomeRow(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + SetHomeCol(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + RefreshGrid(hWnd); + break; + } + + if(wParam == VK_LEFT) + { + int k; + if(BGHS[SelfIndex].EDITING) + { + CloseEdit(hWnd,SelfIndex); + } + + if(!GetNextColWithWidth(SelfIndex,BGHS[SelfIndex].cursorcol,-1)) + { + break; + } + DrawCursor(hWnd,SelfIndex); + k=GetNextColWithWidth(SelfIndex,BGHS[SelfIndex].cursorcol,-1); + if(k) + { + BGHS[SelfIndex].cursorcol = k; + NotifyColChanged(hWnd,SelfIndex); + } + DrawCursor(hWnd,SelfIndex); + SetCurrentCellStatus(hWnd,SelfIndex); + SetHomeRow(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + SetHomeCol(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + break; + } + + if(wParam == VK_RIGHT) + { + int k; + if(BGHS[SelfIndex].EDITING) + { + CloseEdit(hWnd,SelfIndex); + } + DrawCursor(hWnd,SelfIndex); + k=GetNextColWithWidth(SelfIndex,BGHS[SelfIndex].cursorcol,1); + if(k) + { + BGHS[SelfIndex].cursorcol = k; + NotifyColChanged(hWnd,SelfIndex); + } + DrawCursor(hWnd,SelfIndex); + SetCurrentCellStatus(hWnd,SelfIndex); + SetHomeRow(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + SetHomeCol(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + RefreshGrid(hWnd); + break; + } + + SetCurrentCellStatus(hWnd,SelfIndex); + + + + if((BGHS[SelfIndex].CURRENTCELLPROTECTED)&&(wParam == 13)) + + { + DrawCursor(hWnd,SelfIndex); + BGHS[SelfIndex].cursorrow ++; + if(BGHS[SelfIndex].cursorrow > BGHS[SelfIndex].rows) + { + BGHS[SelfIndex].cursorrow = BGHS[SelfIndex].rows; + } + else + { + NotifyRowChanged(hWnd,SelfIndex); + } + DrawCursor(hWnd,SelfIndex); + SetCurrentCellStatus(hWnd,SelfIndex); + SetHomeRow(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + RefreshGrid(hWnd); + break; + } + + if(BGHS[SelfIndex].CURRENTCELLPROTECTED){break;} + + if(!BGHS[SelfIndex].EDITABLE) + { + int ascii; + ascii=GetASCII(wParam,lParam); + if(ascii == 13) //enter pressed, treat as arrow down + { + //same as arrow down + DrawCursor(hWnd,SelfIndex); + BGHS[SelfIndex].cursorrow ++; + if(BGHS[SelfIndex].cursorrow > BGHS[SelfIndex].rows) + { + BGHS[SelfIndex].cursorrow = BGHS[SelfIndex].rows; + } + else + { + NotifyRowChanged(hWnd,SelfIndex); + } + DrawCursor(hWnd,SelfIndex); + SetCurrentCellStatus(hWnd,SelfIndex); + SetHomeRow(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + RefreshGrid(hWnd); + break; + + } + + } + + //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); + + { + int ascii; + ascii=GetASCII(wParam,lParam); + wParam = ascii; + if((wParam >= 32)&&(wParam <= 125)) + { + TCHAR tstring[2]; + if(!BGHS[SelfIndex].EDITING) + { + NotifyEditBegin(hWnd,SelfIndex); + } + BGHS[SelfIndex].EDITING = TRUE; + tstring[0]=wParam; + tstring[1]=0x00; + DisplayEditString(hWnd,SelfIndex,tstring); + break; + } + if(wParam == 8) //backspace + { + if(!BGHS[SelfIndex].EDITING) + { + NotifyEditBegin(hWnd,SelfIndex); + } + + BGHS[SelfIndex].EDITING = TRUE; + if(lstrlen(BGHS[SelfIndex].editstring)==0) + { + DisplayEditString(hWnd,SelfIndex, TEXT("")); + break; + } + else + { + int j; + j=lstrlen(BGHS[SelfIndex].editstring); + BGHS[SelfIndex].editstring[j-1]=0x00; + DisplayEditString(hWnd,SelfIndex, TEXT("")); + } + break; + } + if(wParam == 13) + { + //same as arrow down + if(BGHS[SelfIndex].EDITING) + { + CloseEdit(hWnd,SelfIndex); + } + DrawCursor(hWnd,SelfIndex); + BGHS[SelfIndex].cursorrow ++; + if(BGHS[SelfIndex].cursorrow > BGHS[SelfIndex].rows) + { + BGHS[SelfIndex].cursorrow = BGHS[SelfIndex].rows; + } + else + { + NotifyRowChanged(hWnd,SelfIndex); + } + DrawCursor(hWnd,SelfIndex); + SetCurrentCellStatus(hWnd,SelfIndex); + SetHomeRow(hWnd,SelfIndex,BGHS[SelfIndex].cursorrow,BGHS[SelfIndex].cursorcol); + RefreshGrid(hWnd); + BGHS[SelfIndex].EDITING = FALSE; + break; + } + } + } + break; + case WM_HSCROLL: + SetFocus(hWnd); + if((LOWORD(wParam==SB_LINERIGHT))||(LOWORD(wParam)==SB_PAGERIGHT)) + { + int cp,np; + cp=GetScrollPos(hWnd,SB_HORZ); + SetScrollPos(hWnd,SB_HORZ,cp+1,TRUE); + cp=GetScrollPos(hWnd,SB_HORZ); + np=GetNthVisibleColumn(hWnd,SelfIndex,cp); + BGHS[SelfIndex].homecol = np; + SetScrollPos(hWnd,SB_HORZ,cp,TRUE); + RefreshGrid(hWnd); + } + if((LOWORD(wParam==SB_LINELEFT))||(LOWORD(wParam)==SB_PAGELEFT)) + { + int cp,np; + cp=GetScrollPos(hWnd,SB_HORZ); + SetScrollPos(hWnd,SB_HORZ,cp-1,TRUE); + cp=GetScrollPos(hWnd,SB_HORZ); + np=GetNthVisibleColumn(hWnd,SelfIndex,cp); + BGHS[SelfIndex].homecol = np; + SetScrollPos(hWnd,SB_HORZ,cp,TRUE); + RefreshGrid(hWnd); + } + if(LOWORD(wParam)==SB_THUMBTRACK) + { + int cp,np; + cp=HIWORD(wParam); + np=GetNthVisibleColumn(hWnd,SelfIndex,cp); + SetScrollPos(hWnd,SB_HORZ,np,TRUE); + BGHS[SelfIndex].homecol = np; + SetScrollPos(hWnd,SB_HORZ,cp,TRUE); + RefreshGrid(hWnd); + } + + + break; + + case WM_MOUSEWHEEL : + { + short zDelta = (short) HIWORD(wParam); + ::SendMessage(hWnd, WM_VSCROLL, zDelta < 0?SB_LINEDOWN:SB_LINEUP, 0); + return TRUE; + } + + case WM_VSCROLL: + SetFocus(hWnd); + if(LOWORD(wParam)==SB_THUMBTRACK) + { + RECT gridrect; + int min,max; + BGHS[SelfIndex].homerow = HIWORD(wParam); + SetScrollPos(hWnd,SB_VERT,HIWORD(wParam),TRUE); + GetClientRect(hWnd,&gridrect); + GetScrollRange(hWnd,SB_VERT,&min,&max); + if(HIWORD(wParam)==max) + { + gridrect.top = gridrect.bottom - (BGHS[SelfIndex].rowheight); + InvalidateRect(hWnd,&gridrect,TRUE); + } + else + { + InvalidateRect(hWnd,&gridrect,FALSE); + } + } + + if(LOWORD(wParam)==SB_PAGEDOWN) + { + RECT gridrect; + int min,max,sp,rpp; + //get rows per page + GetClientRect(hWnd,&gridrect); + rpp = (gridrect.bottom - (BGHS[SelfIndex].headerrowheight+BGHS[SelfIndex].titleheight))/BGHS[SelfIndex].rowheight; + GetScrollRange(hWnd,SB_VERT,&min,&max); + sp=GetScrollPos(hWnd,SB_VERT); + sp += rpp; + if(sp > max){sp=max;} + BGHS[SelfIndex].homerow = sp; + SetScrollPos(hWnd,SB_VERT,sp,TRUE); + SetHomeRow(hWnd,SelfIndex,sp,BGHS[SelfIndex].homecol); + if(sp==max) + { + gridrect.top = gridrect.bottom - (BGHS[SelfIndex].rowheight); + InvalidateRect(hWnd,&gridrect,TRUE); + } + else + { + InvalidateRect(hWnd,&gridrect,FALSE); + } + + } + if(LOWORD(wParam)==SB_LINEDOWN) + { + RECT gridrect; + int min,max,sp; + //get rows per page + GetClientRect(hWnd,&gridrect); + GetScrollRange(hWnd,SB_VERT,&min,&max); + sp=GetScrollPos(hWnd,SB_VERT); + sp += 1; + if(sp > max){sp=max;} + BGHS[SelfIndex].homerow = sp; + SetScrollPos(hWnd,SB_VERT,sp,TRUE); + SetHomeRow(hWnd,SelfIndex,sp,BGHS[SelfIndex].homecol); + if(sp==max) + { + gridrect.top = gridrect.bottom - (BGHS[SelfIndex].rowheight); + InvalidateRect(hWnd,&gridrect,TRUE); + } + else + { + InvalidateRect(hWnd,&gridrect,FALSE); + } + + } + + + + if(LOWORD(wParam)==SB_PAGEUP) + { + RECT gridrect; + int min,max,sp,rpp; + //get rows per page + GetClientRect(hWnd,&gridrect); + rpp = (gridrect.bottom - (BGHS[SelfIndex].headerrowheight+BGHS[SelfIndex].titleheight))/BGHS[SelfIndex].rowheight; + GetScrollRange(hWnd,SB_VERT,&min,&max); + sp=GetScrollPos(hWnd,SB_VERT); + sp -= rpp; + if(sp < 1){sp=1;} + BGHS[SelfIndex].homerow = sp; + SetScrollPos(hWnd,SB_VERT,sp,TRUE); + SetHomeRow(hWnd,SelfIndex,sp,BGHS[SelfIndex].homecol); + if(sp==max) + { + gridrect.top = gridrect.bottom - (BGHS[SelfIndex].rowheight); + InvalidateRect(hWnd,&gridrect,TRUE); + } + else + { + InvalidateRect(hWnd,&gridrect,FALSE); + } + + } + if(LOWORD(wParam)==SB_LINEUP) + { + RECT gridrect; + int min,max,sp; + //get rows per page + GetClientRect(hWnd,&gridrect); + sp=GetScrollPos(hWnd,SB_VERT); + GetScrollRange(hWnd,SB_VERT,&min,&max); + sp -= 1; + if(sp < 1){sp=1;} + BGHS[SelfIndex].homerow = sp; + SetScrollPos(hWnd,SB_VERT,sp,TRUE); + SetHomeRow(hWnd,SelfIndex,sp,BGHS[SelfIndex].homecol); + if(sp==max) + { + gridrect.top = gridrect.bottom - (BGHS[SelfIndex].rowheight); + InvalidateRect(hWnd,&gridrect,TRUE); + } + else + { + InvalidateRect(hWnd,&gridrect,FALSE); + } + + } + RefreshGrid(hWnd); + + break; + case WM_DESTROY: + { int k; + if(CountGrids()==0) + { + DeleteObject(hfontbody); + DeleteObject(hfontheader); + DeleteObject(hfonttitle); + } + SendMessage(BGHS[SelfIndex].hlist1,LB_RESETCONTENT,0,0); + DestroyWindow(BGHS[SelfIndex].hlist1); + BGHS[SelfIndex].gridmenu = 0; + BGHS[SelfIndex].hlist1 = NULL; + BGHS[SelfIndex].hfont = NULL; + lstrcpy(BGHS[SelfIndex].protect, TEXT("U")); + BGHS[SelfIndex].rows = 100; + BGHS[SelfIndex].cols = 255; + BGHS[SelfIndex].homerow = 1; + BGHS[SelfIndex].homecol = 1; + BGHS[SelfIndex].rowheight = 20; + BGHS[SelfIndex].headerrowheight = 20; + BGHS[SelfIndex].ROWSNUMBERED = TRUE; + BGHS[SelfIndex].COLUMNSNUMBERED = TRUE; + BGHS[SelfIndex].DRAWHIGHLIGHT = TRUE; + + BGHS[SelfIndex].cursorcol = 1; + BGHS[SelfIndex].cursorrow = 1; + BGHS[SelfIndex].columnwidths[0]=40; + BGHS[SelfIndex].ADVANCEROW = TRUE; + BGHS[SelfIndex].cursorcolor = RGB(255,255,255); + BGHS[SelfIndex].protectcolor = RGB(128,128,128); + BGHS[SelfIndex].unprotectcolor = RGB(255,255,255); + for(k=1;khInstance; + + + BG_GridIndex = AddGrid((UINT)GetMenu(hWnd)); + + if(CountGrids()==1) + { + hfontbody=CreateFont(16,0,0, 0, + 100, + FALSE, + FALSE,FALSE,DEFAULT_CHARSET, + OUT_DEFAULT_PRECIS, + CLIP_DEFAULT_PRECIS, + 0, + 0 , + TEXT("MS Shell Dlg")); + hfontheader=CreateFont(18,0,0, 0,FW_HEAVY,FALSE,FALSE,FALSE,DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, 0, 0, TEXT("MS Shell Dlg")); + hfonttitle=CreateFont(20,0,0, 0,FW_HEAVY,FALSE,FALSE,FALSE,DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, 0, 0, TEXT("MS Shell Dlg")); + } + + + if((BG_GridIndex >= 0)&&(BG_GridIndex < MAX_GRIDS))//if you aren't over the MAX_GRIDS limit, add a grid + { + + BGHS[BG_GridIndex].gridmenu = (UINT)GetMenu(hWnd); + + BGHS[BG_GridIndex].hlist1=CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("LISTBOX"), TEXT(""), + WS_CHILD|LBS_STANDARD,50,150,200,100,hWnd,NULL,hInst,NULL); + + BGHS[BG_GridIndex].hfont = hfontbody; + BGHS[BG_GridIndex].htitlefont = hfonttitle; + BGHS[BG_GridIndex].hcolumnheadingfont = hfontheader; + lstrcpy(BGHS[BG_GridIndex].title,lpcs->lpszName); + SendMessage(hWnd,WM_SETTEXT,0,(LPARAM)lpcs->lpszName); + + + } + if(BG_GridIndex == -1) + { + DestroyWindow(hWnd); + } + break; + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + return ReturnValue; +} + +int CountGrids() + { + int j,count; + count=0; + for(j=0;j= 0)) + { + BGHS[empty_space].gridmenu = menuid; + returnvalue=empty_space; + } + if(MATCH) + { + return returnvalue+MAX_GRIDS; + } + if((!MATCH)&&(empty_space == -1)) + { + return -1; + } + return returnvalue; + + } + +int FindGrid( UINT menuid) + { + //if grid doesn't exist, return -1, else return gridindex + int returnvalue; + int j; + returnvalue = -1; + for(j=0;j0) + { + //it was greater than the tail... not found + ReturnValue = LB_ERR; + return ReturnValue; + } + + //is it the finger? + ReturnValue = LB_ERR; + FOUND=FALSE; + + + while((!FOUND)&&((tail-head)>1)) + { + finger = head + ((tail - head) / 2); + + SendMessage(lbhWnd,LB_GETTEXT,finger,(LPARAM)tbuffer); + tbuffer[9] = 0x00; + p=lstrcmp(tbuffer,searchtext); + if(p==0) + { + FOUND=TRUE; + ReturnValue = finger; + } + + if(p<0) + { + //change tail to finger + head = finger; + } + if(p>0) + { + //change head to finger + tail = finger; + } + + + } + return ReturnValue; + } + diff --git a/PowerEditor/src/WinControls/Grid/BabyGrid.h b/PowerEditor/src/WinControls/Grid/BabyGrid.h new file mode 100644 index 00000000..3922a3b0 --- /dev/null +++ b/PowerEditor/src/WinControls/Grid/BabyGrid.h @@ -0,0 +1,109 @@ +//BABYGRID code is copyrighted (C) 20002 by David Hillard +// +//This code must retain this copyright message +// +//Printed BABYGRID message reference and tutorial available. +//email: mudcat@mis.net for more information. + + +#include +#include "resource.h" + +#ifndef WM_MOUSEWHEEL +#define WM_MOUSEWHEEL 0x020A +#endif //WM_MOUSEWHEEL + +#define BGN_LBUTTONDOWN 0x0001 +#define BGN_MOUSEMOVE 0x0002 +#define BGN_OUTOFRANGE 0x0003 +#define BGN_OWNERDRAW 0x0004 +#define BGN_SELCHANGE 0x0005 +#define BGN_ROWCHANGED 0x0006 +#define BGN_COLCHANGED 0x0007 +#define BGN_EDITBEGIN 0x0008 +#define BGN_DELETECELL 0x0009 +#define BGN_EDITEND 0x000A +#define BGN_F1 0x000B +#define BGN_F2 0x000C +#define BGN_F3 0x000D +#define BGN_F4 0x000E +#define BGN_F5 0x000F +#define BGN_F6 0x0010 +#define BGN_F7 0x0011 +#define BGN_F8 0x0012 +#define BGN_F9 0x0013 +#define BGN_F10 0x0014 +#define BGN_F11 0x0015 +#define BGN_F12 0x0016 +#define BGN_GOTFOCUS 0x0017 +#define BGN_LOSTFOCUS 0x0018 +#define BGN_CELLCLICKED 0x0019 +#define BGN_CELLDBCLICKED 0x001A +#define BGN_CELLRCLICKED 0x001B + + + +#define BGM_PROTECTCELL BABYGRID_USER + 1 +#define BGM_SETPROTECT BABYGRID_USER + 2 +#define BGM_SETCELLDATA BABYGRID_USER + 3 +#define BGM_GETCELLDATA BABYGRID_USER + 4 +#define BGM_CLEARGRID BABYGRID_USER + 5 +#define BGM_SETGRIDDIM BABYGRID_USER + 6 +#define BGM_DELETECELL BABYGRID_USER + 7 +#define BGM_SETCURSORPOS BABYGRID_USER + 8 +#define BGM_AUTOROW BABYGRID_USER + 9 +#define BGM_GETOWNERDRAWITEM BABYGRID_USER + 10 +#define BGM_SETCOLWIDTH BABYGRID_USER + 11 +#define BGM_SETHEADERROWHEIGHT BABYGRID_USER + 12 +#define BGM_GETTYPE BABYGRID_USER + 13 +#define BGM_GETPROTECTION BABYGRID_USER + 14 +#define BGM_DRAWCURSOR BABYGRID_USER + 15 +#define BGM_SETROWHEIGHT BABYGRID_USER + 16 +#define BGM_SETCURSORCOLOR BABYGRID_USER + 17 +#define BGM_SETPROTECTCOLOR BABYGRID_USER + 18 +#define BGM_SETUNPROTECTCOLOR BABYGRID_USER + 19 +#define BGM_SETROWSNUMBERED BABYGRID_USER + 20 +#define BGM_SETCOLSNUMBERED BABYGRID_USER + 21 +#define BGM_SHOWHILIGHT BABYGRID_USER + 22 +#define BGM_GETROWS BABYGRID_USER + 23 +#define BGM_GETCOLS BABYGRID_USER + 24 +#define BGM_NOTIFYROWCHANGED BABYGRID_USER + 25 +#define BGM_NOTIFYCOLCHANGED BABYGRID_USER + 26 +#define BGM_GETROW BABYGRID_USER + 27 +#define BGM_GETCOL BABYGRID_USER + 28 +#define BGM_PAINTGRID BABYGRID_USER + 29 +#define BGM_GETCOLWIDTH BABYGRID_USER + 30 +#define BGM_GETROWHEIGHT BABYGRID_USER + 31 +#define BGM_GETHEADERROWHEIGHT BABYGRID_USER + 32 +#define BGM_SETTITLEHEIGHT BABYGRID_USER + 33 + +#define BGM_SETHILIGHTCOLOR BABYGRID_USER + 34 +#define BGM_SETHILIGHTTEXTCOLOR BABYGRID_USER + 35 +#define BGM_SETEDITABLE BABYGRID_USER + 36 +#define BGM_SETGRIDLINECOLOR BABYGRID_USER + 37 +#define BGM_EXTENDLASTCOLUMN BABYGRID_USER + 38 +#define BGM_SHOWINTEGRALROWS BABYGRID_USER + 39 +#define BGM_SETELLIPSIS BABYGRID_USER + 40 +#define BGM_SETCOLAUTOWIDTH BABYGRID_USER + 41 +#define BGM_SETALLOWCOLRESIZE BABYGRID_USER + 42 +#define BGM_SETTITLEFONT BABYGRID_USER + 43 +#define BGM_SETHEADINGFONT BABYGRID_USER + 44 + + struct _BGCELL { + int row; + int col; + }; + + +//function forward declarations +ATOM RegisterGridClass(HINSTANCE); +LRESULT CALLBACK GridProc(HWND, UINT, WPARAM, LPARAM); +void SetCell(_BGCELL *cell,int row, int col); + + +//global variables + + + + + diff --git a/PowerEditor/src/WinControls/Grid/BabyGridWrapper.cpp b/PowerEditor/src/WinControls/Grid/BabyGridWrapper.cpp new file mode 100644 index 00000000..8c0b9f6b --- /dev/null +++ b/PowerEditor/src/WinControls/Grid/BabyGridWrapper.cpp @@ -0,0 +1,41 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO ( donho@altern.org ) + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#include "BabyGridWrapper.h" +const TCHAR *babyGridClassName = TEXT("BABYGRID"); + +bool BabyGridWrapper::_isRegistered = false; + +void BabyGridWrapper::init(HINSTANCE hInst, HWND parent, int id) +{ + Window::init(hInst, parent); + + if (!_isRegistered) + RegisterGridClass(_hInst); + + _hSelf = ::CreateWindowEx(WS_EX_CLIENTEDGE, + babyGridClassName,\ + TEXT(""),\ + WS_CHILD | WS_VISIBLE,\ + CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,\ + _hParent,\ + (HMENU)id,\ + _hInst,\ + (LPVOID)/*this*/NULL); +} diff --git a/PowerEditor/src/WinControls/Grid/BabyGridWrapper.h b/PowerEditor/src/WinControls/Grid/BabyGridWrapper.h new file mode 100644 index 00000000..33104541 --- /dev/null +++ b/PowerEditor/src/WinControls/Grid/BabyGridWrapper.h @@ -0,0 +1,91 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO ( donho@altern.org ) + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ +#ifndef BABYGRIDWRAPPER +#define BABYGRIDWRAPPER + +#include "babygrid.h" +#include "Window.h" + +class BabyGridWrapper : public Window +{ +public : + BabyGridWrapper() : Window(){}; + ~BabyGridWrapper(){}; + virtual void init(HINSTANCE hInst, HWND parent, int id); + virtual void destroy() { + ::DestroyWindow(_hSelf); + }; + void setLineColNumber(size_t nbRow, size_t nbCol) { + ::SendMessage(_hSelf, BGM_SETGRIDDIM, nbRow, nbCol); + }; + + void setCursorColour(COLORREF coulour) { + ::SendMessage(_hSelf, BGM_SETCURSORCOLOR, (UINT)coulour, 0); + }; + + void hideCursor() { + setCursorColour(RGB(0, 0, 0)); + }; + + void setColsNumbered(bool isNumbered = true) { + ::SendMessage(_hSelf, BGM_SETCOLSNUMBERED, isNumbered?TRUE:FALSE, 0); + } + + void setText(size_t row, size_t col, const TCHAR *text) { + _BGCELL cell; + cell.row = row; + cell.col = col; + ::SendMessage(_hSelf, BGM_SETCELLDATA, (UINT)&cell, (long)text); + }; + + void makeColAutoWidth(bool autoWidth = true) { + ::SendMessage(_hSelf, BGM_SETCOLAUTOWIDTH, autoWidth?TRUE:FALSE, 0); + }; + + int getSelectedRow() { + return ::SendMessage(_hSelf, BGM_GETROW, 0, 0); + }; + + void deleteCell(int row, int col) { + _BGCELL cell; + cell.row = row; + cell.col = col; + ::SendMessage(_hSelf, BGM_DELETECELL, (UINT)&cell, 0); + }; + + void setColWidth(unsigned int col, unsigned int width) { + ::SendMessage(_hSelf, BGM_SETCOLWIDTH, col, width); + }; + + void clear() { + ::SendMessage(_hSelf, BGM_CLEARGRID, 0, 0); + }; + +private : + static bool _isRegistered; +/* + static LRESULT CALLBACK staticWinProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { + return (((BabyGridWrapper *)(::GetWindowLongPtr(hwnd, GWL_USERDATA)))->runProc(Message, wParam, lParam)); + }; + LRESULT runProc(UINT Message, WPARAM wParam, LPARAM lParam); +*/ +}; + +#endif //BABYGRIDWRAPPER + diff --git a/PowerEditor/src/WinControls/Grid/ShortcutMapper.cpp b/PowerEditor/src/WinControls/Grid/ShortcutMapper.cpp new file mode 100644 index 00000000..3ccfca40 --- /dev/null +++ b/PowerEditor/src/WinControls/Grid/ShortcutMapper.cpp @@ -0,0 +1,400 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO ( donho@altern.org ) + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#include "ShortcutMapper.h" +#include "Notepad_plus.h" + +void ShortcutMapper::initTabs() { + HWND hTab = _hTabCtrl = ::GetDlgItem(_hSelf, IDC_BABYGRID_TABBAR); + TCITEM tie; + tie.mask = TCIF_TEXT; + tie.pszText = tabNames[0]; + ::SendMessage(hTab, TCM_INSERTITEM, 0, (LPARAM)(&tie) ); + tie.pszText = tabNames[1]; + ::SendMessage(hTab, TCM_INSERTITEM, 1, (LPARAM)(&tie) ); + tie.pszText = tabNames[2]; + ::SendMessage(hTab, TCM_INSERTITEM, 2, (LPARAM)(&tie) ); + tie.pszText = tabNames[3]; + ::SendMessage(hTab, TCM_INSERTITEM, 3, (LPARAM)(&tie) ); + tie.pszText = tabNames[4]; + ::SendMessage(hTab, TCM_INSERTITEM, 4, (LPARAM)(&tie) ); +} + +void ShortcutMapper::translateTab(int index, const TCHAR * newname) { + if (index < 0 || index > 4) + return; + generic_strncpy(tabNames[index], newname, maxTabName); +} + +void ShortcutMapper::initBabyGrid() { + RECT rect; + getClientRect(rect); + + _babygrid.init(_hInst, _hSelf, IDD_BABYGRID_ID1); + //_babygrid.reSizeTo(rect); + _babygrid.reSizeToWH(rect); + _babygrid.hideCursor(); + _babygrid.makeColAutoWidth(); + _babygrid.setColsNumbered(false); + _babygrid.setColWidth(0, 30); + _babygrid.setColWidth(1, 250); +} + +void ShortcutMapper::fillOutBabyGrid() +{ + NppParameters *nppParam = NppParameters::getInstance(); + _babygrid.clear(); + + size_t nrItems = 0; + + switch(_currentState) { + case STATE_MENU: { + nrItems = nppParam->getUserShortcuts().size(); + _babygrid.setLineColNumber(nrItems, 2); + break; } + case STATE_MACRO: { + nrItems = nppParam->getMacroList().size(); + _babygrid.setLineColNumber(nrItems, 2); + break; } + case STATE_USER: { + nrItems = nppParam->getUserCommandList().size(); + _babygrid.setLineColNumber(nrItems, 2); + break; } + case STATE_PLUGIN: { + nrItems = nppParam->getPluginCommandList().size(); + _babygrid.setLineColNumber(nrItems, 2); + break; } + case STATE_SCINTILLA: { + nrItems = nppParam->getScintillaKeyList().size(); + _babygrid.setLineColNumber(nrItems, 2); + break; } + } + + _babygrid.setText(0, 1, TEXT("Name")); + _babygrid.setText(0, 2, TEXT("Shortcut")); + + switch(_currentState) { + case STATE_MENU: { + vector & cshortcuts = nppParam->getUserShortcuts(); + for(size_t i = 0; i < nrItems; i++) { + _babygrid.setText(i+1, 1, cshortcuts[i].getName()); + _babygrid.setText(i+1, 2, cshortcuts[i].toString().c_str()); + } + break; } + case STATE_MACRO: { + vector & cshortcuts = nppParam->getMacroList(); + for(size_t i = 0; i < nrItems; i++) { + _babygrid.setText(i+1, 1, cshortcuts[i].getName()); + _babygrid.setText(i+1, 2, cshortcuts[i].toString().c_str()); + } + break; } + case STATE_USER: { + vector & cshortcuts = nppParam->getUserCommandList(); + for(size_t i = 0; i < nrItems; i++) { + _babygrid.setText(i+1, 1, cshortcuts[i].getName()); + _babygrid.setText(i+1, 2, cshortcuts[i].toString().c_str()); + } + break; } + case STATE_PLUGIN: { + vector & cshortcuts = nppParam->getPluginCommandList(); + for(size_t i = 0; i < nrItems; i++) { + _babygrid.setText(i+1, 1, cshortcuts[i].getName()); + _babygrid.setText(i+1, 2, cshortcuts[i].toString().c_str()); + } + break; } + case STATE_SCINTILLA: { + vector & cshortcuts = nppParam->getScintillaKeyList(); + for(size_t i = 0; i < nrItems; i++) { + _babygrid.setText(i+1, 1, cshortcuts[i].getName()); + _babygrid.setText(i+1, 2, cshortcuts[i].toString().c_str()); + } + break; } + } +} + +BOOL CALLBACK ShortcutMapper::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG : + { + + initBabyGrid(); + initTabs(); + fillOutBabyGrid(); + _babygrid.display(); + goToCenter(); + return TRUE; + } + + case WM_NOTIFY: { + NMHDR nmh = *((NMHDR*)lParam); + if (nmh.hwndFrom == _hTabCtrl) { + if (nmh.code == TCN_SELCHANGE) { + int index = TabCtrl_GetCurSel(_hTabCtrl); + switch (index) { + case 0: + _currentState = STATE_MENU; + break; + case 1: + _currentState = STATE_MACRO; + break; + case 2: + _currentState = STATE_USER; + break; + case 3: + _currentState = STATE_PLUGIN; + break; + case 4: + _currentState = STATE_SCINTILLA; + break; + } + fillOutBabyGrid(); + } + } + break; } + + case WM_COMMAND : + { + switch (LOWORD(wParam)) + { + case IDCANCEL : + { + ::EndDialog(_hSelf, -1); + return TRUE; + } + case IDOK : + { + ::EndDialog(_hSelf, 0); + return TRUE; + } + + case IDM_BABYGRID_MODIFY : + { + NppParameters *nppParam = NppParameters::getInstance(); + int row = _babygrid.getSelectedRow(); + + 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 + 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(); + + } + 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 + 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(); + + } + 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 + 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(); + + } + 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 + nppParam->addPluginModifiedIndex(row-1); + shortcuts[row - 1] = pcsc; + _babygrid.setText(row, 2, pcsc.toString().c_str()); + + //Notify current Accelerator class to update everything + nppParam->getAccelerator()->updateShortcuts(); + unsigned long cmdID = pcsc.getID(); + ShortcutKey shortcut; + shortcut._isAlt = pcsc.getKeyCombo()._isAlt; + shortcut._isCtrl = pcsc.getKeyCombo()._isCtrl; + shortcut._isShift = pcsc.getKeyCombo()._isShift; + shortcut._key = pcsc.getKeyCombo()._key; + + ::SendMessage(_hParent, NPPM_INTERNAL_PLUGINSHORTCUTMOTIFIED, cmdID, (LPARAM)&shortcut); + } + break; } + case STATE_SCINTILLA: { + //Get ScintillaKeyMap corresponding to row + vector & shortcuts = nppParam->getScintillaKeyList(); + ScintillaKeyMap skm = shortcuts[row - 1], prevskm = shortcuts[row-1]; + skm.init(_hInst, _hSelf); + if (skm.doDialog() != -1 && prevskm != skm) + { + //shortcut was altered + nppParam->addScintillaModifiedIndex(row-1); + shortcuts[row-1] = skm; + _babygrid.setText(row, 2, skm.toString().c_str()); + + //Notify current Accelerator class to update key + nppParam->getScintillaAccelerator()->updateKeys(); + } + break; + } + } + return TRUE; + } + case IDM_BABYGRID_DELETE : + { + NppParameters *nppParam = NppParameters::getInstance(); + if (::MessageBox(_hSelf, TEXT("Are you sure you want to delete this shortcut?"), TEXT("Are you sure?"), MB_OKCANCEL) == IDOK) + { + const int row = _babygrid.getSelectedRow(); + int shortcutIndex = row-1; + DWORD cmdID;// = _pAccel->_pAccelArray[row-1].cmd; + + // Menu data + size_t posBase; + size_t nbElem; + HMENU hMenu; + + switch(_currentState) { + case STATE_MENU: + case STATE_PLUGIN: + case STATE_SCINTILLA: { + return FALSE; //this is bad + break; } + case STATE_MACRO: { + vector & theMacros = nppParam->getMacroList(); + vector::iterator it = theMacros.begin(); + cmdID = theMacros[shortcutIndex].getID(); + theMacros.erase(it + shortcutIndex); + fillOutBabyGrid(); + + // preparing to remove from menu + posBase = 6; + nbElem = theMacros.size(); + hMenu = ::GetSubMenu((HMENU)::SendMessage(_hParent, NPPM_INTERNAL_GETMENU, 0, 0), MENUINDEX_MACRO); + for (size_t i = shortcutIndex ; i < nbElem ; i++) //lower the IDs of the remaining items so there are no gaps + { + MacroShortcut ms = theMacros[i]; + ms.setID(ms.getID() - 1); //shift all IDs + theMacros[i] = ms; + } + //::SendMessage(_hParent, NPPM_INTERNAL_MACROLIST_MODIFIED, 0, 0); + break; } + case STATE_USER: { + vector & theUserCmds = nppParam->getUserCommandList(); + vector::iterator it = theUserCmds.begin(); + cmdID = theUserCmds[shortcutIndex].getID(); + theUserCmds.erase(it + shortcutIndex); + fillOutBabyGrid(); + + // preparing to remove from menu + posBase = 2; + nbElem = theUserCmds.size(); + hMenu = ::GetSubMenu((HMENU)::SendMessage(_hParent, NPPM_INTERNAL_GETMENU, 0, 0), MENUINDEX_RUN); + for (size_t i = shortcutIndex ; i < nbElem ; i++) //lower the IDs of the remaining items so there are no gaps + { + UserCommand uc = theUserCmds[i]; + uc.setID(uc.getID() - 1); //shift all IDs + theUserCmds[i] = uc; + } + + //::SendMessage(_hParent, NPPM_INTERNAL_USERCMDLIST_MODIFIED, 0, 0); + break; } + } + + // remove from menu + ::RemoveMenu(hMenu, cmdID, MF_BYCOMMAND); + cmdID++; + if (nbElem == 0) { + ::RemoveMenu(hMenu, posBase-1, MF_BYPOSITION); //remove separator + } else { + for (size_t i = shortcutIndex ; i < nbElem ; i++) //lower the IDs of the remaining menu items so there are no gaps + { + const int commandSize = 64; + TCHAR cmdName[commandSize]; + ::GetMenuString(hMenu, cmdID, cmdName, commandSize, MF_BYCOMMAND); + ::ModifyMenu(hMenu, cmdID, MF_BYCOMMAND, cmdID-1, cmdName); //update commandID + } + } + + nppParam->getAccelerator()->updateShortcuts(); + } + return TRUE; + } + case IDD_BABYGRID_ID1: { + if(HIWORD(wParam) == BGN_CELLDBCLICKED) //a cell was clicked in the properties grid + { + return ::SendMessage(_hSelf, WM_COMMAND, IDM_BABYGRID_MODIFY, LOWORD(lParam)); + } + else if(HIWORD(wParam) == BGN_CELLRCLICKED) //a cell was clicked in the properties grid + { + POINT p; + ::GetCursorPos(&p); + if (!_rightClickMenu.isCreated()) + { + vector itemUnitArray; + itemUnitArray.push_back(MenuItemUnit(IDM_BABYGRID_MODIFY, TEXT("Modify"))); + itemUnitArray.push_back(MenuItemUnit(IDM_BABYGRID_DELETE, TEXT("Delete"))); + _rightClickMenu.create(_hSelf, itemUnitArray); + } + switch(_currentState) { + case STATE_MACRO: + case STATE_USER: { + _rightClickMenu.enableItem(IDM_BABYGRID_DELETE, true); + break; } + case STATE_MENU: + case STATE_PLUGIN: + case STATE_SCINTILLA: { + _rightClickMenu.enableItem(IDM_BABYGRID_DELETE, false); + break; } + } + + _rightClickMenu.display(p); + return TRUE; + } + } + } + } + default: + return FALSE; + } + return FALSE; +} diff --git a/PowerEditor/src/WinControls/Grid/ShortcutMapper.h b/PowerEditor/src/WinControls/Grid/ShortcutMapper.h new file mode 100644 index 00000000..986272f9 --- /dev/null +++ b/PowerEditor/src/WinControls/Grid/ShortcutMapper.h @@ -0,0 +1,80 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO ( donho@altern.org ) + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#ifndef SHORTCUTMAPPER +#define SHORTCUTMAPPER + +#include "BabyGridWrapper.h" +#include "ShortcutMapper_rc.h" +#include "shortcut.h" +#include "ContextMenu.h" + +enum GridState {STATE_MENU, STATE_MACRO, STATE_USER, STATE_PLUGIN, STATE_SCINTILLA}; + +class ShortcutMapper : public StaticDialog { +public: + ShortcutMapper() : _currentState(STATE_MENU), StaticDialog() { + generic_strncpy(tabNames[0], TEXT("Main menu"), maxTabName); + generic_strncpy(tabNames[1], TEXT("Macros"), maxTabName); + generic_strncpy(tabNames[2], TEXT("Run commands"), maxTabName); + generic_strncpy(tabNames[3], TEXT("Plugin commands"), maxTabName); + generic_strncpy(tabNames[4], TEXT("Scintilla commands"), maxTabName); + }; + ~ShortcutMapper() {}; + //void init(HINSTANCE hInst, HWND parent) {}; + void destroy() {}; + void doDialog(bool isRTL = false) { + if (isRTL) + { + DLGTEMPLATE *pMyDlgTemplate = NULL; + HGLOBAL hMyDlgTemplate = makeRTLResource(IDD_SHORTCUTMAPPER_DLG, &pMyDlgTemplate); + ::DialogBoxIndirectParam(_hInst, pMyDlgTemplate, _hParent, (DLGPROC)dlgProc, (LPARAM)this); + ::GlobalFree(hMyDlgTemplate); + } + else + ::DialogBoxParam(_hInst, MAKEINTRESOURCE(IDD_SHORTCUTMAPPER_DLG), _hParent, (DLGPROC)dlgProc, (LPARAM)this); + }; + void getClientRect(RECT & rc) const { + Window::getClientRect(rc); + rc.top += 40; + rc.bottom -= 20; + rc.left += 5; + }; + + void translateTab(int index, const TCHAR * newname); + +protected : + BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + +private: + static const int maxTabName = 64; + BabyGridWrapper _babygrid; + ContextMenu _rightClickMenu; + + GridState _currentState; + HWND _hTabCtrl; + + TCHAR tabNames[5][maxTabName]; + + void initTabs(); + void initBabyGrid(); + void fillOutBabyGrid(); +}; + +#endif //SHORTCUTMAPPER diff --git a/PowerEditor/src/WinControls/Grid/ShortcutMapper.rc b/PowerEditor/src/WinControls/Grid/ShortcutMapper.rc new file mode 100644 index 00000000..96453772 --- /dev/null +++ b/PowerEditor/src/WinControls/Grid/ShortcutMapper.rc @@ -0,0 +1,38 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + + +#include +#include "ShortcutMapper_rc.h" + +#ifndef IDC_STATIC +#define IDC_STATIC -1 +#endif + +IDD_SHORTCUTMAPPER_DLG DIALOGEX 0, 0, 391, 344 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | + WS_SYSMENU +//EXSTYLE WS_EX_TOOLWINDOW +CAPTION "Shortcut mapper" +FONT 8, TEXT("MS Shell Dlg"), 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Close",IDOK,172,319,47,14 + CONTROL "",IDC_BABYGRID_TABBAR,"SysTabControl32",TCS_BUTTONS,6,6,372, + 12 +END diff --git a/PowerEditor/src/WinControls/Grid/ShortcutMapper_rc.h b/PowerEditor/src/WinControls/Grid/ShortcutMapper_rc.h new file mode 100644 index 00000000..405d095d --- /dev/null +++ b/PowerEditor/src/WinControls/Grid/ShortcutMapper_rc.h @@ -0,0 +1,24 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#define IDD_SHORTCUTMAPPER_DLG 2600 +#define IDD_BABYGRID_ID1 (IDD_SHORTCUTMAPPER_DLG + 1) +#define IDM_BABYGRID_MODIFY (IDD_SHORTCUTMAPPER_DLG + 2) +#define IDM_BABYGRID_DELETE (IDD_SHORTCUTMAPPER_DLG + 3) +#define IDC_BABYGRID_TABBAR (IDD_SHORTCUTMAPPER_DLG + 4) diff --git a/PowerEditor/src/WinControls/ImageListSet/ImageListSet.cpp b/PowerEditor/src/WinControls/ImageListSet/ImageListSet.cpp new file mode 100644 index 00000000..231461a3 --- /dev/null +++ b/PowerEditor/src/WinControls/ImageListSet/ImageListSet.cpp @@ -0,0 +1,62 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "ImageListSet.h" +//#include "resource.h" + +void ToolBarIcons::init(ToolBarButtonUnit *buttonUnitArray, int arraySize) +{ + for (int i = 0 ; i < arraySize ; i++) + _tbiis.push_back(buttonUnitArray[i]); + _nbCmd = arraySize; +} + +void ToolBarIcons::create(HINSTANCE hInst, int iconSize) +{ + _iconListVector.push_back(IconList()); + _iconListVector.push_back(IconList()); + _iconListVector.push_back(IconList()); + //_iconListVector.push_back(IconList()); + + _iconListVector[HLIST_DEFAULT].create(hInst, iconSize); + _iconListVector[HLIST_HOT].create(hInst, iconSize); + _iconListVector[HLIST_DISABLE].create(hInst, iconSize); + //_iconListVector[HLIST_UGLY].create(hInst, 16); + + reInit(iconSize); +} + +void ToolBarIcons::destroy() +{ + _iconListVector[HLIST_DEFAULT].destroy(); + _iconListVector[HLIST_HOT].destroy(); + _iconListVector[HLIST_DISABLE].destroy(); + //_iconListVector[HLIST_UGLY].destroy(); +} +/* +bool IconList::changeIcon(int index, const TCHAR *iconLocation) const +{ + HBITMAP hBmp = (HBITMAP)::LoadImage(_hInst, iconLocation, IMAGE_ICON, _iconSize, _iconSize, LR_LOADFROMFILE ); + if (!hBmp) + return false; + int i = ImageList_ReplaceIcon(_hImglst, index, (HICON)hBmp); + ::DeleteObject(hBmp); + return (i == index); +} +*/ + + diff --git a/PowerEditor/src/WinControls/ImageListSet/ImageListSet.h b/PowerEditor/src/WinControls/ImageListSet/ImageListSet.h new file mode 100644 index 00000000..ec87929c --- /dev/null +++ b/PowerEditor/src/WinControls/ImageListSet/ImageListSet.h @@ -0,0 +1,184 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef IMAGE_LIST_H +#define IMAGE_LIST_H + +#include +#include +#include + +const int nbMax = 45; +#define IDI_SEPARATOR_ICON -1 + +class IconList +{ +public : + IconList() : _hImglst(NULL) {}; + + void create(HINSTANCE hInst, int iconSize) { + InitCommonControls(); + _hInst = hInst; + _iconSize = iconSize; + _hImglst = ImageList_Create(iconSize, iconSize, ILC_COLOR32 | ILC_MASK, 0, nbMax); + if (!_hImglst) + throw int(25); + }; + + void create(int iconSize, HINSTANCE hInst, int *iconIDArray, int iconIDArraySize) { + create(hInst, iconSize); + _pIconIDArray = iconIDArray; + _iconIDArraySize = iconIDArraySize; + + for (int i = 0 ; i < iconIDArraySize ; i++) + addIcon(iconIDArray[i]); + }; + + void destroy() { + ImageList_Destroy(_hImglst); + }; + + HIMAGELIST getHandle() const {return _hImglst;}; + + void addIcon(int iconID) const { + HICON hIcon = ::LoadIcon(_hInst, MAKEINTRESOURCE(iconID)); + if (!hIcon) + throw int(26); + ImageList_AddIcon(_hImglst, hIcon); + ::DestroyIcon(hIcon); + }; + + bool changeIcon(int index, const TCHAR *iconLocation) const{ + HBITMAP hBmp = (HBITMAP)::LoadImage(_hInst, iconLocation, IMAGE_ICON, _iconSize, _iconSize, LR_LOADFROMFILE | LR_LOADMAP3DCOLORS | LR_LOADTRANSPARENT); + if (!hBmp) + return false; + int i = ImageList_ReplaceIcon(_hImglst, index, (HICON)hBmp); + ImageList_AddMasked(_hImglst, (HBITMAP)hBmp, RGB(255,0,255)); + ::DeleteObject(hBmp); + return (i == index); + }; + + void setIconSize(int size) const { + ImageList_SetIconSize(_hImglst, size, size); + for (int i = 0 ; i < _iconIDArraySize ; i++) + addIcon(_pIconIDArray[i]); + }; +private : + HIMAGELIST _hImglst; + HINSTANCE _hInst; + int *_pIconIDArray; + int _iconIDArraySize; + int _iconSize; +}; + +typedef struct +{ + int _cmdID; + + int _defaultIcon; + int _hotIcon; + int _grayIcon; + + int _stdIcon; +}ToolBarButtonUnit; + +typedef std::vector ToolBarIconIDs; + +typedef std::vector IconListVector; + +class IconLists +{ +public : + IconLists() {}; + HIMAGELIST getImageListHandle(int index) const { + return _iconListVector[index].getHandle(); + }; + +protected : + IconListVector _iconListVector; +}; + +const int HLIST_DEFAULT = 0; +const int HLIST_HOT = 1; +const int HLIST_DISABLE = 2; + +class ToolBarIcons : public IconLists +{ +public : + ToolBarIcons() : _nbCmd(0) {}; + + void init(ToolBarButtonUnit *buttonUnitArray, int arraySize); + void create(HINSTANCE hInst, int iconSize); + void destroy(); + + HIMAGELIST getDefaultLst() const { + return IconLists::getImageListHandle(HLIST_DEFAULT); + }; + + HIMAGELIST getHotLst() const { + return IconLists::getImageListHandle(HLIST_HOT); + }; + + HIMAGELIST getDisableLst() const { + return IconLists::getImageListHandle(HLIST_DISABLE); + }; + + unsigned int getNbCommand() const {return _nbCmd;}; + int getCommandAt(int index) const {return _cmdArray[index];}; + void resizeIcon(int size) { + reInit(size); + }; + + void reInit(int size) { + ImageList_SetIconSize(getDefaultLst(), size, size); + ImageList_SetIconSize(getHotLst(), size, size); + ImageList_SetIconSize(getDisableLst(), size, size); + + for (int i = 0 ; i < int(_tbiis.size()) ; i++) + { + if (_tbiis[i]._defaultIcon != -1) + { + _iconListVector[HLIST_DEFAULT].addIcon(_tbiis[i]._defaultIcon); + _iconListVector[HLIST_HOT].addIcon(_tbiis[i]._hotIcon); + _iconListVector[HLIST_DISABLE].addIcon(_tbiis[i]._grayIcon); + } + } + + }; + + int getNbIcon() const { + return int(_tbiis.size()); + }; + + int getStdIconAt(int i) const { + return _tbiis[i]._stdIcon; + }; + + bool replaceIcon(int witchList, int iconIndex, const TCHAR *iconLocation) const { + if ((witchList != HLIST_DEFAULT) && (witchList != HLIST_HOT) && (witchList != HLIST_DISABLE)) + return false; + return _iconListVector[witchList].changeIcon(iconIndex, iconLocation); + + }; + +private : + ToolBarIconIDs _tbiis; + int _cmdArray[nbMax]; + unsigned int _nbCmd; +}; + +#endif //IMAGE_LIST_H diff --git a/PowerEditor/src/WinControls/OpenSaveFileDialog/FileDialog.cpp b/PowerEditor/src/WinControls/OpenSaveFileDialog/FileDialog.cpp new file mode 100644 index 00000000..33edc2a8 --- /dev/null +++ b/PowerEditor/src/WinControls/OpenSaveFileDialog/FileDialog.cpp @@ -0,0 +1,409 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. +#include +#include "FileDialog.h" + + +FileDialog *FileDialog::staticThis = NULL; +//int FileDialog::_dialogFileBoxId = (NppParameters::getInstance())->getWinVersion() < WV_W2K?edt1:cmb13; + +FileDialog::FileDialog(HWND hwnd, HINSTANCE hInst) + : _nbCharFileExt(0), _nbExt(0), _fileExt(NULL) +{ + staticThis = this; + //for (int i = 0 ; i < nbExtMax ; i++) + // _extArray[i][0] = '\0'; + + _fileName[0] = '\0'; + + _winVersion = (NppParameters::getInstance())->getWinVersion(); + + _ofn.lStructSize = sizeof(_ofn); + if (_winVersion < WV_W2K) + _ofn.lStructSize = sizeof(OPENFILENAME); + _ofn.hwndOwner = hwnd; + _ofn.hInstance = hInst; + _ofn.lpstrCustomFilter = (LPTSTR) NULL; + _ofn.nMaxCustFilter = 0L; + _ofn.nFilterIndex = 1L; + _ofn.lpstrFile = _fileName; + _ofn.nMaxFile = sizeof(_fileName)/sizeof(TCHAR); + _ofn.lpstrFileTitle = NULL; + _ofn.nMaxFileTitle = 0; + _ofn.lpstrInitialDir = NULL; + _ofn.lpstrTitle = NULL; + _ofn.nFileOffset = 0; + _ofn.nFileExtension = 0; + _ofn.lpfnHook = NULL; + _ofn.lpstrDefExt = NULL; // No default extension + _ofn.lCustData = 0; + _ofn.Flags = OFN_PATHMUSTEXIST | OFN_EXPLORER | OFN_LONGNAMES | DS_CENTER | OFN_HIDEREADONLY; + _ofn.pvReserved = NULL; + _ofn.dwReserved = 0; + _ofn.FlagsEx = 0; +} + +FileDialog::~FileDialog() +{ + if (_fileExt) + { + delete[] _fileExt; + _fileExt = NULL; + } +} + +// This function set and concatenate the filter into the list box of FileDialog. +// The 1st parameter is the description of the file type, the 2nd .. Nth parameter(s) is (are) +// the file extension which should be ".WHATEVER", otherwise it (they) will be considered as +// a file name to filter. Since the nb of arguments is variable, you have to add NULL at the end. +// example : +// FileDialog.setExtFilter(TEXT("c/c++ src file"), TEXT(".c"), TEXT(".cpp"), TEXT(".cxx"), TEXT(".h"), NULL); +// FileDialog.setExtFilter(TEXT("Makefile"), TEXT("makefile"), TEXT("GNUmakefile"), NULL); +void FileDialog::setExtFilter(const TCHAR *extText, const TCHAR *ext, ...) +{ + // fill out the ext array for save as file dialog + //if (_nbExt < nbExtMax) + // lstrcpy(_extArray[_nbExt++], ext); + // + std::generic_string exts; + + va_list pArg; + va_start(pArg, ext); + + const TCHAR *ext2Concat; + ext2Concat = ext; + do + { + if (ext2Concat[0] == TEXT('.')) + exts += TEXT("*"); + exts += ext2Concat; + exts += TEXT(";"); + } + while ( (ext2Concat = va_arg(pArg, const TCHAR *)) != NULL ); + + va_end(pArg); + + // remove the last ';' + exts = exts.substr(0, exts.length()-1); + + setExtsFilter(extText, exts.c_str()); +} + +int FileDialog::setExtsFilter(const TCHAR *extText, const TCHAR *exts) +{ + // fill out the ext array for save as file dialog + //if (_nbExt < nbExtMax) + // lstrcpy(_extArray[_nbExt++], exts); + // + std::generic_string extFilter = extText; + TCHAR *oldFilter = NULL; + + extFilter += TEXT(" ("); + extFilter += exts; + extFilter += TEXT(")"); + + // Resize filter buffer + int nbCharAdditional = extFilter.length() + lstrlen(exts) + 3; // 3 additional for nulls + if (_fileExt) + { + oldFilter = new TCHAR[_nbCharFileExt]; + memcpy(oldFilter, _fileExt, _nbCharFileExt * sizeof(TCHAR)); + + delete[] _fileExt; + _fileExt = NULL; + } + + int nbCharNewFileExt = _nbCharFileExt + nbCharAdditional; + _fileExt = new TCHAR[nbCharNewFileExt]; + memset(_fileExt, 0, nbCharNewFileExt * sizeof(TCHAR)); + + // Restore previous filters + if (oldFilter) + { + memcpy(_fileExt, oldFilter, _nbCharFileExt * sizeof(TCHAR)); + delete[] oldFilter; + oldFilter = NULL; + } + + // Append new filter + TCHAR *pFileExt = _fileExt + _nbCharFileExt; + lstrcpy(pFileExt, extFilter.c_str()); + _nbCharFileExt += extFilter.length() + 1; + + pFileExt = _fileExt + _nbCharFileExt; + lstrcpy(pFileExt, exts); + _nbCharFileExt += lstrlen(exts) + 1; + + // Set file dialog pointer + _ofn.lpstrFilter = _fileExt; + + return _nbExt; +} + +TCHAR * FileDialog::doOpenSingleFileDlg() +{ + TCHAR dir[MAX_PATH]; + ::GetCurrentDirectory(MAX_PATH, dir); + NppParameters * params = NppParameters::getInstance(); + _ofn.lpstrInitialDir = params->getWorkingDir(); + + _ofn.Flags |= OFN_FILEMUSTEXIST; + + TCHAR *fn = NULL; + try { + fn = ::GetOpenFileName((OPENFILENAME*)&_ofn)?_fileName:NULL; + + if (params->getNppGUI()._openSaveDir == dir_last) + { + ::GetCurrentDirectory(MAX_PATH, dir); + params->setWorkingDir(dir); + } + } + catch(...) { + ::MessageBox(NULL, TEXT("GetSaveFileName crashes!!!"), TEXT(""), MB_OK); + } + + ::SetCurrentDirectory(dir); + + return (fn); +} + +stringVector * FileDialog::doOpenMultiFilesDlg() +{ + TCHAR dir[MAX_PATH]; + ::GetCurrentDirectory(MAX_PATH, dir); + //_ofn.lpstrInitialDir = dir; + + NppParameters * params = NppParameters::getInstance(); + _ofn.lpstrInitialDir = params->getWorkingDir(); + + _ofn.Flags |= OFN_FILEMUSTEXIST | OFN_ALLOWMULTISELECT; + + BOOL res = ::GetOpenFileName((OPENFILENAME*)&_ofn); + if (params->getNppGUI()._openSaveDir == dir_last) + { + ::GetCurrentDirectory(MAX_PATH, dir); + params->setWorkingDir(dir); + } + ::SetCurrentDirectory(dir); + + if (res) + { + TCHAR fn[MAX_PATH]; + TCHAR *pFn = _fileName + lstrlen(_fileName) + 1; + if (!(*pFn)) + _fileNames.push_back(std::generic_string(_fileName)); + else + { + lstrcpy(fn, _fileName); + if (fn[lstrlen(fn)-1] != '\\') + lstrcat(fn, TEXT("\\")); + } + int term = int(lstrlen(fn)); + + while (*pFn) + { + fn[term] = '\0'; + lstrcat(fn, pFn); + _fileNames.push_back(std::generic_string(fn)); + pFn += lstrlen(pFn) + 1; + } + + return &_fileNames; + } + else + return NULL; +} + +TCHAR * FileDialog::doSaveDlg() +{ + TCHAR dir[MAX_PATH]; + ::GetCurrentDirectory(MAX_PATH, dir); + //_ofn.lpstrInitialDir = dir; + + NppParameters * params = NppParameters::getInstance(); + _ofn.lpstrInitialDir = params->getWorkingDir(); + + _ofn.Flags |= OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_ENABLESIZING; + + _ofn.Flags |= OFN_ENABLEHOOK; + _ofn.lpfnHook = OFNHookProc; + + TCHAR *fn = NULL; + try { + fn = ::GetSaveFileName((OPENFILENAME*)&_ofn)?_fileName:NULL; + if (params->getNppGUI()._openSaveDir == dir_last) + { + ::GetCurrentDirectory(MAX_PATH, dir); + params->setWorkingDir(dir); + } + } + catch(...) { + ::MessageBox(NULL, TEXT("GetSaveFileName crashes!!!"), TEXT(""), MB_OK); + } + + ::SetCurrentDirectory(dir); + + return (fn); +} + +static HWND hFileDlg = NULL; +static WNDPROC oldProc = NULL; +static generic_string currentExt = TEXT(""); + +static BOOL CALLBACK fileDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { + switch (message) + { + case WM_COMMAND : + { + switch (wParam) + { + case IDOK : + { + HWND fnControl = ::GetDlgItem(hwnd, FileDialog::_dialogFileBoxId); + TCHAR fn[MAX_PATH]; + ::GetWindowText(fnControl, fn, MAX_PATH); + if (*fn == '\0') + return oldProc(hwnd, message, wParam, lParam); + + if (currentExt != TEXT("")) + { + generic_string fnExt = changeExt(fn, currentExt); + ::SetWindowText(fnControl, fnExt.c_str()); + } + return oldProc(hwnd, message, wParam, lParam); + } + + default : + break; + } + } + } + return oldProc(hwnd, message, wParam, lParam); +}; + +static TCHAR * get1stExt(TCHAR *ext) { // precondition : ext should be under the format : Batch (*.bat;*.cmd;*.nt) + TCHAR *begin = ext; + for ( ; *begin != '.' ; begin++); + TCHAR *end = ++begin; + for ( ; *end != ';' && *end != ')' ; end++); + *end = '\0'; + if (*begin == '*') + *begin = '\0'; + return begin; +}; + +static generic_string addExt(HWND textCtrl, HWND typeCtrl) { + TCHAR fn[MAX_PATH]; + ::GetWindowText(textCtrl, fn, MAX_PATH); + + int i = ::SendMessage(typeCtrl, CB_GETCURSEL, 0, 0); + + int cbTextLen = ::SendMessage(typeCtrl, CB_GETLBTEXTLEN, i, 0); + TCHAR * ext = new TCHAR[cbTextLen + 1]; + ::SendMessage(typeCtrl, CB_GETLBTEXT, i, (LPARAM)ext); + + TCHAR *pExt = get1stExt(ext); + if (*fn != '\0') + { + generic_string fnExt = changeExt(fn, pExt); + ::SetWindowText(textCtrl, fnExt.c_str()); + } + + generic_string returnExt = pExt; + delete[] ext; + return returnExt; +}; + + +UINT_PTR CALLBACK FileDialog::OFNHookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_INITDIALOG : + { + NppParameters *pNppParam = NppParameters::getInstance(); + int index = pNppParam->getFileSaveDlgFilterIndex(); + + ::SetWindowLongPtr(hWnd, GWL_USERDATA, (long)staticThis); + hFileDlg = ::GetParent(hWnd); + goToCenter(hFileDlg); + + if (index != -1) + { + HWND typeControl = ::GetDlgItem(hFileDlg, cmb1); + ::SendMessage(typeControl, CB_SETCURSEL, index, 0); + } + + // Don't touch the following 3 lines, they are cursed !!! + oldProc = (WNDPROC)::GetWindowLongPtr(hFileDlg, GWL_WNDPROC); + if ((long)oldProc > 0) + ::SetWindowLongPtr(hFileDlg, GWL_WNDPROC, (LONG)fileDlgProc); + + return FALSE; + } + + default : + { + FileDialog *pFileDialog = reinterpret_cast(::GetWindowLongPtr(hWnd, GWL_USERDATA)); + if (!pFileDialog) + { + return FALSE; + } + return pFileDialog->run(hWnd, uMsg, wParam, lParam); + } + } + return FALSE; +} + +BOOL APIENTRY FileDialog::run(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch (uMsg) + { + case WM_NOTIFY : + { + LPNMHDR pNmhdr = (LPNMHDR)lParam; + switch(pNmhdr->code) + { + case CDN_TYPECHANGE : + { + HWND fnControl = ::GetDlgItem(::GetParent(hWnd), _dialogFileBoxId); + HWND typeControl = ::GetDlgItem(::GetParent(hWnd), cmb1); + currentExt = addExt(fnControl, typeControl); + return TRUE; + //break; + } + + case CDN_FILEOK : + { + HWND typeControl = ::GetDlgItem(::GetParent(hWnd), cmb1); + int index = ::SendMessage(typeControl, CB_GETCURSEL, 0, 0); + NppParameters *pNppParam = NppParameters::getInstance(); + pNppParam->setFileSaveDlgFilterIndex(index); + return TRUE; + //break; + } + + default : + return FALSE; + } + + } + default : + return FALSE; + } +} diff --git a/PowerEditor/src/WinControls/OpenSaveFileDialog/FileDialog.h b/PowerEditor/src/WinControls/OpenSaveFileDialog/FileDialog.h new file mode 100644 index 00000000..abe1a3ff --- /dev/null +++ b/PowerEditor/src/WinControls/OpenSaveFileDialog/FileDialog.h @@ -0,0 +1,152 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef FILE_DIALOG_H +#define FILE_DIALOG_H + +//#define _WIN32_WINNT 0x0600 + +#include +#include +#include +#include +#include "Parameters.h" + +const int nbExtMax = 256; +const int extLenMax = 64; + +using namespace std; + +typedef vector stringVector; +//const bool styleOpen = true; +//const bool styleSave = false; + +struct OPENFILENAMENPP { + DWORD lStructSize; + HWND hwndOwner; + HINSTANCE hInstance; + LPCTSTR lpstrFilter; + LPTSTR lpstrCustomFilter; + DWORD nMaxCustFilter; + DWORD nFilterIndex; + LPTSTR lpstrFile; + DWORD nMaxFile; + LPTSTR lpstrFileTitle; + DWORD nMaxFileTitle; + LPCTSTR lpstrInitialDir; + LPCTSTR lpstrTitle; + DWORD Flags; + WORD nFileOffset; + WORD nFileExtension; + LPCTSTR lpstrDefExt; + LPARAM lCustData; + LPOFNHOOKPROC lpfnHook; + LPCTSTR lpTemplateName; + void * pvReserved; + DWORD dwReserved; + DWORD FlagsEx; +}; + + +static generic_string changeExt(generic_string fn, generic_string ext) +{ + if (ext == TEXT("")) + return fn; + + generic_string fnExt = fn; + + int index = fnExt.find_last_of(TEXT(".")); + generic_string extension = TEXT("."); + extension += ext; + if (index == generic_string::npos) + { + fnExt += extension; + } + else + { + int len = (extension.length() > fnExt.length() - index + 1)?extension.length():fnExt.length() - index + 1; + fnExt.replace(index, len, extension); + } + return fnExt; +}; + +static void goToCenter(HWND hwnd) +{ + RECT rc; + HWND hParent = ::GetParent(hwnd); + ::GetClientRect(hParent, &rc); + + //If window coordinates are all zero(ie,window is minimised),then assign desktop as the parent window. + if(rc.left == 0 && rc.right == 0 && rc.top == 0 && rc.bottom == 0) + { + //hParent = ::GetDesktopWindow(); + ::ShowWindow(hParent, SW_SHOWNORMAL); + ::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; + ::GetWindowRect(hwnd, &_rc); + int x = center.x - (_rc.right - _rc.left)/2; + int y = center.y - (_rc.bottom - _rc.top)/2; + + ::SetWindowPos(hwnd, HWND_TOP, x, y, _rc.right - _rc.left, _rc.bottom - _rc.top, SWP_SHOWWINDOW); +}; + +class FileDialog +{ +public: + FileDialog(HWND hwnd, HINSTANCE hInst); + ~FileDialog(); + void setExtFilter(const TCHAR *, const TCHAR *, ...); + + int setExtsFilter(const TCHAR *extText, const TCHAR *exts); + void setDefFileName(const TCHAR *fn){lstrcpy(_fileName, fn);} + + TCHAR * doSaveDlg(); + stringVector * doOpenMultiFilesDlg(); + TCHAR * doOpenSingleFileDlg(); + bool isReadOnly() {return _ofn.Flags & OFN_READONLY;}; + + static int _dialogFileBoxId; +protected : + static UINT_PTR CALLBACK OFNHookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + BOOL APIENTRY run(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + +private: + TCHAR _fileName[MAX_PATH*8]; + + TCHAR * _fileExt; + int _nbCharFileExt; + + stringVector _fileNames; + + OPENFILENAMENPP _ofn; + winVer _winVersion; + + + //TCHAR _extArray[nbExtMax][extLenMax]; + int _nbExt; + + static FileDialog *staticThis; +}; + +#endif //FILE_DIALOG_H diff --git a/PowerEditor/src/WinControls/Preference/preference.rc b/PowerEditor/src/WinControls/Preference/preference.rc new file mode 100644 index 00000000..aefc85d8 --- /dev/null +++ b/PowerEditor/src/WinControls/Preference/preference.rc @@ -0,0 +1,252 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#include +#include "preference_rc.h" + +#ifndef IDC_STATIC +#define IDC_STATIC -1 +#endif +IDD_PREFERENCE_BOX DIALOGEX 0, 0, 400, 235 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE +CAPTION "Preferences" +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x1 +BEGIN + PUSHBUTTON "Close",IDC_BUTTON_CLOSE,174,212,45,14 +END + + +IDD_PREFERENCE_BAR_BOX DIALOGEX 0, 0, 390, 185 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Tool bar",IDC_TOOLBAR_GB_STATIC,17,45,147,68,BS_CENTER + CONTROL "Hide",IDC_CHECK_HIDE,"Button",BS_AUTOCHECKBOX,24,55,94,10 + CONTROL "Small icons",IDC_RADIO_SMALLICON,"Button",BS_AUTORADIOBUTTON,24,69,114,10 + CONTROL "Big icons",IDC_RADIO_BIGICON,"Button",BS_AUTORADIOBUTTON,24,83,109,10 + CONTROL "Small standard icons",IDC_RADIO_STANDARD,"Button",BS_AUTORADIOBUTTON,24,97,119,10 + GROUPBOX "Tab bar",IDC_TABBAR_GB_STATIC,183,6,176,151,BS_CENTER + CONTROL "Hide",IDC_CHECK_TAB_HIDE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,189,16,108,10 + CONTROL "Multi-Line",IDC_CHECK_TAB_MULTILINE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,189,30,134,10 + CONTROL "Vertical",IDC_CHECK_TAB_VERTICAL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,189,44,134,10 + CONTROL "Reduce",IDC_CHECK_REDUCE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,189,59,108,10 + CONTROL "Lock (No Drag N Drop)",IDC_CHECK_LOCK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,189,73,134,10 + CONTROL "Draw the inactive tabs",IDC_CHECK_DRAWINACTIVE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,189,88,134,10 + CONTROL "Draw the orange top bar",IDC_CHECK_ORANGE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,189,103,133,10 + CONTROL "Enable close button on each tab",IDC_CHECK_ENABLETABCLOSE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,189,118,133,10 + CONTROL "Double click to close document",IDC_CHECK_DBCLICK2CLOSE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,189,133,133,10 + CONTROL "Show Status Bar",IDC_CHECK_SHOWSTATUSBAR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,18,163,130,10 + GROUPBOX "Menu bar",IDC_MENUBAR_GB_STATIC,17,117,147,40,BS_CENTER + CONTROL "Hide (Use Alt or F10 key to toggle it)",IDC_CHECK_HIDEMENUBAR, + "Button",BS_AUTOCHECKBOX | BS_MULTILINE,24,127,135,25 + GROUPBOX "Localization",IDC_LOCALIZATION_GB_STATIC,17,6,147,35,BS_CENTER + COMBOBOX IDC_COMBO_LOCALIZATION,28,20,119,80,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP +END + +IDD_PREFERENCE_MARGEIN_BOX DIALOGEX 0, 0, 390, 185 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Folder margin style",IDC_FMS_GB_STATIC,32,69,149,42,BS_CENTER + CONTROL "Simple",IDC_RADIO_SIMPLE,"Button",BS_AUTORADIOBUTTON | WS_GROUP,41,82,59,10 + CONTROL "Arrow",IDC_RADIO_ARROW,"Button",BS_AUTORADIOBUTTON,41,96,60,10 + CONTROL "Circle tree",IDC_RADIO_CIRCLE,"Button",BS_AUTORADIOBUTTON,114,82,62,10 + CONTROL "Box tree",IDC_RADIO_BOX,"Button",BS_AUTORADIOBUTTON,114,96,61,10 + CONTROL "Display line number margin",IDC_CHECK_LINENUMBERMARGE, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,33,117,141,10 + CONTROL "Display bookmark margin",IDC_CHECK_BOOKMARKMARGE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,33,129,150,10 + //CONTROL "Display line change state margin",IDC_CHECK_DOCCHANGESTATEMARGE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,33,141,162,10 + CONTROL "Enable current line highlight",IDC_CHECK_CURRENTLINEHILITE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,33,141,129,10 + CONTROL "Show vertical edge",IDC_CHECK_SHOWVERTICALEDGE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,212,81,122,10 + RTEXT "Number of columns :",IDC_NBCOLONE_STATIC,207,129,83,8 + LTEXT "0",IDC_COLONENUMBER_STATIC,297,128,18,8 + GROUPBOX "Vertical Edge Setting",IDC_VES_GB_STATIC,201,69,148,77,BS_CENTER + CONTROL "Line mode",IDC_RADIO_LNMODE,"Button",BS_AUTORADIOBUTTON,215,97,91,10 + CONTROL "Background mode",IDC_RADIO_BGMODE,"Button",BS_AUTORADIOBUTTON,215,111,91,10 + GROUPBOX "",IDC_STATIC,20,54,350,118,0,WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE + COMBOBOX IDC_COMBO_SCINTILLAVIEWCHOIX,139,51,96,40,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Caret settings",IDC_CARETSETTING_STATIC,23,5,199,40,BS_CENTER + LTEXT "Width :",IDC_WIDTH_STATIC,27,24,37,8,0,WS_EX_RIGHT + COMBOBOX IDC_WIDTH_COMBO,66,22,40,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + LTEXT "Blink Rate :",IDC_BLINKRATE_STATIC,138,17,50,8 + CONTROL "",IDC_CARETBLINKRATE_SLIDER,"msctls_trackbar32",TBS_AUTOTICKS | TBS_BOTH | TBS_NOTICKS | WS_TABSTOP,133,29,67,13 + GROUPBOX "Tab Setting",IDC_TABSETTING_GB_STATIC,238,4,130,40,BS_CENTER + CONTROL "Replace by space",IDC_CHECK_REPLACEBYSPACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,256,27,100,10 + RTEXT "Tab size : ",IDC_TABSIZE_STATIC,251,14,58,8 + LTEXT "0",IDC_TABSIZEVAL_STATIC,311,14,18,8 + LTEXT "S",IDC_CARETBLINKRATE_S_STATIC,202,29,12,8 + LTEXT "F",IDC_CARETBLINKRATE_F_STATIC,121,29,12,8,0,WS_EX_RIGHT +END + + +IDD_PREFERENCE_SETTING_BOX DIALOGEX 0, 0, 390, 185 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "History File Setting",IDC_HISTORY_GB_STATIC,15,4,155,39,BS_CENTER + RTEXT "Max number history file :",IDC_MAXNBFILE_STATIC,18,14,112,8 + LTEXT "0",IDC_MAXNBFILEVAL_STATIC,137,14,15,8 + CONTROL "Don't check at launch time",IDC_CHECK_DONTCHECKHISTORY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,27,140,10 + GROUPBOX "Document switcher (Ctrl+TAB)",IDC_DOCUMENTSWITCHER_STATIC,15,48,155,39,BS_CENTER + CONTROL "Enable",IDC_CHECK_ENABLEDOCSWITCHER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,59,69,10 + CONTROL "Enable MRU behaviour",IDC_CHECK_STYLEMRU,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,23,72,140,10 + CONTROL "Enable Notepad++ auto-updater",IDC_CHECK_AUTOUPDATE,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,16,94,150,10 + CONTROL "Smart highlighting",IDC_CHECK_ENABLSMARTHILITE,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,16,136,150,10 + CONTROL "Auto-indent",IDC_CHECK_MAINTAININDENT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,108,150,10 + CONTROL "Minimize to sys tray",IDC_CHECK_MIN2SYSTRAY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,122,150,10 + CONTROL "Show only filename in titlebar",IDC_CHECK_SHORTTITLE, "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,16,150,217,10 + CONTROL "Remember the current session for next launch",IDC_CHECK_REMEMBERSESSION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,16,164,217,10 + GROUPBOX "Clickable link setting",IDC_CLICKABLELINK_STATIC,193,4,155,39,BS_CENTER + CONTROL "Enable",IDC_CHECK_CLICKABLELINK_ENABLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,201,15,140,10 + CONTROL "Don't draw underline",IDC_CHECK_CLICKABLELINK_NOUNDERLINE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,201,28,140,10 + GROUPBOX "File Status Auto-detection",IDC_FILEAUTODETECTION_STATIC,193,47,155,50,BS_CENTER + CONTROL "Enable",IDC_CHECK_FILEAUTODETECTION,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,201,57,140,10 + CONTROL "Update silently",IDC_CHECK_UPDATESILENTLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,201,69,140,10 + CONTROL "Scroll to the last line after update",IDC_CHECK_UPDATEGOTOEOF,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,201,81,140,10 + GROUPBOX "Highlight matching tags",IDC_TAGMATCHEDHILITE_STATIC,193,101,155,50,BS_CENTER + CONTROL "Enable",IDC_CHECK_ENABLTAGSMATCHHILITE,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,201,111,140,10 + CONTROL "Highlight tag attributes",IDC_CHECK_ENABLTAGATTRHILITE,"Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,202,123,140,10 + CONTROL "Highlight php/asp zone",IDC_CHECK_HIGHLITENONEHTMLZONE, "Button",BS_AUTOCHECKBOX | BS_MULTILINE | WS_TABSTOP,202,136,140,10 + RTEXT "Session file ext:",IDC_SESSIONFILEEXT_STATIC,205,160,108,8 + EDITTEXT IDC_EDIT_SESSIONFILEEXT,315,157,34,14,ES_AUTOHSCROLL +END + +IDD_PREFERENCE_NEWDOCSETTING_BOX DIALOGEX 0, 0, 390, 185 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, "MS Shell Dlg", 0, 0, 0x1 +BEGIN + GROUPBOX "Format",IDC_FORMAT_GB_STATIC,225,12,110,55,BS_CENTER + CONTROL "Windows",IDC_RADIO_F_WIN,"Button",BS_AUTORADIOBUTTON | WS_GROUP,233,25,48,10 + CONTROL "Unix",IDC_RADIO_F_UNIX,"Button",BS_AUTORADIOBUTTON,233,38,56,10 + CONTROL "Mac",IDC_RADIO_F_MAC,"Button",BS_AUTORADIOBUTTON,233,52,60,10 + GROUPBOX "Encoding",IDC_ENCODING_STATIC,57,11,144,91,BS_CENTER + CONTROL "ANSI",IDC_RADIO_ANSI,"Button",BS_AUTORADIOBUTTON | WS_GROUP,64,20,80,10 + CONTROL "UTF-8 without BOM",IDC_RADIO_UTF8SANSBOM,"Button",BS_AUTORADIOBUTTON,64,34,128,10 + CONTROL "UTF-8",IDC_RADIO_UTF8,"Button",BS_AUTORADIOBUTTON,64,59,62,10 + CONTROL "UCS-2 big endian",IDC_RADIO_UCS2BIG,"Button",BS_AUTORADIOBUTTON,64,73,103,10 + CONTROL "UCS-2 small endian",IDC_RADIO_UCS2SMALL,"Button",BS_AUTORADIOBUTTON,64,87,102,10 + RTEXT "Default Language :",IDC_DEFAULTLANG_STATIC,203,83,77,8 + COMBOBOX IDC_COMBO_DEFAULTLANG,285,81,60,140,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + GROUPBOX "New Document",IDC_NEWDOCUMENT_GR_STATIC,47,2,304,108,BS_CENTER + GROUPBOX "File Open/Save Directory",IDC_OPENSAVEDIR_GR_STATIC,47,117,304,61,BS_CENTER + CONTROL "Follow the current document",IDC_OPENSAVEDIR_FOLLOWCURRENT_RADIO, + "Button",BS_AUTORADIOBUTTON | WS_GROUP,64,129,200,10 + CONTROL "Remember the last operation directory",IDC_OPENSAVEDIR_REMEMBERLAST_RADIO, + "Button",BS_AUTORADIOBUTTON,64,144,217,10 + CONTROL "",IDC_OPENSAVEDIR_ALWAYSON_RADIO,"Button",BS_AUTORADIOBUTTON,64,156,11,10 + EDITTEXT IDC_OPENSAVEDIR_ALWAYSON_EDIT,80,157,179,14,ES_AUTOHSCROLL + PUSHBUTTON "...",IDD_OPENSAVEDIR_ALWAYSON_BROWSE_BUTTON,266,156,16,14 + CONTROL "Apply while open ANSI file",IDC_CHECK_OPENANSIASUTF8,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,74,46,124,10 +END + +IDD_PREFERENCE_LANG_BOX DIALOGEX 0, 0, 390, 185 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x1 +BEGIN + LISTBOX IDC_LIST_ENABLEDLANG,85,39,78,120,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + LISTBOX IDC_LIST_DISABLEDLANG,231,39,78,120,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "->",IDC_BUTTON_REMOVE,172,71,50,14 + PUSHBUTTON "<-",IDC_BUTTON_RESTORE,173,102,50,14 + CTEXT "Available items",IDC_ENABLEDITEMS_STATIC,88,26,72,8 + CTEXT "Disabled items",IDC_DISABLEDITEMS_STATIC,234,26,72,8 + CONTROL "Make Language Menu compact",IDC_CHECK_LANGMENUCOMPACT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,86,5,174,10 +END + +IDD_PREFERENCE_PRINT_BOX DIALOGEX 0, 0, 390, 185 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x1 +BEGIN + CONTROL "WYSIWYG",IDC_RADIO_WYSIWYG,"Button",BS_AUTORADIOBUTTON,50,65,123,10 + CONTROL "Invert",IDC_RADIO_INVERT,"Button",BS_AUTORADIOBUTTON,50,80,90,10 + CONTROL "Black on white",IDC_RADIO_BW,"Button",BS_AUTORADIOBUTTON,50,95,90,10 + CONTROL "No background colour",IDC_RADIO_NOBG,"Button",BS_AUTORADIOBUTTON,50,111,123,10 + GROUPBOX "Colour Option",IDC_COLOUROPT_STATIC,45,45,133,96,BS_CENTER + CONTROL "Print Line Number",IDC_CHECK_PRINTLINENUM,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,46,30,145,10 + EDITTEXT IDC_EDIT_ML,228,88,17,14,ES_NUMBER + EDITTEXT IDC_EDIT_MT,249,69,17,14,ES_NUMBER + EDITTEXT IDC_EDIT_MR,269,88,17,14,ES_NUMBER + EDITTEXT IDC_EDIT_MB,249,109,17,14,ES_NUMBER + RTEXT "Left",IDC_ML_STATIC,195,91,30,8 + CTEXT "Top",IDC_MT_STATIC,231,59,54,8 + LTEXT "Right",IDC_MR_STATIC,291,91,29,8 + CTEXT "Bottom",IDC_MB_STATIC,231,124,54,8 + GROUPBOX "Margin Setting (Unit:mm)",IDC_MARGESETTINGS_STATIC,187,45,144,96,BS_CENTER +END + +IDD_PREFERENCE_PRINT2_BOX DIALOGEX 0, 0, 390, 185 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x1 +BEGIN + EDITTEXT IDC_EDIT_HLEFT,59,48,83,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_HMIDDLE,149,48,83,14,ES_CENTER | ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_HRIGHT,239,48,83,14,ES_RIGHT | ES_AUTOHSCROLL + COMBOBOX IDC_COMBO_HFONTNAME,59,66,84,104,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO_HFONTSIZE,149,66,31,72,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_CHECK_HBOLD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,189,66,46,10 + CONTROL "Italic",IDC_CHECK_HITALIC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,249,66,43,10 + GROUPBOX "Header",IDC_HGB_STATIC,51,29,279,56,BS_CENTER + CTEXT "Left part",IDC_HL_STATIC,61,39,79,8 + CTEXT "Middle part",IDC_HM_STATIC,153,39,75,8 + CTEXT "Right part",IDC_HR_STATIC,241,39,78,8 + EDITTEXT IDC_EDIT_FLEFT,59,106,83,14,ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_FMIDDLE,150,106,83,14,ES_CENTER | ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_FRIGHT,239,106,83,14,ES_RIGHT | ES_AUTOHSCROLL + COMBOBOX IDC_COMBO_FFONTNAME,59,124,84,119,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO_FFONTSIZE,151,124,31,71,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + CONTROL "Bold",IDC_CHECK_FBOLD,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,190,126,46,10 + CONTROL "Italic",IDC_CHECK_FITALIC,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,249,126,47,10 + GROUPBOX "Footer",IDC_FGB_STATIC,51,87,279,58,BS_CENTER + CTEXT "Left part",IDC_FL_STATIC,61,97,78,8 + CTEXT "Middle part",IDC_FM_STATIC,150,97,82,8 + CTEXT "Right part",IDC_FR_STATIC,241,97,79,8 + COMBOBOX IDC_COMBO_VARLIST,113,14,70,58,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Add",IDC_BUTTON_ADDVAR,191,14,44,12 + RTEXT "Variable :",IDC_VAR_STATIC,52,16,59,8 + RTEXT "Which part :",IDC_WHICHPART_STATIC,38,149,80,8 + LTEXT "",IDC_VIEWPANEL_STATIC,121,149,213,8 +END + +IDD_PREFERENCE_BACKUP_BOX DIALOGEX 0, 0, 390, 185 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x1 +BEGIN + GROUPBOX "Backup",IDC_BACKUPDIR_GRP_STATIC,46,11,289,86,BS_CENTER + CONTROL "None",IDC_RADIO_BKNONE,"Button",BS_AUTORADIOBUTTON | WS_GROUP,71,24,87,10 + CONTROL "Simple Backup",IDC_RADIO_BKSIMPLE,"Button",BS_AUTORADIOBUTTON,195,24,111,10 + CONTROL "Verbose Backup",IDC_RADIO_BKVERBOSE,"Button",BS_AUTORADIOBUTTON,195,38,111,10 + GROUPBOX "User custom backup directory",IDC_BACKUPDIR_USERCUSTOMDIR_GRPSTATIC,62,50,260,40 + CONTROL "",IDC_BACKUPDIR_CHECK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,58,50,8,10 + RTEXT "Directory :",IDD_BACKUPDIR_STATIC,66,67,40,8 + EDITTEXT IDC_BACKUPDIR_EDIT,113,65,179,14,ES_AUTOHSCROLL + PUSHBUTTON "...",IDD_BACKUPDIR_BROWSE_BUTTON,299,65,16,14 + GROUPBOX "Auto-completion",IDD_AUTOC_GRPSTATIC,46,103,289,73,BS_CENTER + CONTROL "Enable Auto-completion on each input",IDD_AUTOC_ENABLECHECK, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,51,114,150,10 + CONTROL "Function completion",IDD_AUTOC_FUNCRADIO,"Button",BS_AUTORADIOBUTTON | WS_GROUP,78,128,145,10 + CONTROL "Word completion",IDD_AUTOC_WORDRADIO,"Button",BS_AUTORADIOBUTTON,78,144,145,10 + RTEXT "From",IDD_AUTOC_STATIC_FROM,208,114,47,8 + CTEXT "1",IDD_AUTOC_STATIC_N,259,114,8,8 + LTEXT "th characters",IDD_AUTOC_STATIC_CHAR,273,114,57,8 + LTEXT "Valid value : 1 - 9",IDD_AUTOC_STATIC_NOTE,238,124,93,8 + CONTROL "Function parameters hint on input",IDD_FUNC_CHECK, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,51,156,160,10 +END diff --git a/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp new file mode 100644 index 00000000..87692526 --- /dev/null +++ b/PowerEditor/src/WinControls/Preference/preferenceDlg.cpp @@ -0,0 +1,1778 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include +#include "preferenceDlg.h" + +const int BLINKRATE_FASTEST = 50; +const int BLINKRATE_SLOWEST = 2500; +const int BLINKRATE_INTERVAL = 50; + +BOOL CALLBACK PreferenceDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_INITDIALOG : + { + _ctrlTab.init(_hInst, _hSelf, false, true, true); + _ctrlTab.setFont(TEXT("Tahoma"), 13); + + _barsDlg.init(_hInst, _hSelf); + _barsDlg.create(IDD_PREFERENCE_BAR_BOX); + _barsDlg.display(); + + _marginsDlg.init(_hInst, _hSelf); + _marginsDlg.create(IDD_PREFERENCE_MARGEIN_BOX); + + _settingsDlg.init(_hInst, _hSelf); + _settingsDlg.create(IDD_PREFERENCE_SETTING_BOX); + + _defaultNewDocDlg.init(_hInst, _hSelf); + _defaultNewDocDlg.create(IDD_PREFERENCE_NEWDOCSETTING_BOX); + + _fileAssocDlg.init(_hInst, _hSelf); + _fileAssocDlg.create(IDD_REGEXT_BOX); + + _printSettingsDlg.init(_hInst, _hSelf); + _printSettingsDlg.create(IDD_PREFERENCE_PRINT_BOX); + + + _printSettings2Dlg.init(_hInst, _hSelf); + _printSettings2Dlg.create(IDD_PREFERENCE_PRINT2_BOX); + + _langMenuDlg.init(_hInst, _hSelf); + _langMenuDlg.create(IDD_PREFERENCE_LANG_BOX); + + _backupDlg.init(_hInst, _hSelf); + _backupDlg.create(IDD_PREFERENCE_BACKUP_BOX); + + _wVector.push_back(DlgInfo(&_barsDlg, TEXT("Global"), TEXT("Global"))); + _wVector.push_back(DlgInfo(&_marginsDlg, TEXT("Edit Components"), TEXT("Scintillas"))); + _wVector.push_back(DlgInfo(&_defaultNewDocDlg, TEXT("New Document/Open Save Directory"), TEXT("NewDoc"))); + _wVector.push_back(DlgInfo(&_fileAssocDlg, TEXT("File Association"), TEXT("FileAssoc"))); + _wVector.push_back(DlgInfo(&_langMenuDlg, TEXT("Language Menu"), TEXT("LangMenu"))); + _wVector.push_back(DlgInfo(&_printSettingsDlg, TEXT("Print - Colour and Margin"), TEXT("Print1"))); + _wVector.push_back(DlgInfo(&_printSettings2Dlg, TEXT("Print - Header and Footer"), TEXT("Print2"))); + _wVector.push_back(DlgInfo(&_backupDlg, TEXT("Backup/Auto-completion"), TEXT("Backup"))); + _wVector.push_back(DlgInfo(&_settingsDlg, TEXT("MISC"), TEXT("MISC"))); + _ctrlTab.createTabs(_wVector); + _ctrlTab.display(); + RECT rc; + getClientRect(rc); + _ctrlTab.reSizeTo(rc); + rc.bottom -= 30; + + _barsDlg.reSizeTo(rc); + _marginsDlg.reSizeTo(rc); + _settingsDlg.reSizeTo(rc); + _defaultNewDocDlg.reSizeTo(rc); + _fileAssocDlg.reSizeTo(rc); + _langMenuDlg.reSizeTo(rc); + _printSettingsDlg.reSizeTo(rc); + _printSettings2Dlg.reSizeTo(rc); + _backupDlg.reSizeTo(rc); + + NppParameters *pNppParam = NppParameters::getInstance(); + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + return TRUE; + } + + case WM_NOTIFY : + { + NMHDR *nmhdr = (NMHDR *)lParam; + if (nmhdr->code == TCN_SELCHANGE) + { + if (nmhdr->hwndFrom == _ctrlTab.getHSelf()) + { + _ctrlTab.clickedUpdate(); + return TRUE; + } + } + break; + } + + case WM_COMMAND : + { + switch (wParam) + { + case IDC_BUTTON_CLOSE : + case IDCANCEL : + display(false); + return TRUE; + + default : + ::SendMessage(_hParent, WM_COMMAND, wParam, lParam); + return TRUE; + } + } + } + return FALSE; +} + +BOOL CALLBACK BarsDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + NppParameters *pNppParam = NppParameters::getInstance(); + switch (Message) + { + case WM_INITDIALOG : + { + const NppGUI & nppGUI = pNppParam->getNppGUI(); + toolBarStatusType tbStatus = nppGUI._toolBarStatus; + int tabBarStatus = nppGUI._tabStatus; + bool showTool = nppGUI._toolbarShow; + bool showStatus = nppGUI._statusBarShow; + bool showMenu = nppGUI._menuBarShow; + + + ::SendDlgItemMessage(_hSelf, IDC_CHECK_HIDE, BM_SETCHECK, showTool?BST_UNCHECKED:BST_CHECKED, 0); + int ID2Check = 0; + switch (tbStatus) + { + case TB_SMALL : + ID2Check = IDC_RADIO_SMALLICON; + break; + case TB_LARGE : + ID2Check = IDC_RADIO_BIGICON; + break; + case TB_STANDARD: + default : + ID2Check = IDC_RADIO_STANDARD; + } + ::SendDlgItemMessage(_hSelf, ID2Check, BM_SETCHECK, BST_CHECKED, 0); + + ::SendDlgItemMessage(_hSelf, IDC_CHECK_REDUCE, BM_SETCHECK, tabBarStatus & TAB_REDUCE, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_LOCK, BM_SETCHECK, !(tabBarStatus & TAB_DRAGNDROP), 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_ORANGE, BM_SETCHECK, tabBarStatus & TAB_DRAWTOPBAR, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_DRAWINACTIVE, BM_SETCHECK, tabBarStatus & TAB_DRAWINACTIVETAB, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_ENABLETABCLOSE, BM_SETCHECK, tabBarStatus & TAB_CLOSEBUTTON, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_DBCLICK2CLOSE, BM_SETCHECK, tabBarStatus & TAB_DBCLK2CLOSE, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_TAB_VERTICAL, BM_SETCHECK, tabBarStatus & TAB_VERTICAL, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_TAB_MULTILINE, BM_SETCHECK, tabBarStatus & TAB_MULTILINE, 0); + + ::SendDlgItemMessage(_hSelf, IDC_CHECK_TAB_HIDE, BM_SETCHECK, tabBarStatus & TAB_HIDE, 0); + ::SendMessage(_hSelf, WM_COMMAND, IDC_CHECK_TAB_HIDE, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_SHOWSTATUSBAR, BM_SETCHECK, showStatus, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_HIDEMENUBAR, BM_SETCHECK, !showMenu, 0); + +#ifndef UNICODE + ::EnableWindow(::GetDlgItem(_hSelf, IDC_LOCALIZATION_GB_STATIC), FALSE); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_COMBO_LOCALIZATION), FALSE); +#else + LocalizationSwitcher & localizationSwitcher = pNppParam->getLocalizationSwitcher(); + + for (size_t i = 0 ; i < localizationSwitcher.size() ; i++) + { + pair localizationInfo = localizationSwitcher.getElementFromIndex(i); + ::SendDlgItemMessage(_hSelf, IDC_COMBO_LOCALIZATION, CB_ADDSTRING, 0, (LPARAM)localizationInfo.first.c_str()); + } +#endif + + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + + return TRUE; + } + + case WM_COMMAND : + { + switch (wParam) + { + case IDC_CHECK_SHOWSTATUSBAR : + { + bool isChecked = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_CHECK_SHOWSTATUSBAR, BM_GETCHECK, 0, 0)); + ::SendMessage(::GetParent(_hParent), NPPM_HIDESTATUSBAR, 0, isChecked?FALSE:TRUE); + } + return TRUE; + + case IDC_CHECK_HIDEMENUBAR : + { + bool isChecked = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_CHECK_HIDEMENUBAR, BM_GETCHECK, 0, 0)); + ::SendMessage(::GetParent(_hParent), NPPM_HIDEMENU, 0, isChecked?TRUE:FALSE); + } + return TRUE; + + case IDC_CHECK_TAB_HIDE : + { + bool toBeHidden = (BST_CHECKED == ::SendMessage(::GetDlgItem(_hSelf, IDC_CHECK_TAB_HIDE), BM_GETCHECK, 0, 0)); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_TAB_MULTILINE), !toBeHidden); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_TAB_VERTICAL), !toBeHidden); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_REDUCE), !toBeHidden); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_LOCK), !toBeHidden); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_ORANGE), !toBeHidden); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_DRAWINACTIVE), !toBeHidden); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_ENABLETABCLOSE), !toBeHidden); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_DBCLICK2CLOSE), !toBeHidden); + + ::SendMessage(::GetParent(_hParent), NPPM_HIDETABBAR, 0, toBeHidden); + return TRUE; + } + + case IDC_CHECK_TAB_VERTICAL: + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_DRAWTABBAR_VERTICAL, 0); + return TRUE; + + case IDC_CHECK_TAB_MULTILINE : + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_DRAWTABBAR_MULTILINE, 0); + return TRUE; + + + + case IDC_CHECK_REDUCE : + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_REDUCETABBAR, 0); + return TRUE; + + case IDC_CHECK_LOCK : + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_LOCKTABBAR, 0); + return TRUE; + + case IDC_CHECK_ORANGE : + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_DRAWTABBAR_TOPBAR, 0); + return TRUE; + + case IDC_CHECK_DRAWINACTIVE : + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_DRAWTABBAR_INACIVETAB, 0); + return TRUE; + + case IDC_CHECK_ENABLETABCLOSE : + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_DRAWTABBAR_CLOSEBOTTUN, 0); + return TRUE; + + case IDC_CHECK_DBCLICK2CLOSE : + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_DRAWTABBAR_DBCLK2CLOSE, 0); + return TRUE; + + case IDC_CHECK_HIDE : + { + bool isChecked = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_CHECK_HIDE, BM_GETCHECK, 0, 0)); + ::SendMessage(::GetParent(_hParent), NPPM_HIDETOOLBAR, 0, isChecked?TRUE:FALSE); + } + return TRUE; + + case IDC_RADIO_SMALLICON : + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_TOOLBAR_REDUCE, 0); + return TRUE; + + case IDC_RADIO_BIGICON : + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_TOOLBAR_ENLARGE, 0); + return TRUE; + + case IDC_RADIO_STANDARD : + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_TOOLBAR_STANDARD, 0); + return TRUE; + + default : + switch (HIWORD(wParam)) + { + case CBN_SELCHANGE : // == case LBN_SELCHANGE : + { + switch (LOWORD(wParam)) + { + case IDC_COMBO_LOCALIZATION : + { +#ifdef UNICODE + LocalizationSwitcher & localizationSwitcher = pNppParam->getLocalizationSwitcher(); + int index = ::SendDlgItemMessage(_hSelf, IDC_COMBO_LOCALIZATION, CB_GETCURSEL, 0, 0); + wchar_t langName[MAX_PATH]; + ::SendDlgItemMessage(_hSelf, IDC_COMBO_LOCALIZATION, CB_GETLBTEXT, index, (LPARAM)langName); + if (langName[0]) + { + + // Make English as basic language + if (localizationSwitcher.switchToLang(TEXT("English"))) + { + ::SendMessage(::GetParent(_hParent), NPPM_INTERNAL_RELOADNATIVELANG, 0, 0); + } + // Change the language + if (localizationSwitcher.switchToLang(langName)) + { + ::SendMessage(::GetParent(_hParent), NPPM_INTERNAL_RELOADNATIVELANG, 0, 0); + ::InvalidateRect(_hParent, NULL, TRUE); + } + //::SendMessage(::GetParent(_hParent), NPPM_INTERNAL_RELOADSTYLERS, 0, 0); + } +#endif + } + return TRUE; +/* + case IDC_COMBO_THEME : + { + LocalizationSwitcher & localizationSwitcher = pNppParam->getLocalizationSwitcher(); + int index = ::SendDlgItemMessage(_hSelf, IDC_COMBO_LOCALIZATION, CB_GETCURSEL, 0, 0); + TCHAR themeName[MAX_PATH]; + ::SendDlgItemMessage(_hSelf, IDC_COMBO_LOCALIZATION, CB_GETLBTEXT, index, (LPARAM)themeName); + if (langName[0]) + { + // Make English as basic language + if (localizationSwitcher.switchToLang(TEXT("English"))) + { + ::SendMessage(::GetParent(_hParent), NPPM_INTERNAL_RELOADNATIVELANG, 0, 0); + } + // Change the language + if (localizationSwitcher.switchToLang(langName)) + { + ::SendMessage(::GetParent(_hParent), NPPM_INTERNAL_RELOADNATIVELANG, 0, 0); + ::InvalidateRect(_hParent, NULL, TRUE); + } + } + } + return TRUE; + */ + default: + break; + } + } + } + } + } + } + return FALSE; +} + +void MarginsDlg::changePanelTo(int index) +{ + NppParameters *pNppParam = NppParameters::getInstance(); + const ScintillaViewParams & svp = pNppParam->getSVP(index?SCIV_SECOND:SCIV_PRIMARY); + + ::SendDlgItemMessage(_hSelf, IDC_RADIO_BOX, BM_SETCHECK, FALSE, 0); + ::SendDlgItemMessage(_hSelf, IDC_RADIO_CIRCLE, BM_SETCHECK, FALSE, 0); + ::SendDlgItemMessage(_hSelf, IDC_RADIO_ARROW, BM_SETCHECK, FALSE, 0); + ::SendDlgItemMessage(_hSelf, IDC_RADIO_SIMPLE, BM_SETCHECK, FALSE, 0); + + int id = 0; + switch (svp._folderStyle) + { + case FOLDER_STYLE_BOX: + id = IDC_RADIO_BOX; + break; + case FOLDER_STYLE_CIRCLE: + id = IDC_RADIO_CIRCLE; + break; + case FOLDER_STYLE_ARROW: + id = IDC_RADIO_ARROW; + break; + default : // FOLDER_STYLE_SIMPLE: + id = IDC_RADIO_SIMPLE; + } + ::SendDlgItemMessage(_hSelf, id, BM_SETCHECK, TRUE, 0); + + ::SendDlgItemMessage(_hSelf, IDC_CHECK_LINENUMBERMARGE, BM_SETCHECK, svp._lineNumberMarginShow, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_BOOKMARKMARGE, BM_SETCHECK, svp._bookMarkMarginShow, 0); + //::SendDlgItemMessage(_hSelf, IDC_CHECK_DOCCHANGESTATEMARGE, BM_SETCHECK, svp._docChangeStateMarginShow, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_CURRENTLINEHILITE, BM_SETCHECK, svp._currentLineHilitingShow, 0); + + bool isEnable = !(svp._edgeMode == EDGE_NONE); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_SHOWVERTICALEDGE, BM_SETCHECK, isEnable, 0); + ::SendDlgItemMessage(_hSelf, IDC_RADIO_LNMODE, BM_SETCHECK, (svp._edgeMode == EDGE_LINE), 0); + ::SendDlgItemMessage(_hSelf, IDC_RADIO_BGMODE, BM_SETCHECK, (svp._edgeMode == EDGE_BACKGROUND), 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_LNMODE), isEnable); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_BGMODE), isEnable); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_NBCOLONE_STATIC), isEnable); + + TCHAR nbColStr[10]; + wsprintf(nbColStr, TEXT("%d"), svp._edgeNbColumn); + ::SetWindowText(::GetDlgItem(_hSelf, IDC_COLONENUMBER_STATIC), nbColStr); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_COLONENUMBER_STATIC), isEnable); + +} + +BOOL CALLBACK MarginsDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + NppParameters *pNppParam = NppParameters::getInstance(); + NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); + switch (Message) + { + case WM_INITDIALOG : + { + TCHAR nbStr[10]; + wsprintf(nbStr, TEXT("%d"), nppGUI._tabSize); + HWND hTabSize_val = ::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC); + ::SetWindowText(hTabSize_val, nbStr); + + _tabSizeVal.init(_hInst, _hSelf); + _tabSizeVal.create(hTabSize_val, IDM_SETTING_TAB_SIZE); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_REPLACEBYSPACE, BM_SETCHECK, nppGUI._tabReplacedBySpace, 0); + + _verticalEdgeLineNbColVal.init(_hInst, _hSelf); + _verticalEdgeLineNbColVal.create(::GetDlgItem(_hSelf, IDC_COLONENUMBER_STATIC), IDM_SETTING_EDGE_SIZE); + + ::SendDlgItemMessage(_hSelf, IDC_WIDTH_COMBO, CB_ADDSTRING, 0, (LPARAM)TEXT("0")); + ::SendDlgItemMessage(_hSelf, IDC_WIDTH_COMBO, CB_ADDSTRING, 0, (LPARAM)TEXT("1")); + ::SendDlgItemMessage(_hSelf, IDC_WIDTH_COMBO, CB_ADDSTRING, 0, (LPARAM)TEXT("2")); + ::SendDlgItemMessage(_hSelf, IDC_WIDTH_COMBO, CB_ADDSTRING, 0, (LPARAM)TEXT("3")); + ::SendDlgItemMessage(_hSelf, IDC_WIDTH_COMBO, CB_ADDSTRING, 0, (LPARAM)TEXT("Block")); + + + ::SendMessage(::GetDlgItem(_hSelf, IDC_WIDTH_COMBO), CB_SETCURSEL, nppGUI._caretWidth, 0); + + ::SendMessage(::GetDlgItem(_hSelf, IDC_CARETBLINKRATE_SLIDER),TBM_SETRANGEMIN, TRUE, BLINKRATE_FASTEST); + ::SendMessage(::GetDlgItem(_hSelf, IDC_CARETBLINKRATE_SLIDER),TBM_SETRANGEMAX, TRUE, BLINKRATE_SLOWEST); + ::SendMessage(::GetDlgItem(_hSelf, IDC_CARETBLINKRATE_SLIDER),TBM_SETPAGESIZE, 0, BLINKRATE_INTERVAL); + int blinkRate = (nppGUI._caretBlinkRate==0)?BLINKRATE_SLOWEST:nppGUI._caretBlinkRate; + ::SendMessage(::GetDlgItem(_hSelf, IDC_CARETBLINKRATE_SLIDER),TBM_SETPOS, TRUE, blinkRate); + + ::SendDlgItemMessage(_hSelf, IDC_COMBO_SCINTILLAVIEWCHOIX, CB_ADDSTRING, 0, (LPARAM)TEXT("Primary View")); + ::SendDlgItemMessage(_hSelf, IDC_COMBO_SCINTILLAVIEWCHOIX, CB_ADDSTRING, 0, (LPARAM)TEXT("Second View")); + ::SendDlgItemMessage(_hSelf, IDC_COMBO_SCINTILLAVIEWCHOIX, CB_SETCURSEL, 0, 0); + + changePanelTo(SCIV_PRIMARY); + + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + return TRUE; + } + + case WM_HSCROLL: + { + //case IDC_CARETBLINKRATE_SLIDER: + NppGUI & nppGUI = (NppGUI &)NppParameters::getInstance()->getNppGUI(); + //nppGUI._caretBlinkRate = ::SendMessage(::GetDlgItem(_hSelf, IDC_CARETBLINKRATE_SLIDER),TBM_GETPOS, 0, 0); + int blinkRate = (int)::SendMessage(::GetDlgItem(_hSelf, IDC_CARETBLINKRATE_SLIDER),TBM_GETPOS, 0, 0); + if (blinkRate == BLINKRATE_SLOWEST) + blinkRate = 0; + nppGUI._caretBlinkRate = blinkRate; + + ::SendMessage(::GetParent(_hParent), NPPM_INTERNAL_SETCARETBLINKRATE, 0, 0); + return 0; //return zero when handled + + } + + case WM_COMMAND : + { + int i = ::SendDlgItemMessage(_hSelf, IDC_COMBO_SCINTILLAVIEWCHOIX, CB_GETCURSEL, 0, 0); + ScintillaViewParams & svp = (ScintillaViewParams &)pNppParam->getSVP(i?SCIV_SECOND:SCIV_PRIMARY); + int iView = i + 1; + switch (wParam) + { + case IDM_SETTING_TAB_SIZE: + { + ::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_TAB_SIZE, 0); + TCHAR nbStr[10]; + wsprintf(nbStr, TEXT("%d"), nppGUI._tabSize); + ::SetWindowText(::GetDlgItem(_hSelf, IDC_TABSIZEVAL_STATIC), nbStr); + return TRUE; + } + + case IDC_CHECK_REPLACEBYSPACE: + ::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_TAB_REPLCESPACE, 0); + return TRUE; + + case IDC_CHECK_LINENUMBERMARGE: + svp._lineNumberMarginShow = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_CHECK_LINENUMBERMARGE, BM_GETCHECK, 0, 0)); + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_LINENUMBER, iView); + return TRUE; + + case IDC_CHECK_BOOKMARKMARGE: + svp._bookMarkMarginShow = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_CHECK_BOOKMARKMARGE, BM_GETCHECK, 0, 0)); + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_SYMBOLMARGIN, iView); + return TRUE; +/* + case IDC_CHECK_DOCCHANGESTATEMARGE: + svp._docChangeStateMarginShow = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_CHECK_DOCCHANGESTATEMARGE, BM_GETCHECK, 0, 0)); + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_DOCCHANGEMARGIN, iView); + return TRUE; +*/ + case IDC_CHECK_CURRENTLINEHILITE: + svp._currentLineHilitingShow = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_CHECK_CURRENTLINEHILITE, BM_GETCHECK, 0, 0)); + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_CURLINE_HILITING, iView); + return TRUE; + + + case IDC_RADIO_SIMPLE: + svp._folderStyle = FOLDER_STYLE_SIMPLE; + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_FOLDERMAGIN_SIMPLE, iView); + return TRUE; + case IDC_RADIO_ARROW: + svp._folderStyle = FOLDER_STYLE_ARROW; + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_FOLDERMAGIN_ARROW, iView); + return TRUE; + case IDC_RADIO_CIRCLE: + svp._folderStyle = FOLDER_STYLE_CIRCLE; + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_FOLDERMAGIN_CIRCLE, iView); + return TRUE; + case IDC_RADIO_BOX: + svp._folderStyle = FOLDER_STYLE_BOX; + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_FOLDERMAGIN_BOX, iView); + return TRUE; + + + case IDC_CHECK_SHOWVERTICALEDGE: + { + int modeID = 0; + bool isChecked = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_CHECK_SHOWVERTICALEDGE, BM_GETCHECK, 0, 0)); + if (isChecked) + { + ::SendDlgItemMessage(_hSelf, IDC_RADIO_LNMODE, BM_SETCHECK, TRUE, 0); + svp._edgeMode = EDGE_LINE; + modeID = IDM_VIEW_EDGELINE; + } + else + { + ::SendDlgItemMessage(_hSelf, IDC_RADIO_LNMODE, BM_SETCHECK, FALSE, 0); + ::SendDlgItemMessage(_hSelf, IDC_RADIO_BGMODE, BM_SETCHECK, FALSE, 0); + svp._edgeMode = EDGE_NONE; + modeID = IDM_VIEW_EDGENONE; + } + ::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_LNMODE), isChecked); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_RADIO_BGMODE), isChecked); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_NBCOLONE_STATIC), isChecked); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_COLONENUMBER_STATIC), isChecked); + + ::SendMessage(_hParent, WM_COMMAND, modeID, iView); + return TRUE; + } + case IDC_RADIO_LNMODE: + svp._edgeMode = EDGE_LINE; + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_EDGELINE, iView); + return TRUE; + + case IDC_RADIO_BGMODE: + svp._edgeMode = EDGE_BACKGROUND; + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_EDGEBACKGROUND, iView); + return TRUE; + + case IDM_SETTING_EDGE_SIZE: + { + ::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_EDGE_SIZE, iView); + TCHAR nbColStr[10]; + wsprintf(nbColStr, TEXT("%d"), svp._edgeNbColumn); + ::SetWindowText(::GetDlgItem(_hSelf, IDC_COLONENUMBER_STATIC), nbColStr); + return TRUE; + } + + default : + switch (HIWORD(wParam)) + { + case CBN_SELCHANGE : // == case LBN_SELCHANGE : + { + switch (LOWORD(wParam)) + { + case IDC_COMBO_SCINTILLAVIEWCHOIX : + { + changePanelTo(i); + return TRUE; + } + case IDC_WIDTH_COMBO: + { + nppGUI._caretWidth = ::SendDlgItemMessage(_hSelf, IDC_WIDTH_COMBO, CB_GETCURSEL, 0, 0); + ::SendMessage(::GetParent(_hParent), NPPM_INTERNAL_SETCARETWIDTH, 0, 0); + return TRUE; + } + default: + break; + } + } + } + } + } + } + return FALSE; +} + +BOOL CALLBACK SettingsDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + NppParameters *pNppParam = NppParameters::getInstance(); + NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); + switch (Message) + { + case WM_INITDIALOG : + { + TCHAR nbStr[10]; + wsprintf(nbStr, TEXT("%d"), pNppParam->getNbMaxFile()); + ::SetWindowText(::GetDlgItem(_hSelf, IDC_MAXNBFILEVAL_STATIC), nbStr); + + _nbHistoryVal.init(_hInst, _hSelf); + _nbHistoryVal.create(::GetDlgItem(_hSelf, IDC_MAXNBFILEVAL_STATIC), IDM_SETTING_HISTORY_SIZE); + + ::SendDlgItemMessage(_hSelf, IDC_CHECK_DONTCHECKHISTORY, BM_SETCHECK, !nppGUI._checkHistoryFiles, 0); + + if (nppGUI._fileAutoDetection == cdEnabled) + { + ::SendDlgItemMessage(_hSelf, IDC_CHECK_FILEAUTODETECTION, BM_SETCHECK, BST_CHECKED, 0); + } + else if (nppGUI._fileAutoDetection == cdAutoUpdate) + { + ::SendDlgItemMessage(_hSelf, IDC_CHECK_FILEAUTODETECTION, BM_SETCHECK, BST_CHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_UPDATESILENTLY, BM_SETCHECK, BST_CHECKED, 0); + } + else if (nppGUI._fileAutoDetection == cdGo2end) + { + ::SendDlgItemMessage(_hSelf, IDC_CHECK_FILEAUTODETECTION, BM_SETCHECK, BST_CHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_UPDATEGOTOEOF, BM_SETCHECK, BST_CHECKED, 0); + } + else if (nppGUI._fileAutoDetection == cdAutoUpdateGo2end) + { + ::SendDlgItemMessage(_hSelf, IDC_CHECK_FILEAUTODETECTION, BM_SETCHECK, BST_CHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_UPDATESILENTLY, BM_SETCHECK, BST_CHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_UPDATEGOTOEOF, BM_SETCHECK, BST_CHECKED, 0); + } + else //cdDisabled + { + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_UPDATESILENTLY), FALSE); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_UPDATEGOTOEOF), FALSE); + } + + ::SendDlgItemMessage(_hSelf, IDC_CHECK_MIN2SYSTRAY, BM_SETCHECK, nppGUI._isMinimizedToTray, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_REMEMBERSESSION, BM_SETCHECK, nppGUI._rememberLastSession, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_AUTOUPDATE, BM_SETCHECK, !nppGUI._neverUpdate, 0); + + ::ShowWindow(::GetDlgItem(_hSelf, IDC_CHECK_AUTOUPDATE), nppGUI._doesExistUpdater?SW_SHOW:SW_HIDE); + + BOOL linkEnable = FALSE; + BOOL dontUnderline = FALSE; + BOOL dontUnderlineState = FALSE; + if (nppGUI._styleURL == 1) + { + linkEnable = TRUE; + dontUnderline = TRUE; + dontUnderlineState = TRUE; + + } + else if (nppGUI._styleURL == 2) + { + linkEnable = TRUE; + dontUnderline = FALSE; + dontUnderlineState = TRUE; + } + + ::SendDlgItemMessage(_hSelf, IDC_CHECK_CLICKABLELINK_ENABLE, BM_SETCHECK, linkEnable, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_CLICKABLELINK_NOUNDERLINE, BM_SETCHECK, dontUnderline, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_CLICKABLELINK_NOUNDERLINE), dontUnderlineState); + + ::SendDlgItemMessage(_hSelf, IDC_EDIT_SESSIONFILEEXT, WM_SETTEXT, 0, (LPARAM)nppGUI._definedSessionExt.c_str()); + + ::SendDlgItemMessage(_hSelf, IDC_CHECK_ENABLEDOCSWITCHER, BM_SETCHECK, nppGUI._doTaskList, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_MAINTAININDENT, BM_SETCHECK, nppGUI._maitainIndent, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_STYLEMRU, BM_SETCHECK, nppGUI._styleMRU, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_ENABLSMARTHILITE, BM_SETCHECK, nppGUI._enableSmartHilite, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_ENABLTAGSMATCHHILITE, BM_SETCHECK, nppGUI._enableTagsMatchHilite, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_ENABLTAGATTRHILITE, BM_SETCHECK, nppGUI._enableTagAttrsHilite, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_HIGHLITENONEHTMLZONE, BM_SETCHECK, nppGUI._enableHiliteNonHTMLZone, 0); + + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_ENABLTAGATTRHILITE), nppGUI._enableTagsMatchHilite); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_HIGHLITENONEHTMLZONE), nppGUI._enableTagsMatchHilite); + + ::SendDlgItemMessage(_hSelf, IDC_CHECK_SHORTTITLE, BM_SETCHECK, nppGUI._shortTitlebar, 0); + + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + + return TRUE; + } + + case WM_COMMAND : + { + if (HIWORD(wParam) == EN_CHANGE) + { + switch (LOWORD(wParam)) + { + case IDC_EDIT_SESSIONFILEEXT: + { + TCHAR sessionExt[MAX_PATH]; + ::SendDlgItemMessage(_hSelf, IDC_EDIT_SESSIONFILEEXT, WM_GETTEXT, MAX_PATH, (LPARAM)sessionExt); + nppGUI._definedSessionExt = sessionExt; + return TRUE; + } + } + } + + switch (wParam) + { + case IDC_CHECK_DONTCHECKHISTORY: + nppGUI._checkHistoryFiles = !isCheckedOrNot(IDC_CHECK_DONTCHECKHISTORY); + return TRUE; + + case IDC_CHECK_FILEAUTODETECTION: + { + bool isChecked = isCheckedOrNot(IDC_CHECK_FILEAUTODETECTION); + if (!isChecked) + { + ::SendDlgItemMessage(_hSelf, IDC_CHECK_UPDATESILENTLY, BM_SETCHECK, BST_UNCHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_UPDATEGOTOEOF, BM_SETCHECK, BST_UNCHECKED, 0); + } + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_UPDATESILENTLY), isChecked); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_UPDATEGOTOEOF), isChecked); + + nppGUI._fileAutoDetection = isChecked?cdAutoUpdate:cdDisabled; + } + return TRUE; + + case IDC_CHECK_UPDATESILENTLY: + case IDC_CHECK_UPDATEGOTOEOF: + { + bool isSilent = isCheckedOrNot(IDC_CHECK_UPDATESILENTLY); + bool isGo2End = isCheckedOrNot(IDC_CHECK_UPDATEGOTOEOF); + + ChangeDetect cd; + + if (!isSilent && !isGo2End) + cd = cdEnabled; + else if (!isSilent && isGo2End) + cd = cdGo2end; + else if (isSilent && !isGo2End) + cd = cdAutoUpdate; + else //(isSilent && isGo2End) + cd = cdAutoUpdateGo2end; + + nppGUI._fileAutoDetection = cd; + } + return TRUE; + + case IDC_CHECK_CLICKABLELINK_ENABLE: + { + bool isChecked = isCheckedOrNot(IDC_CHECK_CLICKABLELINK_ENABLE); + if (!isChecked) + ::SendDlgItemMessage(_hSelf, IDC_CHECK_CLICKABLELINK_NOUNDERLINE, BM_SETCHECK, BST_UNCHECKED, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_CLICKABLELINK_NOUNDERLINE), isChecked); + + nppGUI._styleURL = isChecked?2:0; + } + return TRUE; + + case IDC_CHECK_CLICKABLELINK_NOUNDERLINE: + { + bool isChecked = isCheckedOrNot(IDC_CHECK_CLICKABLELINK_NOUNDERLINE); + nppGUI._styleURL = isChecked?1:2; + } + return TRUE; + + case IDC_CHECK_AUTOUPDATE: + nppGUI._neverUpdate = !isCheckedOrNot(wParam); + return TRUE; + + case IDC_CHECK_MIN2SYSTRAY: + nppGUI._isMinimizedToTray = isCheckedOrNot(wParam); + return TRUE; + + case IDC_CHECK_REMEMBERSESSION: + //::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_REMEMBER_LAST_SESSION, 0); + nppGUI._rememberLastSession = isCheckedOrNot(wParam); + return TRUE; + + case IDM_SETTING_HISTORY_SIZE: + { + ::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_HISTORY_SIZE, 0); + TCHAR nbStr[10]; + wsprintf(nbStr, TEXT("%d"), pNppParam->getNbMaxFile()); + ::SetWindowText(::GetDlgItem(_hSelf, IDC_MAXNBFILEVAL_STATIC), nbStr); + return TRUE; + } + + case IDC_CHECK_ENABLEDOCSWITCHER : + { + nppGUI._doTaskList = !nppGUI._doTaskList; + if (nppGUI._doTaskList) + { + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_STYLEMRU), TRUE); + } + else + { + nppGUI._styleMRU = false; + ::SendDlgItemMessage(_hSelf, IDC_CHECK_STYLEMRU, BM_SETCHECK, false, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_STYLEMRU), FALSE); + } + return TRUE; + } + + case IDC_CHECK_MAINTAININDENT : + { + nppGUI._maitainIndent = !nppGUI._maitainIndent; + return TRUE; + } + + case IDC_CHECK_ENABLSMARTHILITE : + { + nppGUI._enableSmartHilite = !nppGUI._enableSmartHilite; + if (!nppGUI._enableSmartHilite) + { + HWND grandParent = ::GetParent(_hParent); + ::SendMessage(grandParent, NPPM_INTERNAL_CLEARINDICATOR, 0, 0); + } + return TRUE; + } + case IDC_CHECK_ENABLTAGSMATCHHILITE: + { + nppGUI._enableTagsMatchHilite = !nppGUI._enableTagsMatchHilite; + if (!nppGUI._enableTagsMatchHilite) + { + HWND grandParent = ::GetParent(_hParent); + ::SendMessage(grandParent, NPPM_INTERNAL_CLEARINDICATORTAGMATCH, 0, 0); + } + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_ENABLTAGATTRHILITE), nppGUI._enableTagsMatchHilite); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_HIGHLITENONEHTMLZONE), nppGUI._enableTagsMatchHilite); + return TRUE; + } + case IDC_CHECK_ENABLTAGATTRHILITE: + { + nppGUI._enableTagAttrsHilite = !nppGUI._enableTagAttrsHilite; + if (!nppGUI._enableTagAttrsHilite) + { + HWND grandParent = ::GetParent(_hParent); + ::SendMessage(grandParent, NPPM_INTERNAL_CLEARINDICATORTAGATTR, 0, 0); + } + return TRUE; + } + + case IDC_CHECK_HIGHLITENONEHTMLZONE: + { + nppGUI._enableHiliteNonHTMLZone = !nppGUI._enableHiliteNonHTMLZone; + return TRUE; + } + + case IDC_CHECK_STYLEMRU : + { + nppGUI._styleMRU = !nppGUI._styleMRU; + return TRUE; + } + + case IDC_CHECK_SHORTTITLE: + { + nppGUI._shortTitlebar = !nppGUI._shortTitlebar; + HWND grandParent = ::GetParent(_hParent); + ::SendMessage(grandParent, NPPM_INTERNAL_UPDATETITLEBAR, 0, 0); + return TRUE; + } + } + } + } + return FALSE; +} + +BOOL CALLBACK DefaultNewDocDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + NppParameters *pNppParam = NppParameters::getInstance(); + NppGUI & nppGUI = (NppGUI & )pNppParam->getNppGUI(); + NewDocDefaultSettings & ndds = (NewDocDefaultSettings &)nppGUI.getNewDocDefaultSettings(); + + switch (Message) + { + case WM_INITDIALOG : + { + int ID2Check = 0; + + switch (ndds._format) + { + case MAC_FORMAT : + ID2Check = IDC_RADIO_F_MAC; + break; + case UNIX_FORMAT : + ID2Check = IDC_RADIO_F_UNIX; + break; + + default : //WIN_FORMAT + ID2Check = IDC_RADIO_F_WIN; + } + ::SendDlgItemMessage(_hSelf, ID2Check, BM_SETCHECK, BST_CHECKED, 0); + + switch (ndds._encoding) + { + case uni16BE : + ID2Check = IDC_RADIO_UCS2BIG; + break; + case uni16LE : + ID2Check = IDC_RADIO_UCS2SMALL; + break; + case uniUTF8 : + ID2Check = IDC_RADIO_UTF8; + break; + case uniCookie : + ID2Check = IDC_RADIO_UTF8SANSBOM; + break; + + default : //uni8Bit + ID2Check = IDC_RADIO_ANSI; + } + ::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_TXT ; i < pNppParam->L_END ; i++) + { + generic_string str; + if ((LangType)i != L_USER) + { + int cmdID = pNppParam->langTypeToCommandID((LangType)i); + if ((cmdID != -1)) + { + getNameStrFromCmd(cmdID, str); + if (str.length() > 0) + { + _langList.push_back(LangID_Name((LangType)i, str)); + ::SendDlgItemMessage(_hSelf, IDC_COMBO_DEFAULTLANG, CB_ADDSTRING, 0, (LPARAM)str.c_str()); + if (ndds._lang == i) + index = _langList.size() - 1; + } + } + } + } + ::SendDlgItemMessage(_hSelf, IDC_COMBO_DEFAULTLANG, CB_SETCURSEL, index, 0); + + bool shouldActivated; + switch (nppGUI._openSaveDir) + { + case dir_last : + ID2Check = IDC_OPENSAVEDIR_REMEMBERLAST_RADIO; + shouldActivated = false; + break; + case dir_userDef : + ID2Check = IDC_OPENSAVEDIR_ALWAYSON_RADIO; + shouldActivated = true; + break; + + default : + ID2Check = IDC_OPENSAVEDIR_FOLLOWCURRENT_RADIO; + shouldActivated = false; + } + ::SendDlgItemMessage(_hSelf, ID2Check, BM_SETCHECK, BST_CHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDC_OPENSAVEDIR_ALWAYSON_EDIT, WM_SETTEXT, 0, (LPARAM)nppGUI._defaultDir); + //::ExpandEnvironmentStrings(nppGUI._defaultDir, nppGUI._defaultDirExp, 500); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_OPENSAVEDIR_ALWAYSON_EDIT), shouldActivated); + ::EnableWindow(::GetDlgItem(_hSelf, IDD_OPENSAVEDIR_ALWAYSON_BROWSE_BUTTON), shouldActivated); + + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + } + + case WM_COMMAND : + { + if (HIWORD(wParam) == EN_CHANGE) + { + switch (LOWORD(wParam)) + { + case IDC_OPENSAVEDIR_ALWAYSON_EDIT: + { + TCHAR inputDir[MAX_PATH]; + ::SendDlgItemMessage(_hSelf, IDC_OPENSAVEDIR_ALWAYSON_EDIT, WM_GETTEXT, MAX_PATH, (LPARAM)inputDir); + lstrcpy(nppGUI._defaultDir, inputDir); + ::ExpandEnvironmentStrings(nppGUI._defaultDir, nppGUI._defaultDirExp, 500); + pNppParam->setWorkingDir(nppGUI._defaultDirExp); + return TRUE; + } + } + } + + switch (wParam) + { + case IDC_RADIO_UCS2BIG: + ndds._encoding = uni16BE; + ndds._openAnsiAsUtf8 = false; + makeOpenAnsiAsUtf8(false); + return TRUE; + case IDC_RADIO_UCS2SMALL: + ndds._encoding = uni16LE; + ndds._openAnsiAsUtf8 = false; + makeOpenAnsiAsUtf8(false); + return TRUE; + case IDC_RADIO_UTF8: + ndds._encoding = uniUTF8; + ndds._openAnsiAsUtf8 = false; + makeOpenAnsiAsUtf8(false); + return TRUE; + case IDC_RADIO_UTF8SANSBOM: + ndds._encoding = uniCookie; + makeOpenAnsiAsUtf8(true); + return TRUE; + case IDC_RADIO_ANSI: + ndds._encoding = uni8Bit; + ndds._openAnsiAsUtf8 = false; + makeOpenAnsiAsUtf8(false); + return TRUE; + + case IDC_CHECK_OPENANSIASUTF8 : + ndds._openAnsiAsUtf8 = (BST_CHECKED == ::SendMessage(::GetDlgItem(_hSelf, IDC_CHECK_OPENANSIASUTF8), BM_GETCHECK, 0, 0)); + return TRUE; + + + case IDC_RADIO_F_MAC: + ndds._format = MAC_FORMAT; + return TRUE; + case IDC_RADIO_F_UNIX: + ndds._format = UNIX_FORMAT; + return TRUE; + case IDC_RADIO_F_WIN: + ndds._format = WIN_FORMAT; + return TRUE; + + + + + case IDC_OPENSAVEDIR_FOLLOWCURRENT_RADIO: + nppGUI._openSaveDir = dir_followCurrent; + ::EnableWindow(::GetDlgItem(_hSelf, IDC_OPENSAVEDIR_ALWAYSON_EDIT), false); + ::EnableWindow(::GetDlgItem(_hSelf, IDD_OPENSAVEDIR_ALWAYSON_BROWSE_BUTTON), false); + return TRUE; + case IDC_OPENSAVEDIR_REMEMBERLAST_RADIO: + nppGUI._openSaveDir = dir_last; + ::EnableWindow(::GetDlgItem(_hSelf, IDC_OPENSAVEDIR_ALWAYSON_EDIT), false); + ::EnableWindow(::GetDlgItem(_hSelf, IDD_OPENSAVEDIR_ALWAYSON_BROWSE_BUTTON), false); + return TRUE; + case IDC_OPENSAVEDIR_ALWAYSON_RADIO: + nppGUI._openSaveDir = dir_userDef; + ::EnableWindow(::GetDlgItem(_hSelf, IDC_OPENSAVEDIR_ALWAYSON_EDIT), true); + ::EnableWindow(::GetDlgItem(_hSelf, IDD_OPENSAVEDIR_ALWAYSON_BROWSE_BUTTON), true); + return TRUE; + + case IDD_OPENSAVEDIR_ALWAYSON_BROWSE_BUTTON : + folderBrowser(_hSelf, IDC_OPENSAVEDIR_ALWAYSON_EDIT); + return TRUE; + + default: + if ((HIWORD(wParam) == CBN_SELCHANGE) && (LOWORD(wParam) == IDC_COMBO_DEFAULTLANG)) + { + int index = ::SendDlgItemMessage(_hSelf, IDC_COMBO_DEFAULTLANG, CB_GETCURSEL, 0, 0); + ndds._lang = _langList[index]._id; + return TRUE; + } + return FALSE; + } + } + } + return FALSE; +} + +BOOL CALLBACK LangMenuDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + NppParameters *pNppParam = NppParameters::getInstance(); + NppGUI & nppGUI = (NppGUI & )pNppParam->getNppGUI(); + + switch (Message) + { + case WM_INITDIALOG : + { + for (int i = L_TXT ; i < pNppParam->L_END ; i++) + { + generic_string str; + if ((LangType)i != L_USER) + { + int cmdID = pNppParam->langTypeToCommandID((LangType)i); + if ((cmdID != -1)) + { + getNameStrFromCmd(cmdID, str); + if (str.length() > 0) + { + _langList.push_back(LangMenuItem((LangType)i, cmdID, str)); + ::SendDlgItemMessage(_hSelf, IDC_LIST_ENABLEDLANG, LB_ADDSTRING, 0, (LPARAM)str.c_str()); + } + } + } + } + + for (size_t i = 0 ; i < nppGUI._excludedLangList.size() ; i++) + { + ::SendDlgItemMessage(_hSelf, IDC_LIST_DISABLEDLANG, LB_ADDSTRING, 0, (LPARAM)nppGUI._excludedLangList[i]._langName.c_str()); + } + + ::SendDlgItemMessage(_hSelf, IDC_CHECK_LANGMENUCOMPACT, BM_SETCHECK, nppGUI._isLangMenuCompact?BST_CHECKED:BST_UNCHECKED, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_BUTTON_REMOVE), FALSE); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_BUTTON_RESTORE), FALSE); + + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + + return TRUE; + } + case WM_COMMAND : + { + switch (LOWORD(wParam)) + { + case IDC_LIST_DISABLEDLANG : + case IDC_LIST_ENABLEDLANG : + { + HWND hEnableList = ::GetDlgItem(_hSelf, IDC_LIST_ENABLEDLANG); + HWND hDisableList = ::GetDlgItem(_hSelf, IDC_LIST_DISABLEDLANG); + if (HIWORD(wParam) == LBN_DBLCLK) + { + if (HWND(lParam) == hEnableList) + ::SendMessage(_hSelf, WM_COMMAND, IDC_BUTTON_REMOVE, 0); + else if (HWND(lParam) == hDisableList) + ::SendMessage(_hSelf, WM_COMMAND, IDC_BUTTON_RESTORE, 0); + return TRUE; + } + int idButton2Enable; + int idButton2Disable; + + if (LOWORD(wParam) == IDC_LIST_ENABLEDLANG) + { + idButton2Enable = IDC_BUTTON_REMOVE; + idButton2Disable = IDC_BUTTON_RESTORE; + } + else //IDC_LIST_DISABLEDLANG + { + idButton2Enable = IDC_BUTTON_RESTORE; + idButton2Disable = IDC_BUTTON_REMOVE; + } + + int i = ::SendDlgItemMessage(_hSelf, LOWORD(wParam), LB_GETCURSEL, 0, 0); + if (i != LB_ERR) + { + ::EnableWindow(::GetDlgItem(_hSelf, idButton2Enable), TRUE); + int idListbox2Disable = (LOWORD(wParam)== IDC_LIST_ENABLEDLANG)?IDC_LIST_DISABLEDLANG:IDC_LIST_ENABLEDLANG; + ::SendDlgItemMessage(_hSelf, idListbox2Disable, LB_SETCURSEL, (WPARAM)-1, 0); + ::EnableWindow(::GetDlgItem(_hSelf, idButton2Disable), FALSE); + } + return TRUE; + } + + case IDC_CHECK_LANGMENUCOMPACT : + { + nppGUI._isLangMenuCompact = (BST_CHECKED == ::SendMessage(::GetDlgItem(_hSelf, IDC_CHECK_LANGMENUCOMPACT), BM_GETCHECK, 0, 0)); + ::MessageBox(_hSelf, + nppGUI._isLangMenuCompact?TEXT("This option will be enable on the next launch."):TEXT("This option will be disable on the next launch."), + TEXT("Compact Language Menu"), MB_OK); + return TRUE; + } + + case IDC_BUTTON_RESTORE : + case IDC_BUTTON_REMOVE : + { + int list2Remove, list2Add, idButton2Enable, idButton2Disable; + vector *pSrcLst, *pDestLst; + + if (LOWORD(wParam)==IDC_BUTTON_REMOVE) + { + list2Remove = IDC_LIST_ENABLEDLANG; + list2Add = IDC_LIST_DISABLEDLANG; + idButton2Enable = IDC_BUTTON_RESTORE; + idButton2Disable = IDC_BUTTON_REMOVE; + pSrcLst = &_langList; + pDestLst = &nppGUI._excludedLangList; + } + else + { + list2Remove = IDC_LIST_DISABLEDLANG; + list2Add = IDC_LIST_ENABLEDLANG; + idButton2Enable = IDC_BUTTON_REMOVE; + idButton2Disable = IDC_BUTTON_RESTORE; + pSrcLst = &nppGUI._excludedLangList; + pDestLst = &_langList; + } + size_t iRemove = ::SendDlgItemMessage(_hSelf, list2Remove, LB_GETCURSEL, 0, 0); + if (iRemove == -1) + return TRUE; + + TCHAR s[32]; + ::SendDlgItemMessage(_hSelf, list2Remove, LB_GETTEXT, iRemove, (LPARAM)s); + + LangMenuItem lmi = pSrcLst->at(iRemove); + vector::iterator lang2Remove = pSrcLst->begin() + iRemove; + pSrcLst->erase(lang2Remove); + + int iAdd = ::SendDlgItemMessage(_hSelf, list2Add, LB_ADDSTRING, 0, (LPARAM)s); + ::SendDlgItemMessage(_hSelf, list2Remove, LB_DELETESTRING, iRemove, 0); + pDestLst->push_back(lmi); + + ::SendDlgItemMessage(_hSelf, list2Add, LB_SETCURSEL, iAdd, 0); + ::SendDlgItemMessage(_hSelf, list2Remove, LB_SETCURSEL, -1, 0); + ::EnableWindow(::GetDlgItem(_hSelf, idButton2Enable), TRUE); + ::EnableWindow(::GetDlgItem(_hSelf, idButton2Disable), FALSE); + + if ((lmi._langType >= L_EXTERNAL) && (lmi._langType < pNppParam->L_END)) + { + bool found(false); + for(size_t x = 0; x < pNppParam->getExternalLexerDoc()->size() && !found; x++) + { + TiXmlNode *lexersRoot = pNppParam->getExternalLexerDoc()->at(x)->FirstChild(TEXT("NotepadPlus"))->FirstChildElement(TEXT("LexerStyles")); + for (TiXmlNode *childNode = lexersRoot->FirstChildElement(TEXT("LexerType")); + childNode ; + childNode = childNode->NextSibling(TEXT("LexerType"))) + { + TiXmlElement *element = childNode->ToElement(); + + if (generic_string(element->Attribute(TEXT("name"))) == lmi._langName) + { + element->SetAttribute(TEXT("excluded"), (LOWORD(wParam)==IDC_BUTTON_REMOVE)?TEXT("yes"):TEXT("no")); + pNppParam->getExternalLexerDoc()->at(x)->SaveFile(); + found = true; + break; + } + } + } + } + + HWND grandParent = ::GetParent(_hParent); + + if (LOWORD(wParam)==IDC_BUTTON_REMOVE) + { + ::DeleteMenu((HMENU)::SendMessage(grandParent, NPPM_INTERNAL_GETMENU, 0, 0), lmi._cmdID, MF_BYCOMMAND); + } + else + { + ::InsertMenu(::GetSubMenu((HMENU)::SendMessage(grandParent, NPPM_INTERNAL_GETMENU, 0, 0), MENUINDEX_LANGUAGE), iAdd-1, MF_BYPOSITION, lmi._cmdID, lmi._langName.c_str()); + } + ::DrawMenuBar(grandParent); + return TRUE; + } + } + } + } + return FALSE; +} + +BOOL CALLBACK PrintSettingsDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + NppParameters *pNppParam = NppParameters::getInstance(); + NppGUI & nppGUI = (NppGUI & )pNppParam->getNppGUI(); + + switch (Message) + { + case WM_INITDIALOG : + { + bool printLN = nppGUI._printSettings._printLineNumber; + ::SendDlgItemMessage(_hSelf, IDC_CHECK_PRINTLINENUM, BM_SETCHECK, printLN, 0); + + int ID2Check = 0; + switch (nppGUI._printSettings._printOption) + { + case SC_PRINT_NORMAL : + ID2Check = IDC_RADIO_WYSIWYG; + break; + case SC_PRINT_INVERTLIGHT : + ID2Check = IDC_RADIO_INVERT; + break; + case SC_PRINT_BLACKONWHITE : + ID2Check = IDC_RADIO_BW; + break; + case SC_PRINT_COLOURONWHITE : + ID2Check = IDC_RADIO_NOBG; + break; + } + ::SendDlgItemMessage(_hSelf, ID2Check, BM_SETCHECK, BST_CHECKED, 0); + + TCHAR valStrL[10]; + wsprintf(valStrL, TEXT("%d"), nppGUI._printSettings._marge.left); + + TCHAR valStrR[10]; + wsprintf(valStrR, TEXT("%d"), nppGUI._printSettings._marge.right); + + TCHAR valStrT[10]; + wsprintf(valStrT, TEXT("%d"), nppGUI._printSettings._marge.top); + + TCHAR valStrB[10]; + wsprintf(valStrB, TEXT("%d"), nppGUI._printSettings._marge.bottom); + + ::SendDlgItemMessage(_hSelf, IDC_EDIT_ML, WM_SETTEXT, 0, (LPARAM)valStrL); + ::SendDlgItemMessage(_hSelf, IDC_EDIT_MR, WM_SETTEXT, 0, (LPARAM)valStrR); + ::SendDlgItemMessage(_hSelf, IDC_EDIT_MT, WM_SETTEXT, 0, (LPARAM)valStrT); + ::SendDlgItemMessage(_hSelf, IDC_EDIT_MB, WM_SETTEXT, 0, (LPARAM)valStrB); + + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + break; + } + case WM_COMMAND : + { + if (HIWORD(wParam) == EN_CHANGE) + { + switch (LOWORD(wParam)) + { + case IDC_EDIT_ML: + nppGUI._printSettings._marge.left = ::GetDlgItemInt(_hSelf, IDC_EDIT_ML, NULL, FALSE); + return TRUE; + + case IDC_EDIT_MR: + nppGUI._printSettings._marge.right = ::GetDlgItemInt(_hSelf, IDC_EDIT_MR, NULL, FALSE); + return TRUE; + + case IDC_EDIT_MT : + nppGUI._printSettings._marge.top = ::GetDlgItemInt(_hSelf, IDC_EDIT_MT, NULL, FALSE); + return TRUE; + + case IDC_EDIT_MB : + nppGUI._printSettings._marge.bottom = ::GetDlgItemInt(_hSelf, IDC_EDIT_MB, NULL, FALSE); + return TRUE; + + default : + return FALSE; + } + } + + switch (wParam) + { + case IDC_CHECK_PRINTLINENUM: + nppGUI._printSettings._printLineNumber = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_CHECK_PRINTLINENUM, BM_GETCHECK, 0, 0)); + break; + + case IDC_RADIO_WYSIWYG: + nppGUI._printSettings._printOption = SC_PRINT_NORMAL; + break; + + case IDC_RADIO_INVERT: + nppGUI._printSettings._printOption = SC_PRINT_INVERTLIGHT; + break; + + case IDC_RADIO_BW : + nppGUI._printSettings._printOption = SC_PRINT_BLACKONWHITE; + break; + + case IDC_RADIO_NOBG : + nppGUI._printSettings._printOption = SC_PRINT_COLOURONWHITE; + break; + } + return TRUE; + } + } + return FALSE; +} + +void trim(generic_string & str) +{ + generic_string::size_type pos = str.find_last_not_of(' '); + + if (pos != generic_string::npos) + { + str.erase(pos + 1); + pos = str.find_first_not_of(' '); + if(pos != generic_string::npos) str.erase(0, pos); + } + else str.erase(str.begin(), str.end()); +}; + +BOOL CALLBACK PrintSettings2Dlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + NppParameters *pNppParam = NppParameters::getInstance(); + NppGUI & nppGUI = (NppGUI & )pNppParam->getNppGUI(); + + switch (Message) + { + case WM_INITDIALOG : + { + ::SendDlgItemMessage(_hSelf, IDC_EDIT_HLEFT, WM_SETTEXT, 0, (LPARAM)nppGUI._printSettings._headerLeft.c_str()); + ::SendDlgItemMessage(_hSelf, IDC_EDIT_HMIDDLE, WM_SETTEXT, 0, (LPARAM)nppGUI._printSettings._headerMiddle.c_str()); + ::SendDlgItemMessage(_hSelf, IDC_EDIT_HRIGHT, WM_SETTEXT, 0, (LPARAM)nppGUI._printSettings._headerRight.c_str()); + ::SendDlgItemMessage(_hSelf, IDC_EDIT_FLEFT, WM_SETTEXT, 0, (LPARAM)nppGUI._printSettings._footerLeft.c_str()); + ::SendDlgItemMessage(_hSelf, IDC_EDIT_FMIDDLE, WM_SETTEXT, 0, (LPARAM)nppGUI._printSettings._footerMiddle.c_str()); + ::SendDlgItemMessage(_hSelf, IDC_EDIT_FRIGHT, WM_SETTEXT, 0, (LPARAM)nppGUI._printSettings._footerRight.c_str()); + + TCHAR intStr[5]; + for(size_t i = 6 ; i < 15 ; i++) + { + wsprintf(intStr, TEXT("%d"), i); + ::SendDlgItemMessage(_hSelf, IDC_COMBO_HFONTSIZE, CB_ADDSTRING, 0, (LPARAM)intStr); + ::SendDlgItemMessage(_hSelf, IDC_COMBO_FFONTSIZE, CB_ADDSTRING, 0, (LPARAM)intStr); + } + const std::vector & fontlist = pNppParam->getFontList(); + for (size_t i = 0 ; i < fontlist.size() ; i++) + { + int j = ::SendDlgItemMessage(_hSelf, IDC_COMBO_HFONTNAME, CB_ADDSTRING, 0, (LPARAM)fontlist[i].c_str()); + ::SendDlgItemMessage(_hSelf, IDC_COMBO_FFONTNAME, CB_ADDSTRING, 0, (LPARAM)fontlist[i].c_str()); + + ::SendDlgItemMessage(_hSelf, IDC_COMBO_HFONTNAME, CB_SETITEMDATA, j, (LPARAM)fontlist[i].c_str()); + ::SendDlgItemMessage(_hSelf, IDC_COMBO_FFONTNAME, CB_SETITEMDATA, j, (LPARAM)fontlist[i].c_str()); + } + + int index = ::SendDlgItemMessage(_hSelf, IDC_COMBO_HFONTNAME, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)nppGUI._printSettings._headerFontName.c_str()); + if (index == CB_ERR) + index = 0; + ::SendDlgItemMessage(_hSelf, IDC_COMBO_HFONTNAME, CB_SETCURSEL, index, 0); + index = ::SendDlgItemMessage(_hSelf, IDC_COMBO_FFONTNAME, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)nppGUI._printSettings._footerFontName.c_str()); + if (index == CB_ERR) + index = 0; + ::SendDlgItemMessage(_hSelf, IDC_COMBO_FFONTNAME, CB_SETCURSEL, index, 0); + + wsprintf(intStr, TEXT("%d"), nppGUI._printSettings._headerFontSize); + ::SendDlgItemMessage(_hSelf, IDC_COMBO_HFONTSIZE, CB_SELECTSTRING, -1, (LPARAM)intStr); + wsprintf(intStr, TEXT("%d"), nppGUI._printSettings._footerFontSize); + ::SendDlgItemMessage(_hSelf, IDC_COMBO_FFONTSIZE, CB_SELECTSTRING, -1, (LPARAM)intStr); + + ::SendDlgItemMessage(_hSelf, IDC_CHECK_HBOLD, BM_SETCHECK, nppGUI._printSettings._headerFontStyle & FONTSTYLE_BOLD?TRUE:FALSE, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_HITALIC, BM_SETCHECK, nppGUI._printSettings._headerFontStyle & FONTSTYLE_ITALIC?TRUE:FALSE, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_FBOLD, BM_SETCHECK, nppGUI._printSettings._footerFontStyle & FONTSTYLE_BOLD?TRUE:FALSE, 0); + ::SendDlgItemMessage(_hSelf, IDC_CHECK_FITALIC, BM_SETCHECK, nppGUI._printSettings._footerFontStyle & FONTSTYLE_ITALIC?TRUE:FALSE, 0); + + varList.push_back(strCouple(TEXT("Full file name path"), TEXT("$(FULL_CURRENT_PATH)"))); + varList.push_back(strCouple(TEXT("File name"), TEXT("$(FILE_NAME)"))); + varList.push_back(strCouple(TEXT("File directory"), TEXT("$(FULL_CURRENT_PATH)"))); + varList.push_back(strCouple(TEXT("Page"), TEXT("$(CURRENT_PRINTING_PAGE)"))); + varList.push_back(strCouple(TEXT("Short date format"), TEXT("$(SHORT_DATE)"))); + varList.push_back(strCouple(TEXT("Long date format"), TEXT("$(LONG_DATE)"))); + varList.push_back(strCouple(TEXT("Time"), TEXT("$(TIME)"))); + + for (size_t i = 0 ; i < varList.size() ; i++) + { + int j = ::SendDlgItemMessage(_hSelf, IDC_COMBO_VARLIST, CB_ADDSTRING, 0, (LPARAM)varList[i]._varDesc.c_str()); + ::SendDlgItemMessage(_hSelf, IDC_COMBO_VARLIST, CB_SETITEMDATA, j, (LPARAM)varList[i]._var.c_str()); + } + ::SendDlgItemMessage(_hSelf, IDC_COMBO_VARLIST, CB_SETCURSEL, 0, 0); + + //_colourHooker.setColour(RGB(0, 0, 0xFF)); + //_colourHooker.hookOn(::GetDlgItem(_hSelf, IDC_VIEWPANEL_STATIC)); + ETDTProc enableDlgTheme = (ETDTProc)pNppParam->getEnableThemeDlgTexture(); + if (enableDlgTheme) + enableDlgTheme(_hSelf, ETDT_ENABLETAB); + + return TRUE; + } + case WM_COMMAND : + { + if (HIWORD(wParam) == EN_CHANGE) + { + const int stringSize = 256; + TCHAR str[stringSize]; + _focusedEditCtrl = LOWORD(wParam); + ::GetDlgItemText(_hSelf, _focusedEditCtrl, str, stringSize); + ::SendDlgItemMessage(_hSelf, IDC_VIEWPANEL_STATIC, WM_SETTEXT, 0, (LPARAM)str); + + switch (LOWORD(wParam)) + { + case IDC_EDIT_HLEFT: + nppGUI._printSettings._headerLeft = str; + trim(nppGUI._printSettings._headerLeft); + return TRUE; + + case IDC_EDIT_HMIDDLE: + nppGUI._printSettings._headerMiddle = str; + trim(nppGUI._printSettings._headerMiddle); + return TRUE; + + case IDC_EDIT_HRIGHT : + nppGUI._printSettings._headerRight = str; + trim(nppGUI._printSettings._headerRight); + return TRUE; + + case IDC_EDIT_FLEFT: + nppGUI._printSettings._footerLeft = str; + trim(nppGUI._printSettings._footerLeft); + return TRUE; + + case IDC_EDIT_FMIDDLE: + nppGUI._printSettings._footerMiddle = str; + trim(nppGUI._printSettings._footerMiddle); + return TRUE; + + case IDC_EDIT_FRIGHT : + nppGUI._printSettings._footerRight = str; + trim(nppGUI._printSettings._footerRight); + return TRUE; + + default : + return FALSE; + } + } + else if (HIWORD(wParam) == EN_SETFOCUS) + { + const int stringSize = 256; + TCHAR str[stringSize]; + _focusedEditCtrl = LOWORD(wParam); + ::GetDlgItemText(_hSelf, _focusedEditCtrl, str, stringSize); + //_colourHooker.setColour(RGB(0, 0, 0xFF)); + ::SendDlgItemMessage(_hSelf, IDC_VIEWPANEL_STATIC, WM_SETTEXT, 0, (LPARAM)str); + + int focusedEditStatic; + int groupStatic; + switch (_focusedEditCtrl) + { + case IDC_EDIT_HLEFT : focusedEditStatic = IDC_HL_STATIC; groupStatic = IDC_HGB_STATIC; break; + case IDC_EDIT_HMIDDLE : focusedEditStatic = IDC_HM_STATIC; groupStatic = IDC_HGB_STATIC; break; + case IDC_EDIT_HRIGHT : focusedEditStatic = IDC_HR_STATIC; groupStatic = IDC_HGB_STATIC; break; + case IDC_EDIT_FLEFT : focusedEditStatic = IDC_FL_STATIC; groupStatic = IDC_FGB_STATIC; break; + case IDC_EDIT_FMIDDLE : focusedEditStatic = IDC_FM_STATIC; groupStatic = IDC_FGB_STATIC; break; + case IDC_EDIT_FRIGHT : focusedEditStatic = IDC_FR_STATIC; groupStatic = IDC_FGB_STATIC; break; + } + + ::GetDlgItemText(_hSelf, groupStatic, str, stringSize); + generic_string title = str; + title += TEXT(" "); + ::GetDlgItemText(_hSelf, focusedEditStatic, str, stringSize); + title += str; + title += TEXT(" : "); + + ::SendDlgItemMessage(_hSelf, IDC_WHICHPART_STATIC, WM_SETTEXT, 0, (LPARAM)title.c_str()); + return TRUE; + } + else if (HIWORD(wParam) == CBN_SELCHANGE) + { + int iSel = ::SendDlgItemMessage(_hSelf, LOWORD(wParam), CB_GETCURSEL, 0, 0); + + switch (LOWORD(wParam)) + { + case IDC_COMBO_HFONTNAME : + case IDC_COMBO_FFONTNAME : + { + TCHAR *fnStr = (TCHAR *)::SendDlgItemMessage(_hSelf, LOWORD(wParam), CB_GETITEMDATA, iSel, 0); + if (LOWORD(wParam) == IDC_COMBO_HFONTNAME) + nppGUI._printSettings._headerFontName = fnStr; + else + nppGUI._printSettings._footerFontName = fnStr; + } + break; + + + case IDC_COMBO_HFONTSIZE : + case IDC_COMBO_FFONTSIZE : + { + TCHAR intStr[5]; + ::SendDlgItemMessage(_hSelf, LOWORD(wParam), CB_GETLBTEXT, iSel, (LPARAM)intStr); + + int *pVal = (LOWORD(wParam) == IDC_COMBO_HFONTSIZE)?&(nppGUI._printSettings._headerFontSize):&(nppGUI._printSettings._footerFontSize); + + if ((!intStr) || (!intStr[0])) + *pVal = 0; + else + *pVal = generic_strtol(intStr, NULL, 10); + } + break; + + case IDC_COMBO_VARLIST : + { + } + break; + } + return TRUE; + + } + + switch (wParam) + { + case IDC_CHECK_HBOLD: + nppGUI._printSettings._headerFontStyle ^= FONTSTYLE_BOLD; + break; + + case IDC_CHECK_HITALIC: + nppGUI._printSettings._headerFontStyle ^= FONTSTYLE_ITALIC; + break; + + case IDC_CHECK_FBOLD: + nppGUI._printSettings._footerFontStyle ^= FONTSTYLE_BOLD; + break; + + case IDC_CHECK_FITALIC: + nppGUI._printSettings._footerFontStyle ^= FONTSTYLE_ITALIC; + break; + + case IDC_BUTTON_ADDVAR: + { + if (!_focusedEditCtrl) + return TRUE; + + int iSel = ::SendDlgItemMessage(_hSelf, IDC_COMBO_VARLIST, CB_GETCURSEL, 0, 0); + TCHAR *varStr = (TCHAR *)::SendDlgItemMessage(_hSelf, IDC_COMBO_VARLIST, CB_GETITEMDATA, iSel, 0); + + ::SendDlgItemMessage(_hSelf, _focusedEditCtrl, EM_GETSEL, (WPARAM)&_selStart, (LPARAM)&_selEnd); +/* + TCHAR toto[32]; + wsprintf(toto, TEXT("_selStart = %d\r_selEnd = %d"), _selStart, _selEnd); + ::MessageBox(NULL, toto, TEXT(""), MB_OK); +*/ + const int stringSize = 256; + TCHAR str[stringSize]; + ::SendDlgItemMessage(_hSelf, _focusedEditCtrl, WM_GETTEXT, stringSize, (LPARAM)str); + //::MessageBox(NULL, str, TEXT(""), MB_OK); + + generic_string str2Set(str); + str2Set.replace(_selStart, _selEnd - _selStart, varStr); + + ::SetDlgItemText(_hSelf, _focusedEditCtrl, str2Set.c_str()); + } + break; + + } + return TRUE; + } + } + return FALSE; +} + +BOOL CALLBACK BackupDlg::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + NppParameters *pNppParam = NppParameters::getInstance(); + NppGUI & nppGUI = (NppGUI &)pNppParam->getNppGUI(); + switch (Message) + { + case WM_INITDIALOG : + { + TCHAR nbStr[10]; + wsprintf(nbStr, TEXT("%d"), nppGUI._autocFromLen); + HWND hNbChar_val = ::GetDlgItem(_hSelf, IDD_AUTOC_STATIC_N); + ::SetWindowText(hNbChar_val, nbStr); + + _nbCharVal.init(_hInst, _hSelf); + _nbCharVal.create(hNbChar_val, IDM_SETTING_AUTOCNBCHAR); + + int ID2Check = 0; + + switch (nppGUI._backup) + { + case bak_simple : + ID2Check = IDC_RADIO_BKSIMPLE; + break; + case bak_verbose : + ID2Check = IDC_RADIO_BKVERBOSE; + break; + + default : //bak_none + ID2Check = IDC_RADIO_BKNONE; + } + ::SendDlgItemMessage(_hSelf, ID2Check, BM_SETCHECK, BST_CHECKED, 0); + + if (nppGUI._useDir) + ::SendDlgItemMessage(_hSelf, IDC_BACKUPDIR_CHECK, BM_SETCHECK, BST_CHECKED, 0); + + ::SendDlgItemMessage(_hSelf, IDC_BACKUPDIR_EDIT, WM_SETTEXT, 0, (LPARAM)nppGUI._backupDir); + + bool isEnableAutoC = nppGUI._autocStatus != nppGUI.autoc_none; + + ::SendDlgItemMessage(_hSelf, IDD_AUTOC_ENABLECHECK, BM_SETCHECK, isEnableAutoC?BST_CHECKED:BST_UNCHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDD_AUTOC_FUNCRADIO, BM_SETCHECK, nppGUI._autocStatus == nppGUI.autoc_func?BST_CHECKED:BST_UNCHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDD_AUTOC_WORDRADIO, BM_SETCHECK, nppGUI._autocStatus == nppGUI.autoc_word?BST_CHECKED:BST_UNCHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDD_FUNC_CHECK, BM_SETCHECK, nppGUI._funcParams?BST_CHECKED:BST_UNCHECKED, 0); + if (!isEnableAutoC) + { + ::EnableWindow(::GetDlgItem(_hSelf, IDD_AUTOC_FUNCRADIO), FALSE); + ::EnableWindow(::GetDlgItem(_hSelf, IDD_AUTOC_WORDRADIO), FALSE); + ::EnableWindow(::GetDlgItem(_hSelf, IDD_AUTOC_STATIC_FROM), FALSE); + ::EnableWindow(::GetDlgItem(_hSelf, IDD_AUTOC_STATIC_N), FALSE); + ::EnableWindow(::GetDlgItem(_hSelf, IDD_AUTOC_STATIC_CHAR), FALSE); + ::EnableWindow(::GetDlgItem(_hSelf, IDD_AUTOC_STATIC_NOTE), FALSE); + } + updateBackupGUI(); + return TRUE; + } + case WM_COMMAND : + { + if (HIWORD(wParam) == EN_CHANGE) + { + switch (LOWORD(wParam)) + { + case IDC_BACKUPDIR_EDIT: + { + TCHAR inputDir[MAX_PATH]; + ::SendDlgItemMessage(_hSelf, IDC_BACKUPDIR_EDIT, WM_GETTEXT, MAX_PATH, (LPARAM)inputDir); + lstrcpy(nppGUI._backupDir, inputDir); + return TRUE; + } + } + } + + switch (wParam) + { + case IDC_RADIO_BKSIMPLE: + { + nppGUI._backup = bak_simple; + updateBackupGUI(); + return TRUE; + } + + case IDC_RADIO_BKVERBOSE: + { + nppGUI._backup = bak_verbose; + updateBackupGUI(); + return TRUE; + } + + case IDC_RADIO_BKNONE: + { + nppGUI._backup = bak_none; + updateBackupGUI(); + return TRUE; + } + + case IDC_BACKUPDIR_CHECK: + { + nppGUI._useDir = !nppGUI._useDir; + updateBackupGUI(); + return TRUE; + } + case IDD_BACKUPDIR_BROWSE_BUTTON : + { + folderBrowser(_hSelf, IDC_BACKUPDIR_EDIT); + return TRUE; + } + + case IDD_AUTOC_ENABLECHECK : + { + bool isEnableAutoC = BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDD_AUTOC_ENABLECHECK, BM_GETCHECK, 0, 0); + + if (isEnableAutoC) + { + ::SendDlgItemMessage(_hSelf, IDD_AUTOC_FUNCRADIO, BM_SETCHECK, BST_CHECKED, 0); + nppGUI._autocStatus = nppGUI.autoc_func; + } + else + { + ::SendDlgItemMessage(_hSelf, IDD_AUTOC_FUNCRADIO, BM_SETCHECK, BST_UNCHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDD_AUTOC_WORDRADIO, BM_SETCHECK, BST_UNCHECKED, 0); + nppGUI._autocStatus = nppGUI.autoc_none; + } + ::EnableWindow(::GetDlgItem(_hSelf, IDD_AUTOC_FUNCRADIO), isEnableAutoC); + ::EnableWindow(::GetDlgItem(_hSelf, IDD_AUTOC_WORDRADIO), isEnableAutoC); + ::EnableWindow(::GetDlgItem(_hSelf, IDD_AUTOC_STATIC_FROM), isEnableAutoC); + ::EnableWindow(::GetDlgItem(_hSelf, IDD_AUTOC_STATIC_N), isEnableAutoC); + ::EnableWindow(::GetDlgItem(_hSelf, IDD_AUTOC_STATIC_CHAR), isEnableAutoC); + ::EnableWindow(::GetDlgItem(_hSelf, IDD_AUTOC_STATIC_NOTE), isEnableAutoC); + return TRUE; + } + + case IDD_AUTOC_FUNCRADIO : + { + nppGUI._autocStatus = nppGUI.autoc_func; + return TRUE; + } + + case IDD_AUTOC_WORDRADIO : + { + nppGUI._autocStatus = nppGUI.autoc_word; + return TRUE; + } + case IDD_FUNC_CHECK : + { + nppGUI._funcParams = (BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDD_FUNC_CHECK, BM_GETCHECK, 0, 0)); + return TRUE; + } + + case IDM_SETTING_AUTOCNBCHAR : + { + ::SendMessage(_hParent, WM_COMMAND, IDM_SETTING_AUTOCNBCHAR, 0); + TCHAR nbStr[10]; + wsprintf(nbStr, TEXT("%d"), pNppParam->getNppGUI()._autocFromLen); + ::SetWindowText(::GetDlgItem(_hSelf, IDD_AUTOC_STATIC_N), nbStr); + return TRUE; + } + + default : + return FALSE; + } + + } + } + return FALSE; +} + +void BackupDlg::updateBackupGUI() +{ + bool noBackup = BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_RADIO_BKNONE, BM_GETCHECK, 0, 0); + bool isEnableGlobableCheck = false; + bool isEnableLocalCheck = false; + + if (!noBackup) + { + isEnableGlobableCheck = true; + isEnableLocalCheck = BST_CHECKED == ::SendDlgItemMessage(_hSelf, IDC_BACKUPDIR_CHECK, BM_GETCHECK, 0, 0); + } + ::EnableWindow(::GetDlgItem(_hSelf, IDC_BACKUPDIR_USERCUSTOMDIR_GRPSTATIC), isEnableGlobableCheck); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_BACKUPDIR_CHECK), isEnableGlobableCheck); + + ::EnableWindow(::GetDlgItem(_hSelf, IDD_BACKUPDIR_STATIC), isEnableLocalCheck); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_BACKUPDIR_EDIT), isEnableLocalCheck); + ::EnableWindow(::GetDlgItem(_hSelf, IDD_BACKUPDIR_BROWSE_BUTTON), isEnableLocalCheck); +} diff --git a/PowerEditor/src/WinControls/Preference/preferenceDlg.h b/PowerEditor/src/WinControls/Preference/preferenceDlg.h new file mode 100644 index 00000000..09c83268 --- /dev/null +++ b/PowerEditor/src/WinControls/Preference/preferenceDlg.h @@ -0,0 +1,187 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#ifndef PREFERENCE_DLG_H +#define PREFERENCE_DLG_H + +#include "Window.h" +#include "StaticDialog.h" +#include "ControlsTab.h" +#include "preference_rc.h" +#include "URLCtrl.h" +#include "Parameters.h" +#include "regExtDlg.h" +#include "WordStyleDlg.h" + +class SettingsDlg : public StaticDialog +{ +public : + SettingsDlg() {}; + virtual void destroy() { + _nbHistoryVal.destroy(); + }; +private : + URLCtrl _nbHistoryVal; + bool isCheckedOrNot(int checkControlID) const { + return (BST_CHECKED == ::SendMessage(::GetDlgItem(_hSelf, checkControlID), BM_GETCHECK, 0, 0)); + }; + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); +}; + +class BarsDlg : public StaticDialog +{ +public : + BarsDlg() {}; +private : + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); +}; + +class MarginsDlg : public StaticDialog +{ +public : + MarginsDlg() {}; + virtual void destroy() { + _tabSizeVal.destroy(); + _verticalEdgeLineNbColVal.destroy(); + }; + +private : + URLCtrl _tabSizeVal; + URLCtrl _verticalEdgeLineNbColVal; + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); + void changePanelTo(int index); +}; + +struct LangID_Name +{ + LangType _id; + generic_string _name; + LangID_Name(LangType id, generic_string name) : _id(id), _name(name){}; +}; + +class DefaultNewDocDlg : public StaticDialog +{ +public : + DefaultNewDocDlg() {}; +private : + std::vector _langList; + void makeOpenAnsiAsUtf8(bool doIt){ + if (!doIt) + ::SendDlgItemMessage(_hSelf, IDC_CHECK_OPENANSIASUTF8, BM_SETCHECK, BST_UNCHECKED, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_CHECK_OPENANSIASUTF8), doIt); + }; + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); +}; + +class LangMenuDlg : public StaticDialog +{ +public : + LangMenuDlg() {}; +private : + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); + vector _langList; +}; + +class PrintSettingsDlg : public StaticDialog +{ +public : + PrintSettingsDlg() {}; +private : + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); +}; + +class BackupDlg : public StaticDialog +{ +public : + BackupDlg() {}; +private : + URLCtrl _nbCharVal; + void updateBackupGUI(); + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); +}; + +struct strCouple { + generic_string _varDesc; + generic_string _var; + strCouple(TCHAR *varDesc, TCHAR *var): _varDesc(varDesc), _var(var){}; +}; + +class PrintSettings2Dlg : public StaticDialog +{ +public : + PrintSettings2Dlg():_focusedEditCtrl(0), _selStart(0), _selEnd(0){}; +private : + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); + vector varList; + int _focusedEditCtrl; + DWORD _selStart; + DWORD _selEnd; + + //ColourStaticTextHooker _colourHooker; +}; + +class PreferenceDlg : public StaticDialog +{ +friend class Notepad_plus; + +public : + PreferenceDlg(){}; + + void init(HINSTANCE hInst, HWND parent) { + Window::init(hInst, parent); + }; + + void doDialog(bool isRTL = false) { + if (!isCreated()) + { + create(IDD_PREFERENCE_BOX, isRTL); + goToCenter(); + } + display(); + }; + + virtual void destroy() { + _ctrlTab.destroy(); + _barsDlg.destroy(); + _marginsDlg.destroy(); + _settingsDlg.destroy(); + _fileAssocDlg.destroy(); + _langMenuDlg.destroy(); + _printSettingsDlg.destroy(); + _printSettings2Dlg.destroy(); + _defaultNewDocDlg.destroy(); + }; +private : + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); + ControlsTab _ctrlTab; + WindowVector _wVector; + BarsDlg _barsDlg; + MarginsDlg _marginsDlg; + SettingsDlg _settingsDlg; + RegExtDlg _fileAssocDlg; + LangMenuDlg _langMenuDlg; + PrintSettingsDlg _printSettingsDlg; + PrintSettings2Dlg _printSettings2Dlg; + DefaultNewDocDlg _defaultNewDocDlg; + BackupDlg _backupDlg; +}; + + + +#endif //PREFERENCE_DLG_H \ No newline at end of file diff --git a/PowerEditor/src/WinControls/Preference/preference_rc.h b/PowerEditor/src/WinControls/Preference/preference_rc.h new file mode 100644 index 00000000..b9fa101b --- /dev/null +++ b/PowerEditor/src/WinControls/Preference/preference_rc.h @@ -0,0 +1,206 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO ( donho@altern.org ) + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#define IDD_PREFERENCE_BOX 6000 + #define IDC_BUTTON_CLOSE (IDD_PREFERENCE_BOX + 1) + + +#define IDD_PREFERENCE_BAR_BOX 6100 //(IDD_PREFERENCE_BOX + 100) + #define IDC_TOOLBAR_GB_STATIC (IDD_PREFERENCE_BAR_BOX + 1) + #define IDC_CHECK_HIDE (IDD_PREFERENCE_BAR_BOX + 2) + #define IDC_RADIO_SMALLICON (IDD_PREFERENCE_BAR_BOX + 3) + #define IDC_RADIO_BIGICON (IDD_PREFERENCE_BAR_BOX + 4) + #define IDC_RADIO_STANDARD (IDD_PREFERENCE_BAR_BOX + 5) + + #define IDC_TABBAR_GB_STATIC (IDD_PREFERENCE_BAR_BOX + 6) + #define IDC_CHECK_REDUCE (IDD_PREFERENCE_BAR_BOX + 7) + #define IDC_CHECK_LOCK (IDD_PREFERENCE_BAR_BOX + 8) + #define IDC_CHECK_DRAWINACTIVE (IDD_PREFERENCE_BAR_BOX + 9) + #define IDC_CHECK_ORANGE (IDD_PREFERENCE_BAR_BOX + 10) + #define IDC_CHECK_SHOWSTATUSBAR (IDD_PREFERENCE_BAR_BOX + 11) + #define IDC_CHECK_ENABLETABCLOSE (IDD_PREFERENCE_BAR_BOX + 12) + #define IDC_CHECK_DBCLICK2CLOSE (IDD_PREFERENCE_BAR_BOX + 13) + #define IDC_CHECK_ENABLEDOCSWITCHER (IDD_PREFERENCE_BAR_BOX + 14) + #define IDC_CHECK_MAINTAININDENT (IDD_PREFERENCE_BAR_BOX + 15) + #define IDC_CHECK_KEEPINSAMEDIR (IDD_PREFERENCE_BAR_BOX + 16) + #define IDC_CHECK_STYLEMRU (IDD_PREFERENCE_BAR_BOX + 17) + #define IDC_CHECK_TAB_HIDE (IDD_PREFERENCE_BAR_BOX + 18) + #define IDC_CHECK_TAB_MULTILINE (IDD_PREFERENCE_BAR_BOX + 19) + #define IDC_CHECK_TAB_VERTICAL (IDD_PREFERENCE_BAR_BOX + 20) + #define IDC_MENUBAR_GB_STATIC (IDD_PREFERENCE_BAR_BOX + 21) + #define IDC_CHECK_HIDEMENUBAR (IDD_PREFERENCE_BAR_BOX + 22) + #define IDC_LOCALIZATION_GB_STATIC (IDD_PREFERENCE_BAR_BOX + 23) + #define IDC_COMBO_LOCALIZATION (IDD_PREFERENCE_BAR_BOX + 24) + +#define IDD_PREFERENCE_MARGEIN_BOX 6200 //(IDD_PREFERENCE_BOX + 200) + #define IDC_FMS_GB_STATIC (IDD_PREFERENCE_MARGEIN_BOX + 1) + #define IDC_RADIO_SIMPLE (IDD_PREFERENCE_MARGEIN_BOX + 2) + #define IDC_RADIO_ARROW (IDD_PREFERENCE_MARGEIN_BOX + 3) + #define IDC_RADIO_CIRCLE (IDD_PREFERENCE_MARGEIN_BOX + 4) + #define IDC_RADIO_BOX (IDD_PREFERENCE_MARGEIN_BOX + 5) + + #define IDC_CHECK_LINENUMBERMARGE (IDD_PREFERENCE_MARGEIN_BOX + 6) + #define IDC_CHECK_BOOKMARKMARGE (IDD_PREFERENCE_MARGEIN_BOX + 7) + + #define IDC_CHECK_SHOWVERTICALEDGE (IDD_PREFERENCE_MARGEIN_BOX + 8) + #define IDC_NBCOLONE_STATIC (IDD_PREFERENCE_MARGEIN_BOX + 9) + #define IDC_COLONENUMBER_STATIC (IDD_PREFERENCE_MARGEIN_BOX + 10) + + #define IDC_VES_GB_STATIC (IDD_PREFERENCE_MARGEIN_BOX + 11) + #define IDC_RADIO_LNMODE (IDD_PREFERENCE_MARGEIN_BOX + 12) + #define IDC_RADIO_BGMODE (IDD_PREFERENCE_MARGEIN_BOX + 13) + #define IDC_CHECK_CURRENTLINEHILITE (IDD_PREFERENCE_MARGEIN_BOX + 14) + #define IDC_COMBO_SCINTILLAVIEWCHOIX (IDD_PREFERENCE_MARGEIN_BOX + 15) + + #define IDC_CARETSETTING_STATIC (IDD_PREFERENCE_MARGEIN_BOX + 16) + #define IDC_WIDTH_STATIC (IDD_PREFERENCE_MARGEIN_BOX + 17) + #define IDC_WIDTH_COMBO (IDD_PREFERENCE_MARGEIN_BOX + 18) + #define IDC_BLINKRATE_STATIC (IDD_PREFERENCE_MARGEIN_BOX + 19) + #define IDC_CARETBLINKRATE_SLIDER (IDD_PREFERENCE_MARGEIN_BOX + 20) + #define IDC_CARETBLINKRATE_F_STATIC (IDD_PREFERENCE_MARGEIN_BOX + 21) + #define IDC_CARETBLINKRATE_S_STATIC (IDD_PREFERENCE_MARGEIN_BOX + 22) + #define IDC_CHECK_DOCCHANGESTATEMARGE (IDD_PREFERENCE_MARGEIN_BOX + 23) + +#define IDD_PREFERENCE_SETTING_BOX 6300 //(IDD_PREFERENCE_BOX + 300) + #define IDC_TABSETTING_GB_STATIC (IDD_PREFERENCE_SETTING_BOX + 1) + #define IDC_CHECK_REPLACEBYSPACE (IDD_PREFERENCE_SETTING_BOX + 2) + #define IDC_TABSIZE_STATIC (IDD_PREFERENCE_SETTING_BOX + 3) + #define IDC_HISTORY_GB_STATIC (IDD_PREFERENCE_SETTING_BOX + 4) + #define IDC_CHECK_DONTCHECKHISTORY (IDD_PREFERENCE_SETTING_BOX + 5) + #define IDC_MAXNBFILE_STATIC (IDD_PREFERENCE_SETTING_BOX + 6) + #define IDC_CHECK_FILEAUTODETECTION (IDD_PREFERENCE_SETTING_BOX + 7) + #define IDC_CHECK_MIN2SYSTRAY (IDD_PREFERENCE_SETTING_BOX + 8) + #define IDC_CHECK_REMEMBERSESSION (IDD_PREFERENCE_SETTING_BOX + 9) + #define IDC_TABSIZEVAL_STATIC (IDD_PREFERENCE_SETTING_BOX + 10) + #define IDC_MAXNBFILEVAL_STATIC (IDD_PREFERENCE_SETTING_BOX + 11) + #define IDC_FILEAUTODETECTION_STATIC (IDD_PREFERENCE_SETTING_BOX + 12) + #define IDC_CHECK_UPDATESILENTLY (IDD_PREFERENCE_SETTING_BOX + 13) + #define IDC_BACKUP_GB_STATIC (IDD_PREFERENCE_SETTING_BOX + 14) + #define IDC_RADIO_BKNONE (IDD_PREFERENCE_SETTING_BOX + 15) + #define IDC_RADIO_BKSIMPLE (IDD_PREFERENCE_SETTING_BOX + 16) + #define IDC_RADIO_BKVERBOSE (IDD_PREFERENCE_SETTING_BOX + 17) + #define IDC_CLICKABLELINK_STATIC (IDD_PREFERENCE_SETTING_BOX + 18) + #define IDC_CHECK_CLICKABLELINK_ENABLE (IDD_PREFERENCE_SETTING_BOX + 19) + #define IDC_CHECK_CLICKABLELINK_NOUNDERLINE (IDD_PREFERENCE_SETTING_BOX + 20) + #define IDC_EDIT_SESSIONFILEEXT (IDD_PREFERENCE_SETTING_BOX + 21) + #define IDC_SESSIONFILEEXT_STATIC (IDD_PREFERENCE_SETTING_BOX + 22) + #define IDC_CHECK_AUTOUPDATE (IDD_PREFERENCE_SETTING_BOX + 23) + #define IDC_DOCUMENTSWITCHER_STATIC (IDD_PREFERENCE_SETTING_BOX + 24) + #define IDC_CHECK_UPDATEGOTOEOF (IDD_PREFERENCE_SETTING_BOX + 25) + #define IDC_CHECK_ENABLSMARTHILITE (IDD_PREFERENCE_SETTING_BOX + 26) + #define IDC_CHECK_ENABLTAGSMATCHHILITE (IDD_PREFERENCE_SETTING_BOX + 27) + #define IDC_CHECK_ENABLTAGATTRHILITE (IDD_PREFERENCE_SETTING_BOX + 28) + #define IDC_TAGMATCHEDHILITE_STATIC (IDD_PREFERENCE_SETTING_BOX + 29) + #define IDC_CHECK_HIGHLITENONEHTMLZONE (IDD_PREFERENCE_SETTING_BOX + 30) + #define IDC_CHECK_SHORTTITLE (IDD_PREFERENCE_SETTING_BOX + 31) + +#define IDD_PREFERENCE_NEWDOCSETTING_BOX 6400 //(IDD_PREFERENCE_BOX + 400) + #define IDC_FORMAT_GB_STATIC (IDD_PREFERENCE_NEWDOCSETTING_BOX + 1) + #define IDC_RADIO_F_WIN (IDD_PREFERENCE_NEWDOCSETTING_BOX + 2) + #define IDC_RADIO_F_UNIX (IDD_PREFERENCE_NEWDOCSETTING_BOX + 3) + #define IDC_RADIO_F_MAC (IDD_PREFERENCE_NEWDOCSETTING_BOX + 4) + #define IDC_ENCODING_STATIC (IDD_PREFERENCE_NEWDOCSETTING_BOX + 5) + #define IDC_RADIO_ANSI (IDD_PREFERENCE_NEWDOCSETTING_BOX + 6) + #define IDC_RADIO_UTF8SANSBOM (IDD_PREFERENCE_NEWDOCSETTING_BOX + 7) + #define IDC_RADIO_UTF8 (IDD_PREFERENCE_NEWDOCSETTING_BOX + 8) + #define IDC_RADIO_UCS2BIG (IDD_PREFERENCE_NEWDOCSETTING_BOX + 9) + #define IDC_RADIO_UCS2SMALL (IDD_PREFERENCE_NEWDOCSETTING_BOX + 10) + #define IDC_DEFAULTLANG_STATIC (IDD_PREFERENCE_NEWDOCSETTING_BOX + 11) + #define IDC_COMBO_DEFAULTLANG (IDD_PREFERENCE_NEWDOCSETTING_BOX + 12) + #define IDC_OPENSAVEDIR_GR_STATIC (IDD_PREFERENCE_NEWDOCSETTING_BOX + 13) + #define IDC_OPENSAVEDIR_FOLLOWCURRENT_RADIO (IDD_PREFERENCE_NEWDOCSETTING_BOX + 14) + #define IDC_OPENSAVEDIR_REMEMBERLAST_RADIO (IDD_PREFERENCE_NEWDOCSETTING_BOX + 15) + #define IDC_OPENSAVEDIR_ALWAYSON_RADIO (IDD_PREFERENCE_NEWDOCSETTING_BOX + 16) + #define IDC_OPENSAVEDIR_ALWAYSON_EDIT (IDD_PREFERENCE_NEWDOCSETTING_BOX + 17) + #define IDD_OPENSAVEDIR_ALWAYSON_BROWSE_BUTTON (IDD_PREFERENCE_NEWDOCSETTING_BOX + 18) + #define IDC_NEWDOCUMENT_GR_STATIC (IDD_PREFERENCE_NEWDOCSETTING_BOX + 19) + #define IDC_CHECK_OPENANSIASUTF8 (IDD_PREFERENCE_NEWDOCSETTING_BOX + 20) + +#define IDD_PREFERENCE_LANG_BOX 6500 //(IDD_PREFERENCE_BOX + 500) + #define IDC_LIST_ENABLEDLANG (IDD_PREFERENCE_LANG_BOX + 1) + #define IDC_LIST_DISABLEDLANG (IDD_PREFERENCE_LANG_BOX + 2) + #define IDC_BUTTON_REMOVE (IDD_PREFERENCE_LANG_BOX + 3) + #define IDC_BUTTON_RESTORE (IDD_PREFERENCE_LANG_BOX + 4) + #define IDC_ENABLEDITEMS_STATIC (IDD_PREFERENCE_LANG_BOX + 5) + #define IDC_DISABLEDITEMS_STATIC (IDD_PREFERENCE_LANG_BOX + 6) + #define IDC_CHECK_LANGMENUCOMPACT (IDD_PREFERENCE_LANG_BOX + 7) + +#define IDD_PREFERENCE_PRINT_BOX 6600 //(IDD_PREFERENCE_BOX + 600) + #define IDC_CHECK_PRINTLINENUM (IDD_PREFERENCE_PRINT_BOX + 1) + #define IDC_COLOUROPT_STATIC (IDD_PREFERENCE_PRINT_BOX + 2) + #define IDC_RADIO_WYSIWYG (IDD_PREFERENCE_PRINT_BOX + 3) + #define IDC_RADIO_INVERT (IDD_PREFERENCE_PRINT_BOX + 4) + #define IDC_RADIO_BW (IDD_PREFERENCE_PRINT_BOX + 5) + #define IDC_RADIO_NOBG (IDD_PREFERENCE_PRINT_BOX + 6) + #define IDC_MARGESETTINGS_STATIC (IDD_PREFERENCE_PRINT_BOX + 7) + #define IDC_EDIT_ML (IDD_PREFERENCE_PRINT_BOX + 8) + #define IDC_EDIT_MT (IDD_PREFERENCE_PRINT_BOX + 9) + #define IDC_EDIT_MR (IDD_PREFERENCE_PRINT_BOX + 10) + #define IDC_EDIT_MB (IDD_PREFERENCE_PRINT_BOX + 11) + #define IDC_ML_STATIC (IDD_PREFERENCE_PRINT_BOX + 12) + #define IDC_MT_STATIC (IDD_PREFERENCE_PRINT_BOX + 13) + #define IDC_MR_STATIC (IDD_PREFERENCE_PRINT_BOX + 14) + #define IDC_MB_STATIC (IDD_PREFERENCE_PRINT_BOX + 15) + +#define IDD_PREFERENCE_PRINT2_BOX 6700 //(IDD_PREFERENCE_BOX + 700) + #define IDC_EDIT_HLEFT (IDD_PREFERENCE_PRINT2_BOX + 1) + #define IDC_EDIT_HMIDDLE (IDD_PREFERENCE_PRINT2_BOX + 2) + #define IDC_EDIT_HRIGHT (IDD_PREFERENCE_PRINT2_BOX + 3) + #define IDC_COMBO_HFONTNAME (IDD_PREFERENCE_PRINT2_BOX + 4) + #define IDC_COMBO_HFONTSIZE (IDD_PREFERENCE_PRINT2_BOX + 5) + #define IDC_CHECK_HBOLD (IDD_PREFERENCE_PRINT2_BOX + 6) + #define IDC_CHECK_HITALIC (IDD_PREFERENCE_PRINT2_BOX + 7) + #define IDC_HGB_STATIC (IDD_PREFERENCE_PRINT2_BOX + 8) + #define IDC_HL_STATIC (IDD_PREFERENCE_PRINT2_BOX + 9) + #define IDC_HM_STATIC (IDD_PREFERENCE_PRINT2_BOX + 10) + #define IDC_HR_STATIC (IDD_PREFERENCE_PRINT2_BOX + 11) + #define IDC_EDIT_FLEFT (IDD_PREFERENCE_PRINT2_BOX + 12) + #define IDC_EDIT_FMIDDLE (IDD_PREFERENCE_PRINT2_BOX + 13) + #define IDC_EDIT_FRIGHT (IDD_PREFERENCE_PRINT2_BOX + 14) + #define IDC_COMBO_FFONTNAME (IDD_PREFERENCE_PRINT2_BOX + 15) + #define IDC_COMBO_FFONTSIZE (IDD_PREFERENCE_PRINT2_BOX + 16) + #define IDC_CHECK_FBOLD (IDD_PREFERENCE_PRINT2_BOX + 17) + #define IDC_CHECK_FITALIC (IDD_PREFERENCE_PRINT2_BOX + 18) + #define IDC_FGB_STATIC (IDD_PREFERENCE_PRINT2_BOX + 19) + #define IDC_FL_STATIC (IDD_PREFERENCE_PRINT2_BOX + 20) + #define IDC_FM_STATIC (IDD_PREFERENCE_PRINT2_BOX + 21) + #define IDC_FR_STATIC (IDD_PREFERENCE_PRINT2_BOX + 22) + #define IDC_BUTTON_ADDVAR (IDD_PREFERENCE_PRINT2_BOX + 23) + #define IDC_COMBO_VARLIST (IDD_PREFERENCE_PRINT2_BOX + 24) + #define IDC_VAR_STATIC (IDD_PREFERENCE_PRINT2_BOX + 25) + #define IDC_VIEWPANEL_STATIC (IDD_PREFERENCE_PRINT2_BOX + 26) + #define IDC_WHICHPART_STATIC (IDD_PREFERENCE_PRINT2_BOX + 27) + + +#define IDD_PREFERENCE_BACKUP_BOX 6800 //(IDD_PREFERENCE_BOX + 800) + #define IDC_BACKUPDIR_GRP_STATIC (IDD_PREFERENCE_BACKUP_BOX + 1) + #define IDC_BACKUPDIR_CHECK (IDD_PREFERENCE_BACKUP_BOX + 2) + #define IDD_BACKUPDIR_STATIC (IDD_PREFERENCE_BACKUP_BOX + 3) + #define IDC_BACKUPDIR_USERCUSTOMDIR_GRPSTATIC (IDD_PREFERENCE_BACKUP_BOX + 4) + #define IDC_BACKUPDIR_EDIT (IDD_PREFERENCE_BACKUP_BOX + 5) + #define IDD_BACKUPDIR_BROWSE_BUTTON (IDD_PREFERENCE_BACKUP_BOX + 6) + #define IDD_AUTOC_GRPSTATIC (IDD_PREFERENCE_BACKUP_BOX + 7) + #define IDD_AUTOC_ENABLECHECK (IDD_PREFERENCE_BACKUP_BOX + 8) + #define IDD_AUTOC_FUNCRADIO (IDD_PREFERENCE_BACKUP_BOX + 9) + #define IDD_AUTOC_WORDRADIO (IDD_PREFERENCE_BACKUP_BOX + 10) + #define IDD_AUTOC_STATIC_FROM (IDD_PREFERENCE_BACKUP_BOX + 11) + #define IDD_AUTOC_STATIC_N (IDD_PREFERENCE_BACKUP_BOX + 12) + #define IDD_AUTOC_STATIC_CHAR (IDD_PREFERENCE_BACKUP_BOX + 13) + #define IDD_AUTOC_STATIC_NOTE (IDD_PREFERENCE_BACKUP_BOX + 14) + #define IDD_FUNC_CHECK (IDD_PREFERENCE_BACKUP_BOX + 15) diff --git a/PowerEditor/src/WinControls/SplitterContainer/Splitter.cpp b/PowerEditor/src/WinControls/SplitterContainer/Splitter.cpp new file mode 100644 index 00000000..75b7b1de --- /dev/null +++ b/PowerEditor/src/WinControls/SplitterContainer/Splitter.cpp @@ -0,0 +1,691 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + + +#include "Splitter.h" +#include "Common.h" + +bool Splitter::_isHorizontalRegistered = false; +bool Splitter::_isVerticalRegistered = false; +bool Splitter::_isHorizontalFixedRegistered = false; +bool Splitter::_isVerticalFixedRegistered = false; + + +#define SPLITTER_SIZE 8 + +Splitter::Splitter() : Window() +{ + //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, + int iSplitRatio, DWORD dwFlags) +{ + Window::init(hInst, hPere); + _spiltterSize = splitterSize; + + WNDCLASSEX wcex; + DWORD dwExStyle = 0L; + DWORD dwStyle = WS_CHILD | WS_VISIBLE; + + if (hPere == NULL) + { + ::MessageBox(NULL, TEXT("pas de pere?"), TEXT("Splitter::init"), MB_OK); + throw int(96); + } + if (iSplitRatio < 0) + { + ::MessageBox(NULL, TEXT("it shoulds be 0 < ratio < 100"), TEXT("Splitter::init"), MB_OK); + throw int(96); + } + _hParent = hPere; + _dwFlags = dwFlags; + + if (_dwFlags & SV_FIXED) + { + //Fixed spliter + _isFixed = true; + } + else + { + if (iSplitRatio >= 100) + { + //cant be 100 % or more + ::MessageBox(NULL, TEXT("it shoulds be 0 < ratio < 100"), TEXT("Splitter::init"), MB_OK); + throw int(96); + } + } + + _splitPercent = iSplitRatio; + + 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 = ((_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 = ((_rect.right * _splitPercent)/100); + // x axis determined by split% of the parent windows width. + + _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)) + { + wcex.style = wcex.style | CS_DBLCLKS; + // enable mouse double click messages. + } + } + + if (_isFixed) + { + wcex.hCursor = ::LoadCursor(NULL, IDC_ARROW); + // if fixed spliter then choose default cursor type. + if (_dwFlags & SV_HORIZONTAL) + wcex.lpszClassName = TEXT("fxdnsspliter"); + else + wcex.lpszClassName = TEXT("fxdwespliter"); + } + else + { + if (_dwFlags & SV_HORIZONTAL) + { + //double sided arrow pointing north-south as cursor + wcex.hCursor = ::LoadCursor(NULL,IDC_SIZENS); + wcex.lpszClassName = TEXT("nsspliter"); + } + else + { + // double sided arrow pointing east-west as cursor + wcex.hCursor = ::LoadCursor(NULL,IDC_SIZEWE); + wcex.lpszClassName = TEXT("wespliter"); + } + } + + wcex.hbrBackground = (HBRUSH)(COLOR_3DFACE+1); + wcex.lpszMenuName = NULL; + wcex.hIconSm = NULL; + + if ((_dwFlags & SV_HORIZONTAL)&&(!_isHorizontalRegistered)) + { + RegisterClassEx(&wcex); + _isHorizontalRegistered = true; + } + else if (isVertical()&&(!_isVerticalRegistered)) + { + RegisterClassEx(&wcex); + _isVerticalRegistered = true; + } + else if ((_dwFlags & SV_HORIZONTAL)&&(!_isHorizontalFixedRegistered)) + { + RegisterClassEx(&wcex); + _isHorizontalFixedRegistered = true; + } + else if (isVertical()&&(!_isVerticalFixedRegistered)) + { + RegisterClassEx(&wcex); + _isVerticalFixedRegistered = true; + } + + _hSelf = CreateWindowEx( + dwExStyle, + wcex.lpszClassName, + TEXT(""), + dwStyle, + _rect.left, + _rect.top, + _rect.right, + _rect.bottom, + _hParent, + NULL, + _hInst, + (LPVOID)this); + + if (!_hSelf) + { + systemMessage(TEXT("System Err")); + throw int(345); + } + + RECT rc; + getClientRect(rc); + //::GetClientRect(_hParent,&rc); + + _clickZone2TL.left = rc.left; + _clickZone2TL.top = rc.top; + + int clickZoneWidth = getClickZone(WIDTH); + int clickZoneHeight = getClickZone(HEIGHT); + _clickZone2TL.right = clickZoneWidth; + _clickZone2TL.bottom = clickZoneHeight; + + _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 +int Splitter::getClickZone(WH which) +{ + if (_spiltterSize <= 8) + { + return isVertical()?(which==WIDTH?_spiltterSize:HIEGHT_MINIMAL) + :(which==WIDTH?HIEGHT_MINIMAL:_spiltterSize); + } + else // (_spiltterSize > 8) + { + return isVertical()?(which==WIDTH? 8:15) + :(which==WIDTH?15:8); + } +} + +LRESULT CALLBACK Splitter::staticWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + switch(uMsg) + { + case WM_NCCREATE: + { + Splitter * pSplitter = (Splitter *)((LPCREATESTRUCT)lParam)->lpCreateParams; + pSplitter->_hSelf = hWnd; + ::SetWindowLongPtr(hWnd, GWL_USERDATA, (long)pSplitter); + return TRUE; + } + default: + { + Splitter * pSplitter = (Splitter *)::GetWindowLongPtr(hWnd, GWL_USERDATA); + if (!pSplitter) + return ::DefWindowProc(hWnd, uMsg, wParam, lParam); + + return pSplitter->spliterWndProc(uMsg, wParam, lParam); + } + } +} + +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: + { + POINT p; + p.x = LOWORD(lParam); + p.y = HIWORD(lParam); + + if ((isInLeftTopZone(p))&&(wParam == MK_LBUTTON)) + { + gotoTopLeft(); + return TRUE; + } + + if ((isInRightBottomZone(p))&&(wParam == MK_LBUTTON)) + { + gotoRightBouuom(); + return TRUE; + } + + if (!_isFixed) + { + ::SetCapture(_hSelf); + _isDraged = true; + } + } + return 0; + + case WM_RBUTTONDOWN : + ::SendMessage(_hParent, WM_DOPOPUPMENU, wParam, lParam); + return TRUE; + + case WM_MOUSEMOVE: + { + POINT p; + p.x = LOWORD(lParam); + p.y = HIWORD(lParam); + + if (isInLeftTopZone(p) || isInRightBottomZone(p)) + { + //::SetCursor(::LoadCursor(_hInst, MAKEINTRESOURCE(IDC_UP_ARROW))); + ::SetCursor(::LoadCursor(NULL, IDC_ARROW)); + return TRUE; + } + + if ((!_isFixed) && (wParam == MK_LBUTTON)) + { + POINT pt; RECT rt; + ::GetClientRect(_hParent, &rt); + + ::GetCursorPos(&pt); + ::ScreenToClient(_hParent, &pt); + + if (_dwFlags & SV_HORIZONTAL) + { + if (pt.y <= 1) + { + _rect.top = 1; + _splitPercent = 1; + } + else + { + if (pt.y <= (rt.bottom - 5)) + { + _rect.top = pt.y; + _splitPercent = ((pt.y * 100 / rt.bottom*100) / 100); + } + else + { + _rect.top = rt.bottom - 5; + _splitPercent = 99; + } + } + } + else + { + if (pt.x <= 1) + { + _rect.left = 1; + _splitPercent = 1; + } + else + { + if (pt.x <= (rt.right - 5)) + { + _rect.left = pt.x; + _splitPercent = ((pt.x*100/rt.right*100)/100); + } + else + { + _rect.left = rt.right - 5; + _splitPercent = 99; + } + } + } + + ::SendMessage(_hParent, WM_RESIZE_CONTAINER, _rect.left, _rect.top); + ::MoveWindow(_hSelf, _rect.left, _rect.top, _rect.right, _rect.bottom, FALSE); + redraw(); + } + return 0; + } + + case WM_LBUTTONUP: + { + if (!_isFixed) + { + ReleaseCapture(); + } + return 0; + } + case WM_CAPTURECHANGED: + { + if (_isDraged) + { + ::SendMessage(_hParent, WM_RESIZE_CONTAINER, _rect.left, _rect.top); + ::MoveWindow(_hSelf, _rect.left, _rect.top, _rect.right, _rect.bottom, TRUE); + _isDraged = false; + } + return 0; + } + + case WM_PAINT : + drawSplitter(); + return 0; + + case WM_CLOSE: + destroy(); + return 0; + } + return ::DefWindowProc(_hSelf, uMsg, wParam, lParam); +} + +void Splitter::resizeSpliter(RECT *pRect) +{ + RECT rect; + + if (pRect) + rect = *pRect; + else + ::GetClientRect(_hParent,&rect); + + if (_dwFlags & SV_HORIZONTAL) + { + // 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 = ((rect.bottom * _splitPercent)/100); + else // soit la fenetre en haut soit la fenetre en bas qui est fixee + _rect.top = getSplitterFixPosY(); + } + else + { + // 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) + { + _rect.left = ((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); + _clickZone2BR.right = getClickZone(WIDTH); + _clickZone2BR.bottom = getClickZone(HEIGHT); + _clickZone2BR.left = rc.right - _clickZone2BR.right; + _clickZone2BR.top = rc.bottom - _clickZone2BR.bottom; + + + //force the window to repaint, to make sure the splitter is visible + // in the new position. + redraw(); +} + +void Splitter::gotoTopLeft() +{ + if ((_dwFlags & SV_ENABLELDBLCLK) && (!_isFixed) && (_splitPercent > 1)) + { + if (_dwFlags & SV_HORIZONTAL) + _rect.top = 1; + 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() +{ + 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() +{ + PAINTSTRUCT ps; + RECT rc, rcToDraw1, rcToDraw2, TLrc, BRrc; + + HDC hdc = ::BeginPaint(_hSelf, &ps); + getClientRect(rc); + + if ((_spiltterSize >= 4) && (_dwFlags & SV_RESIZEWTHPERCNT)) + { + adjustZoneToDraw(TLrc, TOP_LEFT); + adjustZoneToDraw(BRrc, BOTTOM_RIGHT); + paintArrow(hdc, TLrc, isVertical()?ARROW_LEFT:ARROW_UP); + } + + if (isVertical()) + { + rcToDraw2.top = (_dwFlags & SV_RESIZEWTHPERCNT)?_clickZone2TL.bottom:0; + rcToDraw2.bottom = rcToDraw2.top + 2; + + rcToDraw1.top = rcToDraw2.top + 1; + rcToDraw1.bottom = rcToDraw1.top + 2; + } + else + { + rcToDraw2.top = 1; + rcToDraw2.bottom = 3; + + rcToDraw1.top = 2; + rcToDraw1.bottom = 4; + } + + int bottom = 0; + if (_dwFlags & SV_RESIZEWTHPERCNT) + bottom = (isVertical() ? rc.bottom - _clickZone2BR.bottom : rc.bottom); + else + bottom = rc.bottom; + + while (rcToDraw1.bottom <= bottom) + { + if (isVertical()) + { + rcToDraw2.left = 1; + rcToDraw2.right = 3; + + rcToDraw1.left = 2; + rcToDraw1.right = 4; + } + else + { + rcToDraw2.left = _clickZone2TL.right; + rcToDraw2.right = rcToDraw2.left + 2; + + rcToDraw1.left = rcToDraw2.left; + rcToDraw1.right = rcToDraw1.left + 2; + } + + while (rcToDraw1.right <= (isVertical() ? rc.right : rc.right - _clickZone2BR.right)) + { + ::FillRect(hdc, &rcToDraw1, (HBRUSH)(RGB(0xFF, 0xFF, 0xFF))); + ::FillRect(hdc, &rcToDraw2, (HBRUSH)(COLOR_3DSHADOW+1)); + + rcToDraw2.left += 4; + rcToDraw2.right += 4; + rcToDraw1.left += 4; + rcToDraw1.right += 4; + } + rcToDraw2.top += 4; + rcToDraw2.bottom += 4; + rcToDraw1.top += 4; + rcToDraw1.bottom += 4; + } + + if ((_spiltterSize >= 4) && (_dwFlags & SV_RESIZEWTHPERCNT)) + paintArrow(hdc, BRrc, isVertical()?ARROW_RIGHT:ARROW_DOWN); + + ::EndPaint(_hSelf, &ps); +} + +void Splitter::rotate() +{ + if (!_isFixed) + { + destroy(); + if (_dwFlags & SV_HORIZONTAL) + { + _dwFlags ^= SV_HORIZONTAL; + _dwFlags |= SV_VERTICAL; + } + else //SV_VERTICAL + { + _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--) + { + ::MoveToEx(hdc, x, y++, NULL); + ::LineTo(hdc, x, rc.bottom--); + } + } + 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++) + { + ::MoveToEx(hdc, x, y++, NULL); + ::LineTo(hdc, x, rc.bottom--); + } + } + 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--) + { + ::MoveToEx(hdc, x++, y, NULL); + ::LineTo(hdc, rc.right--, y); + } + } + 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++) + { + ::MoveToEx(hdc, x++, y, NULL); + ::LineTo(hdc, rc.right--, y); + } + } +} +void Splitter::adjustZoneToDraw(RECT & rc2def, ZONE_TYPE whichZone) +{ + if (_spiltterSize < 4) return; + int x0, y0, x1, y1, w, h; + if ((4 <= _spiltterSize) && (_spiltterSize <= 8)) + { + w = (isVertical()?4:7); + h = (isVertical()?7:4); + } + else // (_spiltterSize > 8) + { + w = (isVertical()?6:11); + h = (isVertical()?11:6); + } + + if (isVertical()) + {//w=4 h=7 + if (whichZone == TOP_LEFT) + { + x0 = 0; + y0 = (_clickZone2TL.bottom - h) / 2; + } + else // whichZone == BOTTOM_RIGHT + { + 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) + { + x0 = (_clickZone2TL.right - w) / 2; + y0 = 0; + } + else // whichZone == BOTTOM_RIGHT + { + 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 new file mode 100644 index 00000000..24a83ee3 --- /dev/null +++ b/PowerEditor/src/WinControls/SplitterContainer/Splitter.h @@ -0,0 +1,117 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef SPLITTER_H +#define SPLITTER_H + +#include +#include "Window.h" +#include "resource.h" + +#define SV_HORIZONTAL 0x00000001 +#define SV_VERTICAL 0x00000002 +#define SV_FIXED 0x00000004 +#define SV_ENABLERDBLCLK 0x00000008 +#define SV_ENABLELDBLCLK 0x00000010 +#define SV_RESIZEWTHPERCNT 0x00000020 + + +#define WM_GETSPLITTER_X (SPLITTER_USER + 1) +#define WM_GETSPLITTER_Y (SPLITTER_USER + 2) +#define WM_DOPOPUPMENU (SPLITTER_USER + 3) +#define WM_RESIZE_CONTAINER (SPLITTER_USER + 4) + +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; + +typedef bool ZONE_TYPE; +const bool TOP_LEFT = true; +const bool BOTTOM_RIGHT = false; + +enum SplitterMode { + DYNAMIC, LEFT_FIX, RIGHT_FIX +}; + +class Splitter : public Window +{ +public: + Splitter(); + ~Splitter(){}; + void destroy() { + ::DestroyWindow(_hSelf); + }; + void resizeSpliter(RECT *pRect = NULL); + void init(HINSTANCE hInst, HWND hPere, int splitterSize, + int iSplitRatio, DWORD dwFlags); + void rotate(); + int getPhisicalSize() const { + return _spiltterSize; + }; + +private: + RECT _rect; + int _splitPercent; + int _spiltterSize; + bool _isDraged; + DWORD _dwFlags; + bool _isFixed; + static bool _isHorizontalRegistered; + static bool _isVerticalRegistered; + 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); + 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 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() { + long result = long(::SendMessage(_hParent, WM_GETSPLITTER_X, 0, 0)); + return (LOWORD(result) - ((HIWORD(result) == RIGHT_FIX) ? _spiltterSize : 0)); + }; + + int getSplitterFixPosY() { + long result = long(::SendMessage(_hParent, WM_GETSPLITTER_Y, 0, 0)); + return (LOWORD(result) - ((HIWORD(result) == RIGHT_FIX) ? _spiltterSize : 0)); + }; +}; +#endif // SPLITTER_H diff --git a/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.cpp b/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.cpp new file mode 100644 index 00000000..8fdf1dfc --- /dev/null +++ b/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.cpp @@ -0,0 +1,240 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "SplitterContainer.h" +#include "Common.h" + +bool SplitterContainer::_isRegistered = false; + +void SplitterContainer::create(Window *pWin0, Window *pWin1, int splitterSize, + SplitterMode mode, int ratio, bool isVertical) +{ + //Window::init(hInst, parent); + _pWin0 = pWin0; + _pWin1 = pWin1; + _splitterSize = splitterSize; + _splitterMode = mode; + _ratio = ratio; + _dwSplitterStyle |= isVertical?SV_VERTICAL:SV_HORIZONTAL; + if (_splitterMode != DYNAMIC) + { + _dwSplitterStyle |= SV_FIXED; + _dwSplitterStyle &= ~SV_RESIZEWTHPERCNT; + } + if (!_isRegistered) + { + WNDCLASS splitterContainerClass; + + splitterContainerClass.style = 0; + splitterContainerClass.lpfnWndProc = staticWinProc; + splitterContainerClass.cbClsExtra = 0; + splitterContainerClass.cbWndExtra = 0; + splitterContainerClass.hInstance = _hInst; + splitterContainerClass.hIcon = NULL; + splitterContainerClass.hCursor = ::LoadCursor(NULL, IDC_ARROW); + + // hbrBackground must be NULL, + // otherwise this window will hide some parts of 2 windows + splitterContainerClass.hbrBackground = NULL; + splitterContainerClass.lpszMenuName = NULL; + splitterContainerClass.lpszClassName = SPC_CLASS_NAME;//_className; + + if (!::RegisterClass(&splitterContainerClass)) + { + systemMessage(TEXT("System Err")); + throw int(98); + } + _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); + + if (!_hSelf) + { + systemMessage(TEXT("System Err")); + throw int(777); + } +} + +void SplitterContainer::rotateTo(DIRECTION direction) +{ + bool doSwitchWindow = false; + if (_dwSplitterStyle & SV_VERTICAL) + { + _dwSplitterStyle ^= SV_VERTICAL; + _dwSplitterStyle |= SV_HORIZONTAL; + doSwitchWindow = (direction == LEFT); + } + else + { + _dwSplitterStyle ^= SV_HORIZONTAL; + _dwSplitterStyle |= SV_VERTICAL; + doSwitchWindow = (direction == RIGHT); + } + if (doSwitchWindow) + { + Window *tmp = _pWin0; + _pWin0 = _pWin1; + _pWin1 = tmp; + } + _splitter.rotate(); + +} + +LRESULT CALLBACK SplitterContainer::staticWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + SplitterContainer *pSplitterContainer = NULL; + switch (message) + { + case WM_NCCREATE : + pSplitterContainer = (SplitterContainer *)(((LPCREATESTRUCT)lParam)->lpCreateParams); + pSplitterContainer->_hSelf = hwnd; + ::SetWindowLongPtr(hwnd, GWL_USERDATA, reinterpret_cast(pSplitterContainer)); + return TRUE; + + default : + pSplitterContainer = (SplitterContainer *)::GetWindowLongPtr(hwnd, GWL_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 : + _splitter.init(_hInst, _hSelf, _splitterSize, _ratio, _dwSplitterStyle); + return TRUE; + + case WM_COMMAND : + { + switch (LOWORD(wParam)) + { + case ROTATION_A_GAUCHE: + rotateTo(LEFT); + return TRUE; + case ROTATION_A_DROITE: + rotateTo(RIGHT); + return TRUE; + } + return TRUE; + } + case WM_RESIZE_CONTAINER : + { + RECT rc0, rc1; + getClientRect(rc0); + + rc1.top = rc0.top += _y; + rc1.bottom = rc0.bottom; + rc1.left = rc0.left += _x; + rc1.right = rc0.right; + + if (_dwSplitterStyle & SV_VERTICAL) + { + if (wParam != 0) + { + rc0.right = int(wParam); + + rc1.left = int(wParam) + _x + _splitter.getPhisicalSize(); + rc1.right = rc1.right - rc1.left + _x; + } + } + else //SV_HORIZONTAL + { + if (lParam != 0) + { + rc0.bottom = int(lParam); + + rc1.top = int(lParam) + _y + _splitter.getPhisicalSize(); + rc1.bottom = rc1.bottom - rc1.top + _y; + } + } + _pWin0->reSizeTo(rc0); + _pWin1->reSizeTo(rc1); + + ::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; + ::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")); + } + + ::TrackPopupMenu(_hPopupMenu, TPM_LEFTALIGN, p.x, p.y, 0, _hSelf, NULL); + } + 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_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); + } + + default : + return ::DefWindowProc(_hSelf, message, wParam, lParam); + } +} diff --git a/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.h b/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.h new file mode 100644 index 00000000..92d29c0f --- /dev/null +++ b/PowerEditor/src/WinControls/SplitterContainer/SplitterContainer.h @@ -0,0 +1,101 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef SPLITTER_CONTAINER_H +#define SPLITTER_CONTAINER_H + +#include "Window.h" +#include "Splitter.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; + + + +class SplitterContainer : public Window +{ +public : + SplitterContainer(): Window(), _x(0), _y(0), _hPopupMenu(NULL), + _dwSplitterStyle(SV_ENABLERDBLCLK | SV_ENABLELDBLCLK | SV_RESIZEWTHPERCNT){ + }; + ~SplitterContainer(){}; + void create(Window *pWin0, Window *pWin1, int splitterSize = 4, + SplitterMode mode = 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(); + _pWin1->redraw(); + }; + + 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 + + Splitter _splitter; + int _splitterSize; + int _ratio; + int _x, _y; + HMENU _hPopupMenu; + DWORD _dwSplitterStyle; + + SplitterMode _splitterMode; + 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/RunDlg/RunDlg.cpp b/PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg.cpp new file mode 100644 index 00000000..2d08ea66 --- /dev/null +++ b/PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg.cpp @@ -0,0 +1,299 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "RunDlg.h" +#include "FileDialog.h" +//#include "resource.h" +#include "Notepad_plus_msgs.h" +#include "shortcut.h" +#include "Parameters.h" +#include "Notepad_plus.h" + + +void Command::extractArgs(TCHAR *cmd2Exec, TCHAR *args, const TCHAR *cmdEntier) +{ + int i = 0; + bool quoted = false; + for ( ; i < int(lstrlen(cmdEntier)) ; i++) + { + if ((cmdEntier[i] == ' ') && (!quoted)) + break; + if (cmdEntier[i]=='"') + quoted = !quoted; + + cmd2Exec[i] = cmdEntier[i]; + } + cmd2Exec[i] = '\0'; + + if (i < int(lstrlen(cmdEntier))) + { + for ( ; (i < int(lstrlen(cmdEntier))) && (cmdEntier[i] == ' ') ; i++); + if (i < int(lstrlen(cmdEntier))) + { + for (int k = 0 ; i <= int(lstrlen(cmdEntier)) ; i++, k++) + { + args[k] = cmdEntier[i]; + } + } + + int l = lstrlen(args); + if (args[l-1] == ' ') + { + for (l -= 2 ; (l > 0) && (args[l] == ' ') ; l--); + args[l+1] = '\0'; + } + + } + else + args[0] = '\0'; +} + + +int whichVar(TCHAR *str) +{ + if (!lstrcmp(fullCurrentPath, str)) + return FULL_CURRENT_PATH; + else if (!lstrcmp(currentDirectory, str)) + return CURRENT_DIRECTORY; + else if (!lstrcmp(onlyFileName, str)) + return FILE_NAME; + else if (!lstrcmp(fileNamePart, str)) + return NAME_PART; + else if (!lstrcmp(fileExtPart, str)) + return EXT_PART; + else if (!lstrcmp(currentWord, str)) + return CURRENT_WORD; + else if (!lstrcmp(nppDir, str)) + return NPP_DIRECTORY; + else if (!lstrcmp(currentLine, str)) + return CURRENT_LINE; + else if (!lstrcmp(currentColumn, str)) + return CURRENT_COLUMN; + + return VAR_NOT_RECOGNIZED; +} + +// Since I'm sure the length will be 256, I won't check the lstrlen : watch out! +void expandNppEnvironmentStrs(const TCHAR *strSrc, TCHAR *stringDest, size_t strDestLen, HWND hWnd) +{ + size_t j = 0; + for (int i = 0 ; i < lstrlen(strSrc) ; i++) + { + int iBegin = -1; + int iEnd = -1; + if ((strSrc[i] == '$') && (strSrc[i+1] == '(')) + { + iBegin = i += 2; + for ( ; i < lstrlen(strSrc) ; i++) + { + if (strSrc[i] == ')') + { + iEnd = i - 1; + break; + } + } + } + if (iBegin != -1) + { + if (iEnd != -1) + { + TCHAR str[MAX_PATH]; + int m = 0; + for (int k = iBegin ; k <= iEnd ; k++) + str[m++] = strSrc[k]; + str[m] = '\0'; + + int internalVar = whichVar(str); + if (internalVar == VAR_NOT_RECOGNIZED) + { + i = iBegin - 2; + if (j < (strDestLen-1)) + stringDest[j++] = strSrc[i]; + else + break; + } + else + { + TCHAR expandedStr[CURRENTWORD_MAXLENGTH]; + if (internalVar == CURRENT_LINE || internalVar == CURRENT_COLUMN) + { + int lineNumber = ::SendMessage(hWnd, RUNCOMMAND_USER + internalVar, 0, 0); + wsprintf(expandedStr, TEXT("%d"), lineNumber); + } + else + ::SendMessage(hWnd, RUNCOMMAND_USER + internalVar, CURRENTWORD_MAXLENGTH, (LPARAM)expandedStr); + + for (int p = 0 ; p < lstrlen(expandedStr) ; p++) + { + if (j < (strDestLen-1)) + stringDest[j++] = expandedStr[p]; + else + break; + } + } + } + else + { + i = iBegin - 2; + if (j < (strDestLen-1)) + stringDest[j++] = strSrc[i]; + else + break; + } + } + else + if (j < (strDestLen-1)) + stringDest[j++] = strSrc[i]; + else + break; + } + stringDest[j] = '\0'; +} + +HINSTANCE Command::run(HWND hWnd) +{ + const int argsIntermediateLen = MAX_PATH*2; + const int args2ExecLen = CURRENTWORD_MAXLENGTH+MAX_PATH*2; + + TCHAR cmdPure[MAX_PATH]; + TCHAR cmdIntermediate[MAX_PATH]; + TCHAR cmd2Exec[MAX_PATH]; + TCHAR args[MAX_PATH]; + TCHAR argsIntermediate[argsIntermediateLen]; + TCHAR args2Exec[args2ExecLen]; + + extractArgs(cmdPure, args, _cmdLine.c_str()); + int nbTchar = ::ExpandEnvironmentStrings(cmdPure, cmdIntermediate, MAX_PATH); + if (!nbChar) + lstrcpy(cmdIntermediate, cmdPure); + else if (nbTchar >= MAX_PATH) + cmdIntermediate[MAX_PATH-1] = '\0'; + + nbTchar = ::ExpandEnvironmentStrings(args, argsIntermediate, argsIntermediateLen); + if (!nbChar) + lstrcpy(argsIntermediate, args); + else if (nbTchar >= argsIntermediateLen) + argsIntermediate[argsIntermediateLen-1] = '\0'; + + expandNppEnvironmentStrs(cmdIntermediate, cmd2Exec, MAX_PATH, hWnd); + expandNppEnvironmentStrs(argsIntermediate, args2Exec, args2ExecLen, hWnd); + + HINSTANCE res = ::ShellExecute(hWnd, TEXT("open"), cmd2Exec, args2Exec, TEXT("."), SW_SHOW); + return res; +} + +BOOL CALLBACK RunDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_COMMAND : + { + switch (wParam) + { + case IDCANCEL : + display(false); + return TRUE; + + case IDOK : + { + TCHAR cmd[MAX_PATH]; + ::GetDlgItemText(_hSelf, IDC_COMBO_RUN_PATH, cmd, MAX_PATH); + _cmdLine = cmd; + + HINSTANCE hInst = run(_hParent); + if (int(hInst) > 32) + { + addTextToCombo(_cmdLine.c_str()); + display(false); + } + else + { + removeTextFromCombo(_cmdLine.c_str()); + } + return TRUE; + } + case IDC_BUTTON_SAVE : + { + std::vector & theUserCmds = (NppParameters::getInstance())->getUserCommandList(); + + int nbCmd = theUserCmds.size(); + + int cmdID = ID_USER_CMD + nbCmd; + TCHAR cmd[MAX_PATH]; + ::GetDlgItemText(_hSelf, IDC_COMBO_RUN_PATH, cmd, MAX_PATH); + UserCommand uc(Shortcut(), cmd, cmdID); + uc.init(_hInst, _hSelf); + + if (uc.doDialog() != -1) + { + HMENU hRunMenu = ::GetSubMenu((HMENU)::SendMessage(_hParent, NPPM_INTERNAL_GETMENU, 0, 0), MENUINDEX_RUN); + int const posBase = 2; + + if (nbCmd == 0) + ::InsertMenu(hRunMenu, posBase - 1, MF_BYPOSITION, (unsigned int)-1, 0); + + theUserCmds.push_back(uc); + ::InsertMenu(hRunMenu, posBase + nbCmd, MF_BYPOSITION, cmdID, uc.toMenuItemString().c_str()); + (NppParameters::getInstance())->getAccelerator()->updateShortcuts(); + } + return TRUE; + } + case IDC_BUTTON_FILE_BROWSER : + { + FileDialog fd(_hSelf, _hInst); + fd.setExtFilter(TEXT("Executable file : "), TEXT(".exe"), TEXT(".com"), TEXT(".cmd"), TEXT(".bat"), NULL); + fd.setExtFilter(TEXT("All files : "), TEXT(".*"), NULL); + + if (const TCHAR *fn = fd.doOpenSingleFileDlg()) + addTextToCombo(fn); + return TRUE; + } + + default : + break; + } + } + } + return FALSE; +} + +void RunDlg::addTextToCombo(const TCHAR *txt2Add) const +{ + HWND handle = ::GetDlgItem(_hSelf, IDC_COMBO_RUN_PATH); + int i = ::SendMessage(handle, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)txt2Add); + if (i == CB_ERR) + i = ::SendMessage(handle, CB_ADDSTRING, 0, (LPARAM)txt2Add); + ::SendMessage(handle, CB_SETCURSEL, i, 0); +} +void RunDlg::removeTextFromCombo(const TCHAR *txt2Remove) const +{ + HWND handle = ::GetDlgItem(_hSelf, IDC_COMBO_RUN_PATH); + int i = ::SendMessage(handle, CB_FINDSTRINGEXACT, (WPARAM)-1, (LPARAM)txt2Remove); + if (i == CB_ERR) + return; + ::SendMessage(handle, CB_DELETESTRING, i, 0); +} + +void RunDlg::doDialog(bool isRTL) +{ + if (!isCreated()) + create(IDD_RUN_DLG, isRTL); + + // Adjust the position in the center + goToCenter(); + ::SetFocus(::GetDlgItem(_hSelf, IDC_COMBO_RUN_PATH)); +}; diff --git a/PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg.h b/PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg.h new file mode 100644 index 00000000..e21911f8 --- /dev/null +++ b/PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg.h @@ -0,0 +1,77 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef RUN_DLG_H +#define RUN_DLG_H + +#include "StaticDialog.h" +#include "RunDlg_rc.h" +#include +#include "Common.h" + +//static void extractArgs(TCHAR *cmd2Exec, TCHAR *args, const TCHAR *cmdEntier); + +using namespace std; + +#define CURRENTWORD_MAXLENGTH 2048 + +const TCHAR fullCurrentPath[] = TEXT("FULL_CURRENT_PATH"); +const TCHAR currentDirectory[] = TEXT("CURRENT_DIRECTORY"); +const TCHAR onlyFileName[] = TEXT("FILE_NAME"); +const TCHAR fileNamePart[] = TEXT("NAME_PART"); +const TCHAR fileExtPart[] = TEXT("EXT_PART"); +const TCHAR currentWord[] = TEXT("CURRENT_WORD"); +const TCHAR nppDir[] = TEXT("NPP_DIRECTORY"); +const TCHAR currentLine[] = TEXT("CURRENT_LINE"); +const TCHAR currentColumn[] = TEXT("CURRENT_COLUMN"); + +int whichVar(TCHAR *str); +void expandNppEnvironmentStrs(const TCHAR *strSrc, TCHAR *stringDest, size_t strDestLen, HWND hWnd); + +class Command { +public : + Command(){}; + Command(TCHAR *cmd) : _cmdLine(cmd){}; + Command(generic_string cmd) : _cmdLine(cmd){}; + HINSTANCE run(HWND hWnd); + +protected : + generic_string _cmdLine; +private : + void extractArgs(TCHAR *cmd2Exec, TCHAR *args, const TCHAR *cmdEntier); +}; + +class RunDlg : public Command, public StaticDialog +{ +public : + RunDlg() : StaticDialog() {}; + + void doDialog(bool isRTL = false); + + virtual void destroy() { + + }; + +protected : + virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + +private : + void addTextToCombo(const TCHAR *txt2Add) const; + void removeTextFromCombo(const TCHAR *txt2Remove) const; +}; + +#endif //RUN_DLG_H diff --git a/PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg.rc b/PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg.rc new file mode 100644 index 00000000..23dcedc2 --- /dev/null +++ b/PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg.rc @@ -0,0 +1,43 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + + +#include +#include "RunDlg_rc.h" + +#ifndef IDC_STATIC +#define IDC_STATIC -1 +#endif + +IDD_RUN_DLG DIALOGEX 0, 0, 196, 100 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | + WS_SYSMENU +EXSTYLE WS_EX_TOOLWINDOW +CAPTION "Run..." +FONT 8, TEXT("MS Shell Dlg"), 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "Run!",IDOK,16,74,47,14 + PUSHBUTTON "Cancel",IDCANCEL, 121,74,48,14 + PUSHBUTTON "...",IDC_BUTTON_FILE_BROWSER,154,30,16,14 + COMBOBOX IDC_COMBO_RUN_PATH,14,31,136,71,CBS_DROPDOWN | + CBS_AUTOHSCROLL | CBS_SORT | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Type your program to run here",IDC_MAINTEXT_STATIC,7,10, + 172,49,BS_CENTER + PUSHBUTTON "Save...",IDC_BUTTON_SAVE,68,74,50,14 +END diff --git a/PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg_rc.h b/PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg_rc.h new file mode 100644 index 00000000..1a44f317 --- /dev/null +++ b/PowerEditor/src/WinControls/StaticDialog/RunDlg/RunDlg_rc.h @@ -0,0 +1,5 @@ +#define IDD_RUN_DLG 1900 +#define IDC_BUTTON_FILE_BROWSER (IDD_RUN_DLG + 1) +#define IDC_COMBO_RUN_PATH (IDD_RUN_DLG + 2) +#define IDC_MAINTEXT_STATIC (IDD_RUN_DLG + 3) +#define IDC_BUTTON_SAVE (IDD_RUN_DLG + 4) diff --git a/PowerEditor/src/WinControls/StaticDialog/StaticDialog.cpp b/PowerEditor/src/WinControls/StaticDialog/StaticDialog.cpp new file mode 100644 index 00000000..9544f19f --- /dev/null +++ b/PowerEditor/src/WinControls/StaticDialog/StaticDialog.cpp @@ -0,0 +1,168 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "StaticDialog.h" +#include "Common.h" + +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); + + int x = center.x - (_rc.right - _rc.left)/2; + int y = center.y - (_rc.bottom - _rc.top)/2; + + ::SetWindowPos(_hSelf, HWND_TOP, x, y, _rc.right - _rc.left, _rc.bottom - _rc.top, SWP_SHOWWINDOW); +} + + +void StaticDialog::display(bool toShow) const +{ + 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, rc; + ::SystemParametersInfo(SPI_GETWORKAREA, 0, &workAreaRect, 0); + ::GetWindowRect(_hSelf, &rc); + 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) + newLeft = workAreaRect.left; + if (newTop > ::GetSystemMetrics(SM_CYVIRTUALSCREEN)-margin) + newTop -= rc.bottom - workAreaRect.bottom; + if (newTop + (rc.bottom - rc.top) < ::GetSystemMetrics(SM_YVIRTUALSCREEN)+margin) + newTop = workAreaRect.top; + + if ((newLeft != rc.left) || (newTop != rc.top)) // then the virtual screen size has shrunk + // Remember that MoveWindow wants width/height. + ::MoveWindow(_hSelf, newLeft, newTop, rc.right - rc.left, rc.bottom - rc.top, TRUE); + } + + Window::display(toShow); +} + + +HGLOBAL StaticDialog::makeRTLResource(int dialogID, DLGTEMPLATE **ppMyDlgTemplate) +{ + // Get Dlg Template resource + HRSRC hDialogRC = ::FindResource(_hInst, MAKEINTRESOURCE(dialogID), RT_DIALOG); + HGLOBAL hDlgTemplate = ::LoadResource(_hInst, hDialogRC); + DLGTEMPLATE *pDlgTemplate = (DLGTEMPLATE *)::LockResource(hDlgTemplate); + + // Duplicate Dlg Template resource + unsigned long sizeDlg = ::SizeofResource(_hInst, hDialogRC); + HGLOBAL hMyDlgTemplate = ::GlobalAlloc(GPTR, sizeDlg); + *ppMyDlgTemplate = (DLGTEMPLATE *)::GlobalLock(hMyDlgTemplate); + + ::memcpy(*ppMyDlgTemplate, pDlgTemplate, sizeDlg); + + DLGTEMPLATEEX *pMyDlgTemplateEx = (DLGTEMPLATEEX *)*ppMyDlgTemplate; + if (pMyDlgTemplateEx->signature == 0xFFFF) + pMyDlgTemplateEx->exStyle |= WS_EX_LAYOUTRTL; + else + (*ppMyDlgTemplate)->dwExtendedStyle |= WS_EX_LAYOUTRTL; + + return hMyDlgTemplate; +} + +void StaticDialog::create(int dialogID, bool isRTL) +{ + if (isRTL) + { + DLGTEMPLATE *pMyDlgTemplate = NULL; + HGLOBAL hMyDlgTemplate = makeRTLResource(dialogID, &pMyDlgTemplate); + _hSelf = ::CreateDialogIndirectParam(_hInst, pMyDlgTemplate, _hParent, (DLGPROC)dlgProc, (LPARAM)this); + ::GlobalFree(hMyDlgTemplate); + } + else + _hSelf = ::CreateDialogParam(_hInst, MAKEINTRESOURCE(dialogID), _hParent, (DLGPROC)dlgProc, (LPARAM)this); + + if (!_hSelf) + { + //systemMessage(TEXT("StaticDialog")); + //throw int(666); + return; + } + + ::SendMessage(_hParent, NPPM_MODELESSDIALOG, MODELESSDIALOGADD, (WPARAM)_hSelf); +} + +BOOL CALLBACK StaticDialog::dlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG : + { + StaticDialog *pStaticDlg = (StaticDialog *)(lParam); + pStaticDlg->_hSelf = hwnd; + ::SetWindowLongPtr(hwnd, GWL_USERDATA, (long)lParam); + ::GetWindowRect(hwnd, &(pStaticDlg->_rc)); + pStaticDlg->run_dlgProc(message, wParam, lParam); + + return TRUE; + } + + default : + { + StaticDialog *pStaticDlg = reinterpret_cast(::GetWindowLongPtr(hwnd, GWL_USERDATA)); + if (!pStaticDlg) + return FALSE; + return pStaticDlg->run_dlgProc(message, wParam, lParam); + } + } +} + +void StaticDialog::alignWith(HWND handle, HWND handle2Align, PosAlign pos, POINT & point) +{ + RECT rc, rc2; + ::GetWindowRect(handle, &rc); + + point.x = rc.left; + point.y = rc.top; + + switch (pos) + { + case ALIGNPOS_LEFT : + ::GetWindowRect(handle2Align, &rc2); + point.x -= rc2.right - rc2.left; + 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); +} diff --git a/PowerEditor/src/WinControls/StaticDialog/StaticDialog.h b/PowerEditor/src/WinControls/StaticDialog/StaticDialog.h new file mode 100644 index 00000000..9b42e1ff --- /dev/null +++ b/PowerEditor/src/WinControls/StaticDialog/StaticDialog.h @@ -0,0 +1,89 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef STATIC_DIALOG_H +#define STATIC_DIALOG_H + +//#include "resource.h" +#include "Window.h" +#include "Notepad_plus_msgs.h" + +#include + +typedef HRESULT (WINAPI * ETDTProc) (HWND, DWORD); + +enum PosAlign{ALIGNPOS_LEFT, ALIGNPOS_RIGHT, ALIGNPOS_TOP, ALIGNPOS_BOTTOM}; + +struct DLGTEMPLATEEX { + WORD dlgVer; + WORD signature; + DWORD helpID; + DWORD exStyle; + DWORD style; + WORD cDlgItems; + short x; + 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, GWL_USERDATA, (long)NULL); //Prevent run_dlgProc from doing anything, since its virtual + destroy(); + } + }; + virtual void create(int dialogID, bool isRTL = false); + + virtual bool isCreated() const { + return (_hSelf != NULL); + }; + + void goToCenter(); + + void display(bool toShow = true) const; + + POINT getLeftTopPoint(HWND hwnd/*, POINT & p*/) const { + RECT rc; + ::GetWindowRect(hwnd, &rc); + POINT p; + p.x = rc.left; + p.y = rc.top; + ::ScreenToClient(_hSelf, &p); + return p; + }; + + void destroy() { + ::SendMessage(_hParent, NPPM_MODELESSDIALOG, MODELESSDIALOGREMOVE, (WPARAM)_hSelf); + ::DestroyWindow(_hSelf); + }; + +protected : + RECT _rc; + static BOOL CALLBACK dlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); + virtual BOOL 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 diff --git a/PowerEditor/src/WinControls/StatusBar/StatusBar.cpp b/PowerEditor/src/WinControls/StatusBar/StatusBar.cpp new file mode 100644 index 00000000..b8897f4b --- /dev/null +++ b/PowerEditor/src/WinControls/StatusBar/StatusBar.cpp @@ -0,0 +1,77 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "StatusBar.h" +#include "Common.h" + +//#define IDC_STATUSBAR 789 + +const int defaultPartWidth = 5; + +void StatusBar::init(HINSTANCE hInst, HWND hPere, int nbParts) +{ + 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); + + if (!_hSelf) + { + systemMessage(TEXT("System Err")); + throw int(9); + } + + _nbParts = nbParts; + _partWidthArray = new int[_nbParts]; + + // Set the default width + for (int i = 0 ; i < _nbParts ; i++) + _partWidthArray[i] = defaultPartWidth; + + // Allocate an array for holding the right edge coordinates. + _hloc = ::LocalAlloc(LHND, sizeof(int) * _nbParts); + _lpParts = (LPINT)::LocalLock(_hloc); + + RECT rc; + ::GetClientRect(_hParent, &rc); + adjustParts(rc.right); +} + +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]; + } + + // Tell the status bar to create the window parts. + ::SendMessage(_hSelf, SB_SETPARTS, (WPARAM)_nbParts, (LPARAM)_lpParts); +} diff --git a/PowerEditor/src/WinControls/StatusBar/StatusBar.h b/PowerEditor/src/WinControls/StatusBar/StatusBar.h new file mode 100644 index 00000000..321bebba --- /dev/null +++ b/PowerEditor/src/WinControls/StatusBar/StatusBar.h @@ -0,0 +1,84 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef STATUS_BAR_H +#define STATUS_BAR_H +#include "Window.h" + +#ifndef _WIN32_IE +#define _WIN32_IE 0x0600 +#endif //_WIN32_IE + +#include + +class StatusBar : public Window +{ +public : + StatusBar() : Window(), _partWidthArray(NULL), _hloc(NULL), _lpParts(NULL) {}; + virtual ~StatusBar(){ + if (_hloc) + { + ::LocalUnlock(_hloc); + ::LocalFree(_hloc); + } + if (_partWidthArray) + delete [] _partWidthArray; + }; + + virtual void init(HINSTANCE hInst, HWND hPere, int nbParts); + + bool setPartWidth(int whichPart, int width) { + if (whichPart >= _nbParts) + return false; + + _partWidthArray[whichPart] = width; + return true; + }; + virtual void destroy() { + ::DestroyWindow(_hSelf); + }; + + virtual void reSizeTo(RECT & rc) { + ::MoveWindow(_hSelf, rc.left, rc.top, rc.right, rc.bottom, TRUE); + adjustParts(rc.right); + redraw(); + }; + + + int getHeight() const { + if (!::IsWindowVisible(_hSelf)) + return 0; + return Window::getHeight(); + }; + + bool setText(const TCHAR *str, int whichPart) const { + if (whichPart > _nbParts) + return false; + return (::SendMessage(_hSelf, SB_SETTEXT, whichPart, (LPARAM)str) == TRUE); + }; + + void adjustParts(int clientWidth); + +private : + int _nbParts; + int *_partWidthArray; + + HLOCAL _hloc; + LPINT _lpParts; +}; + +#endif // STATUS_BAR_H diff --git a/PowerEditor/src/WinControls/TabBar/ControlsTab.cpp b/PowerEditor/src/WinControls/TabBar/ControlsTab.cpp new file mode 100644 index 00000000..ec8e77be --- /dev/null +++ b/PowerEditor/src/WinControls/TabBar/ControlsTab.cpp @@ -0,0 +1,71 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + + +#include "ControlsTab.h" +/* +void ControlsTab::init(HINSTANCE hInst, HWND hwnd, bool isVertical, WindowVector & winVector) +{ + _isVertical = isVertical; + _pWinVector = &winVector; + + TabBar::init(hInst, hwnd, false, true); + for (int i = 0 ; i < winVector.size() ; i++) + TabBar::insertAtEnd(winVector[i]._name); + + TabBar::activateAt(0); + activateWindowAt(0); +} +*/ + + +void ControlsTab::createTabs(WindowVector & winVector) +{ + _pWinVector = &winVector; + + for (int i = 0 ; i < int(winVector.size()) ; i++) + TabBar::insertAtEnd(winVector[i]._name); + + TabBar::activateAt(0); + activateWindowAt(0); +} + +void ControlsTab::reSizeTo(RECT & rc) +{ + TabBar::reSizeTo(rc); + rc.left += marge; + rc.top += marge; + + //-- We do those dirty things + //-- because it's a "vertical" tab control + if (_isVertical) + { + rc.right -= 40; + rc.bottom -= 20; + if (getRowCount() == 2) + { + rc.right -= 20; + } + } + //-- end of dirty things + rc.bottom -= 55; + rc.right -= 20; + + (*_pWinVector)[_current]._dlg->reSizeTo(rc); + (*_pWinVector)[_current]._dlg->redraw(); + +}; diff --git a/PowerEditor/src/WinControls/TabBar/ControlsTab.h b/PowerEditor/src/WinControls/TabBar/ControlsTab.h new file mode 100644 index 00000000..eff6a718 --- /dev/null +++ b/PowerEditor/src/WinControls/TabBar/ControlsTab.h @@ -0,0 +1,110 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#ifndef CONTROLS_TAB_H +#define CONTROLS_TAB_H + +#include "TabBar.h" +#include "StaticDialog.h" +//#include "SplitterContainer.h" +#include + +struct DlgInfo { + Window *_dlg; + TCHAR _name[64]; + TCHAR _internalName[32]; + + DlgInfo(Window *dlg, TCHAR *name, TCHAR *internalName = NULL): _dlg(dlg) { + lstrcpy(_name, name); + if (!internalName) + _internalName[0] = '\0'; + else + lstrcpy(_internalName, internalName); + }; +}; + +typedef std::vector WindowVector; + +class ControlsTab : public TabBar +{ +public : + ControlsTab() : TabBar(), _pWinVector(NULL), _current(0), _isVertical(false) {}; + ~ControlsTab(){}; + //void init(HINSTANCE hInst, HWND pere, bool isVertical, WindowVector & winVector); + virtual void init(HINSTANCE hInst, HWND hwnd, bool isVertical = false, bool isTraditional = false, bool isMultiLine = false) { + _isVertical = isVertical; + //TabBar::init(hInst, hwnd, false, true); + TabBar::init(hInst, hwnd, false, isTraditional, isMultiLine); + }; + void ControlsTab::createTabs(WindowVector & winVector); + + void destroy() { + TabBar::destroy(); + }; + + virtual void reSizeTo(RECT & rc); + + void activateWindowAt(int index) + { + if (index == _current) return; + (*_pWinVector)[_current]._dlg->display(false); + (*_pWinVector)[index]._dlg->display(true); + _current = index; + }; + + void clickedUpdate() + { + int indexClicked = int(::SendMessage(_hSelf, TCM_GETCURSEL, 0, 0)); + activateWindowAt(indexClicked); + }; + + void renameTab(int index, const TCHAR *newName) { + TCITEM tie; + tie.mask = TCIF_TEXT; + tie.pszText = (TCHAR *)newName; + TabCtrl_SetItem(_hSelf, index, &tie); + }; + + bool renameTab(const TCHAR *internalName, const TCHAR *newName) { + bool foundIt = false; + size_t i = 0; + for ( ; i < _pWinVector->size() ; i++) + { + if (!lstrcmp((*_pWinVector)[i]._internalName, internalName)) + { + foundIt = true; + break; + } + } + if (!foundIt) + return false; + + renameTab(i, newName); + return true; + }; + +private : + WindowVector *_pWinVector; + int _current; + bool _isVertical; +}; + + + +#endif //CONTROLS_TAB_H diff --git a/PowerEditor/src/WinControls/TabBar/TabBar.cpp b/PowerEditor/src/WinControls/TabBar/TabBar.cpp new file mode 100644 index 00000000..fe0a5159 --- /dev/null +++ b/PowerEditor/src/WinControls/TabBar/TabBar.cpp @@ -0,0 +1,810 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "TabBar.h" +#include "Common.h" + +const COLORREF blue = RGB(0, 0, 0xFF); +const COLORREF black = RGB(0, 0, 0); +const COLORREF white = RGB(0xFF, 0xFF, 0xFF); +const COLORREF grey = RGB(128, 128, 128); + +#define IDC_DRAG_TAB 1404 +#define IDC_DRAG_INTERDIT_TAB 1405 +#define IDC_DRAG_PLUS_TAB 1406 +#define IDC_DRAG_OUT_TAB 1407 + +bool TabBarPlus::_doDragNDrop = false; + +bool TabBarPlus::_drawTopBar = true; +bool TabBarPlus::_drawInactiveTab = true; +bool TabBarPlus::_drawTabCloseButton = false; +bool TabBarPlus::_isDbClk2Close = false; +bool TabBarPlus::_isCtrlVertical = false; +bool TabBarPlus::_isCtrlMultiLine = false; + +COLORREF TabBarPlus::_activeTextColour = ::GetSysColor(COLOR_BTNTEXT); +COLORREF TabBarPlus::_activeTopBarFocusedColour = RGB(250, 170, 60); +COLORREF TabBarPlus::_activeTopBarUnfocusedColour = RGB(250, 210, 150); +COLORREF TabBarPlus::_inactiveTextColour = grey; +COLORREF TabBarPlus::_inactiveBgColour = RGB(192, 192, 192); + +HWND TabBarPlus::_hwndArray[nbCtrlMax] = {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; +int TabBarPlus::_nbCtrl = 0; + +void TabBar::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; + + INITCOMMONCONTROLSEX icce; + icce.dwSize = sizeof(icce); + icce.dwICC = ICC_TAB_CLASSES; + InitCommonControlsEx(&icce); + int multiLine = isMultiLine?(_isTraditional?TCS_MULTILINE:0):0; + + int style = WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE |\ + /* WS_BORDER |*/TCS_FOCUSNEVER | TCS_TABS | vertical | multiLine; + + _hSelf = ::CreateWindowEx( + 0/*TCS_EX_FLATSEPARATORS*/ , + WC_TABCONTROL, + TEXT("Tab"), + style, + 0, 0, 0, 0, + _hParent, + NULL, + _hInst, + 0); + + if (!_hSelf) + { + systemMessage(TEXT("System Err")); + throw int(69); + } +} + +int TabBar::insertAtEnd(const TCHAR *subTabName) +{ + TCITEM tie; + tie.mask = TCIF_TEXT | TCIF_IMAGE; + int index = -1; + + if (_hasImgLst) + index = 0; + 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.cchTextMax = titleLen-1; + ::SendMessage(_hSelf, TCM_GETITEM, getCurrentTabIndex(), reinterpret_cast(&tci)); +} + +void TabBar::deletItemAt(int index) { + if ((index == _nbItem-1)) { + //prevent invisible tabs. If last visible tab is removed, other tabs are put in view but not redrawn + //Therefore, scroll one tab to the left if only one tab visible + if (_nbItem > 1) { + 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 + //There seems to be no negative effect on any internal state of the tab control or the up/down control + int wParam = MAKEWPARAM(SB_THUMBPOSITION, index - 1); + ::SendMessage(_hSelf, WM_HSCROLL, wParam, 0); + + wParam = MAKEWPARAM(SB_ENDSCROLL, index - 1); + ::SendMessage(_hSelf, WM_HSCROLL, wParam, 0); + } + } + } + ::SendMessage(_hSelf, TCM_DELETEITEM, index, 0); + _nbItem--; + }; + +void TabBar::reSizeTo(RECT & rc2Ajust) +{ + RECT RowRect; + int RowCount, TabsLength; + + // Important to do that! + // Otherwise, the window(s) it contains will take all the resouce of CPU + // We don't need to resize the contained windows if they are even invisible anyway + display(rc2Ajust.right > 10); + RECT rc = rc2Ajust; + Window::reSizeTo(rc); + //TabCtrl_AdjustRect(_hSelf, FALSE, &rc2Ajust); + + // Do our own calculations because TabCtrl_AdjustRect doesn't work + // on vertical or multi-lined tab controls + + RowCount = TabCtrl_GetRowCount(_hSelf); + TabCtrl_GetItemRect(_hSelf, 0, &RowRect); + if (_isTraditional) + { + TabCtrl_AdjustRect(_hSelf, FALSE, &rc2Ajust); + } + else if (_isVertical) + { + TabsLength = RowCount * (RowRect.right - RowRect.left); + TabsLength += GetSystemMetrics(SM_CXEDGE); + + rc2Ajust.left += TabsLength + 5; + rc2Ajust.right -= TabsLength + 10; + rc2Ajust.top += 5; + rc2Ajust.bottom -= 10; + } + else + { + TabsLength = RowCount * (RowRect.bottom - RowRect.top); + TabsLength += GetSystemMetrics(SM_CYEDGE); + + rc2Ajust.top += TabsLength + 5; + rc2Ajust.bottom -= TabsLength + 10; + rc2Ajust.left += 5; + rc2Ajust.right -= 10; + } +} + +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; + + INITCOMMONCONTROLSEX icce; + icce.dwSize = sizeof(icce); + icce.dwICC = ICC_TAB_CLASSES; + InitCommonControlsEx(&icce); + int multiLine = isMultiLine?(_isTraditional?TCS_MULTILINE:0):0; + + int style = WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_VISIBLE |\ + TCS_TOOLTIPS | TCS_FOCUSNEVER | TCS_TABS | vertical | multiLine; + + //if (isOwnerDrawTab() && (!_isTraditional)) + { + style |= TCS_OWNERDRAWFIXED; + //printStr(TEXT("ownerDraw")); + } + _hSelf = ::CreateWindowEx( + /*TCS_EX_FLATSEPARATORS */0, + WC_TABCONTROL, + TEXT("Tab"), + style, + 0, 0, 0, 0, + _hParent, + NULL, + _hInst, + 0); + + if (!_hSelf) + { + systemMessage(TEXT("System Err")); + throw int(69); + } + if (!_isTraditional) + { + if (!_hwndArray[_nbCtrl]) + { + _hwndArray[_nbCtrl] = _hSelf; + _ctrlID = _nbCtrl; + } + else + { + int i = 0; + bool found = false; + for ( ; i < nbCtrlMax && !found ; i++) + if (!_hwndArray[i]) + found = true; + if (!found) + { + _ctrlID = -1; + ::MessageBox(NULL, TEXT("The nb of Tab Control is over its limit"), TEXT("Tab Control err"), MB_OK); + destroy(); + throw int(96); + } + _hwndArray[i] = _hSelf; + _ctrlID = i; + } + _nbCtrl++; + + ::SetWindowLongPtr(_hSelf, GWL_USERDATA, reinterpret_cast(this)); + _tabBarDefaultProc = reinterpret_cast(::SetWindowLongPtr(_hSelf, GWL_WNDPROC, reinterpret_cast(TabBarPlus_Proc))); + } + + 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); + + if (::GetObject(_hFont, sizeof(LOGFONT), &LogFont) != 0) + { + LogFont.lfEscapement = 900; + LogFont.lfOrientation = 900; + _hVerticalFont = CreateFontIndirect(&LogFont); + + LogFont.lfWeight = 900; + _hVerticalLargeFont = CreateFontIndirect(&LogFont); + } +} + +LRESULT TabBarPlus::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + // Custom window message to change tab control style on the fly + case WM_TABSETSTYLE: + { + DWORD style; + //::SendMessage(upDownWnd, UDM_SETBUDDY, NULL, 0); + 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); + + return TRUE; + } + + case WM_LBUTTONDOWN : + { + if (_drawTabCloseButton) + { + int xPos = LOWORD(lParam); + int yPos = HIWORD(lParam); + + if (_closeButtonZone.isHit(xPos, yPos, _currentHoverTabRect)) + { + _whichCloseClickDown = getTabIndexAt(xPos, yPos); + ::SendMessage(_hParent, WM_COMMAND, IDM_VIEW_REFRESHTABAR, 0); + return TRUE; + } + } + + ::CallWindowProc(_tabBarDefaultProc, hwnd, Message, wParam, lParam); + int currentTabOn = ::SendMessage(_hSelf, TCM_GETCURSEL, 0, 0); + + if (wParam == 2) + return TRUE; + + if (_doDragNDrop) + { + _nSrcTab = _nTabDragged = currentTabOn; + + POINT point; + point.x = LOWORD(lParam); + point.y = HIWORD(lParam); + if(::DragDetect(hwnd, point)) + { + // Yes, we're beginning to drag, so capture the mouse... + _isDragging = true; + ::SetCapture(hwnd); + } + } + + TBHDR nmhdr; + nmhdr.hdr.hwndFrom = _hSelf; + nmhdr.hdr.code = NM_CLICK; + nmhdr.hdr.idFrom = reinterpret_cast(this); + nmhdr.tabOrigin = currentTabOn; + + ::SendMessage(_hParent, WM_NOTIFY, 0, reinterpret_cast(&nmhdr)); + + return TRUE; + } + case WM_RBUTTONDOWN : //rightclick selects tab aswell + { + ::CallWindowProc(_tabBarDefaultProc, hwnd, WM_LBUTTONDOWN, wParam, lParam); + return TRUE; + } + + case WM_MOUSEMOVE : + { + if (_isDragging) + { + POINT p; + p.x = LOWORD(lParam); + p.y = HIWORD(lParam); + exchangeItemData(p); + + // Get cursor position of "Screen" + // For using the function "WindowFromPoint" afterward!!! + ::GetCursorPos(&_draggingPoint); + draggingCursor(_draggingPoint); + return TRUE; + } + + if (_drawTabCloseButton) + { + int xPos = LOWORD(lParam); + int yPos = HIWORD(lParam); + + int index = getTabIndexAt(xPos, yPos); + + if (index != -1) + { + // Reduce flicker by only redrawing needed tabs + + bool oldVal = _isCloseHover; + int oldIndex = _currentHoverTabItem; + RECT oldRect; + + ::SendMessage(_hSelf, TCM_GETITEMRECT, index, (LPARAM)&_currentHoverTabRect); + ::SendMessage(_hSelf, TCM_GETITEMRECT, oldIndex, (LPARAM)&oldRect); + _currentHoverTabItem = index; + _isCloseHover = _closeButtonZone.isHit(xPos, yPos, _currentHoverTabRect); + + if (oldVal != _isCloseHover) + { + InvalidateRect(hwnd, &oldRect, FALSE); + InvalidateRect(hwnd, &_currentHoverTabRect, FALSE); + } + } + } + break; + } + + case WM_LBUTTONUP : + { + int xPos = LOWORD(lParam); + int yPos = HIWORD(lParam); + int currentTabOn = getTabIndexAt(xPos, yPos); + if (_isDragging) + { + if(::GetCapture() == _hSelf) + ::ReleaseCapture(); + + // Send a notification message to the parent with wParam = 0, lParam = 0 + // nmhdr.idFrom = this + // destIndex = this->_nSrcTab + // scrIndex = this->_nTabDragged + TBHDR nmhdr; + nmhdr.hdr.hwndFrom = _hSelf; + nmhdr.hdr.code = _isDraggingInside?TCN_TABDROPPED:TCN_TABDROPPEDOUTSIDE; + nmhdr.hdr.idFrom = reinterpret_cast(this); + nmhdr.tabOrigin = currentTabOn; + + ::SendMessage(_hParent, WM_NOTIFY, 0, reinterpret_cast(&nmhdr)); + return TRUE; + } + + if (_drawTabCloseButton) + { + if ((_whichCloseClickDown == currentTabOn) && _closeButtonZone.isHit(xPos, yPos, _currentHoverTabRect)) + { + TBHDR nmhdr; + nmhdr.hdr.hwndFrom = _hSelf; + nmhdr.hdr.code = TCN_TABDELETE; + nmhdr.hdr.idFrom = reinterpret_cast(this); + nmhdr.tabOrigin = currentTabOn; + + ::SendMessage(_hParent, WM_NOTIFY, 0, reinterpret_cast(&nmhdr)); + + _whichCloseClickDown = -1; + return TRUE; + } + _whichCloseClickDown = -1; + } + + break; + } + + case WM_CAPTURECHANGED : + { + if (_isDragging) + { + _isDragging = false; + return TRUE; + } + break; + } + + case WM_DRAWITEM : + { + drawItem((DRAWITEMSTRUCT *)lParam); + return TRUE; + } + + case WM_KEYDOWN : + { + if (wParam == VK_LCONTROL) + ::SetCursor(::LoadCursor(_hInst, MAKEINTRESOURCE(IDC_DRAG_PLUS_TAB))); + return TRUE; + } + + case WM_MBUTTONUP: + { + int xPos = LOWORD(lParam); + int yPos = HIWORD(lParam); + int currentTabOn = getTabIndexAt(xPos, yPos); + TBHDR nmhdr; + nmhdr.hdr.hwndFrom = _hSelf; + nmhdr.hdr.code = TCN_TABDELETE; + nmhdr.hdr.idFrom = reinterpret_cast(this); + nmhdr.tabOrigin = currentTabOn; + + ::SendMessage(_hParent, WM_NOTIFY, 0, reinterpret_cast(&nmhdr)); + return TRUE; + } + + case WM_LBUTTONDBLCLK : + { + if (_isDbClk2Close) + { + int xPos = LOWORD(lParam); + int yPos = HIWORD(lParam); + int currentTabOn = getTabIndexAt(xPos, yPos); + TBHDR nmhdr; + nmhdr.hdr.hwndFrom = _hSelf; + nmhdr.hdr.code = TCN_TABDELETE; + nmhdr.hdr.idFrom = reinterpret_cast(this); + nmhdr.tabOrigin = currentTabOn; + + ::SendMessage(_hParent, WM_NOTIFY, 0, reinterpret_cast(&nmhdr)); + } + 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) + { + ::MessageBox(NULL, TEXT("nTab < 0"), TEXT(""), MB_OK); + //return ::CallWindowProc(_tabBarDefaultProc, hwnd, Message, wParam, lParam); + } + bool isSelected = (nTab == ::SendMessage(_hSelf, TCM_GETCURSEL, 0, 0)); + + TCHAR label[MAX_PATH]; + TCITEM tci; + tci.mask = TCIF_TEXT|TCIF_IMAGE; + tci.pszText = label; + tci.cchTextMax = MAX_PATH-1; + + if (!::SendMessage(_hSelf, TCM_GETITEM, nTab, reinterpret_cast(&tci))) + { + ::MessageBox(NULL, TEXT("! TCM_GETITEM"), TEXT(""), MB_OK); + //return ::CallWindowProc(_tabBarDefaultProc, hwnd, Message, wParam, lParam); + } + HDC hDC = pDrawItemStruct->hDC; + + int nSavedDC = ::SaveDC(hDC); + + ::SetBkMode(hDC, TRANSPARENT); + HBRUSH hBrush = ::CreateSolidBrush(::GetSysColor(COLOR_BTNFACE)); + ::FillRect(hDC, &rect, hBrush); + ::DeleteObject((HGDIOBJ)hBrush); + + if (isSelected) + { + if (_drawTopBar) + { + RECT barRect = rect; + + if (_isVertical) + { + barRect.right = barRect.left + 6; + rect.left += 2; + } + else + { + barRect.bottom = barRect.top + 6; + rect.top += 2; + } + + if (::SendMessage(_hParent, NPPM_INTERNAL_ISFOCUSEDTAB, 0, (LPARAM)_hSelf)) + hBrush = ::CreateSolidBrush(_activeTopBarFocusedColour); // #FAAA3C + else + hBrush = ::CreateSolidBrush(_activeTopBarUnfocusedColour); // #FAD296 + + ::FillRect(hDC, &barRect, hBrush); + ::DeleteObject((HGDIOBJ)hBrush); + } + } + else + { + if (_drawInactiveTab) + { + RECT barRect = rect; + + hBrush = ::CreateSolidBrush(_inactiveBgColour); + ::FillRect(hDC, &barRect, hBrush); + ::DeleteObject((HGDIOBJ)hBrush); + } + } + + if (_drawTabCloseButton) + { + RECT closeButtonRect = _closeButtonZone.getButtonRectFrom(rect); + if (isSelected) + { + if (!_isVertical) + { + //closeButtonRect.top += 2; + closeButtonRect.left -= 2; + } + } + else + { + if (_isVertical) + closeButtonRect.left += 2; + } + + + // 3 status for each inactive tab and selected tab close item : + // normal / hover / pushed + int idCloseImg; + + if (_isCloseHover && (_currentHoverTabItem == nTab) && (_whichCloseClickDown == -1)) // hover + idCloseImg = IDR_CLOSETAB_HOVER; + else if (_isCloseHover && (_currentHoverTabItem == nTab) && (_whichCloseClickDown == _currentHoverTabItem)) // pushed + idCloseImg = IDR_CLOSETAB_PUSH; + else + idCloseImg = isSelected?IDR_CLOSETAB:IDR_CLOSETAB_INACT; + + + HDC hdcMemory; + hdcMemory = ::CreateCompatibleDC(hDC); + HBITMAP hBmp = ::LoadBitmap(_hInst, MAKEINTRESOURCE(idCloseImg)); + BITMAP bmp; + ::GetObject(hBmp, sizeof(bmp), &bmp); + + if (_isVertical) + rect.top = closeButtonRect.top + bmp.bmHeight; + else + rect.right = closeButtonRect.left; + + ::SelectObject(hdcMemory, hBmp); + ::BitBlt(hDC, closeButtonRect.left, closeButtonRect.top, bmp.bmWidth, bmp.bmHeight, hdcMemory, 0, 0, SRCCOPY); + ::DeleteDC(hdcMemory); + ::DeleteObject(hBmp); + } + + // Draw image + HIMAGELIST hImgLst = (HIMAGELIST)::SendMessage(_hSelf, TCM_GETIMAGELIST, 0, 0); + + SIZE charPixel; + ::GetTextExtentPoint(hDC, TEXT(" "), 1, &charPixel); + int spaceUnit = charPixel.cx; + + 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; + + if (_isVertical) + xPos = (rect.left + (rect.right - rect.left)/2 + 2) - (imageRect.right - imageRect.left)/2; + else + yPos = (rect.top + (rect.bottom - rect.top)/2 + (isSelected?0:2)) - (imageRect.bottom - imageRect.top)/2; + + if (isSelected) + marge = spaceUnit*2; + else + marge = spaceUnit; + + if (_isVertical) + { + rect.bottom -= imageRect.bottom - imageRect.top; + ImageList_Draw(hImgLst, tci.iImage, hDC, xPos, rect.bottom - marge, isSelected?ILD_TRANSPARENT:ILD_SELECTED); + rect.bottom += marge; + } + else + { + rect.left += marge; + ImageList_Draw(hImgLst, tci.iImage, hDC, rect.left, yPos, isSelected?ILD_TRANSPARENT:ILD_SELECTED); + rect.left += imageRect.right - imageRect.left; + } + } + + bool isStandardSize = (::SendMessage(_hParent, NPPM_INTERNAL_ISTABBARREDUCED, 0, 0) == TRUE); + + if (isStandardSize) + { + if (_isVertical) + SelectObject(hDC, _hVerticalFont); + else + SelectObject(hDC, _hFont); + } + else + { + if (_isVertical) + SelectObject(hDC, _hVerticalLargeFont); + else + SelectObject(hDC, _hLargeFont); + } + + int Flags = DT_SINGLELINE; + + if (_drawTabCloseButton) + { + Flags |= DT_LEFT; + } + else + { + if (!_isVertical) + Flags |= DT_CENTER; + } + + // the following uses pixel values the fix alignments issues with DrawText + // and font's that are rotated 90 degrees + if (isSelected) + { + //COLORREF selectedColor = RGB(0, 0, 255); + ::SetTextColor(hDC, _activeTextColour); + + if (_isVertical) + { + rect.bottom -= 2; + rect.left += ::GetSystemMetrics(SM_CXEDGE) + 4; + rect.top += (_drawTabCloseButton)?spaceUnit:0; + } + else + { + rect.top -= ::GetSystemMetrics(SM_CYEDGE); + rect.top += 3; + rect.left += _drawTabCloseButton?spaceUnit:0; + } + + if (!_isVertical) + Flags |= DT_VCENTER; + else + Flags |= DT_BOTTOM; + } + else + { + ::SetTextColor(hDC, _inactiveTextColour); + if (_isVertical) + { + rect.top += 2; + rect.bottom += 4; + rect.left += ::GetSystemMetrics(SM_CXEDGE) + 2; + } + else + { + rect.left += (_drawTabCloseButton)?spaceUnit:0; + } + + if (!_isVertical) + Flags |= DT_BOTTOM; + else + Flags |= DT_BOTTOM; + } + ::DrawText(hDC, label, lstrlen(label), &rect, Flags); + ::RestoreDC(hDC, nSavedDC); +} + + +void TabBarPlus::draggingCursor(POINT screenPoint) +{ + HWND hWin = ::WindowFromPoint(screenPoint); + if (_hSelf == hWin) + ::SetCursor(::LoadCursor(NULL, IDC_ARROW)); + else + { + TCHAR className[256]; + ::GetClassName(hWin, className, 256); + if ((!lstrcmp(className, TEXT("Scintilla"))) || (!lstrcmp(className, WC_TABCONTROL))) + { + if (::GetKeyState(VK_LCONTROL) & 0x80000000) + ::SetCursor(::LoadCursor(_hInst, MAKEINTRESOURCE(IDC_DRAG_PLUS_TAB))); + else + ::SetCursor(::LoadCursor(_hInst, MAKEINTRESOURCE(IDC_DRAG_TAB))); + } + else if (isPointInParentZone(screenPoint)) + ::SetCursor(::LoadCursor(_hInst, MAKEINTRESOURCE(IDC_DRAG_INTERDIT_TAB))); + else // drag out of application + ::SetCursor(::LoadCursor(_hInst, MAKEINTRESOURCE(IDC_DRAG_OUT_TAB))); + } +} + +void TabBarPlus::exchangeItemData(POINT point) +{ + // Find the destination tab... + int nTab = getTabIndexAt(point); + + // The position is over a tab. + //if (hitinfo.flags != TCHT_NOWHERE) + if (nTab != -1) + { + _isDraggingInside = true; + + if (nTab != _nTabDragged) + { + //1. set to focus + ::SendMessage(_hSelf, TCM_SETCURSEL, nTab, 0); + + //2. shift their data, and insert the source + TCITEM itemData_nDraggedTab, itemData_shift; + itemData_nDraggedTab.mask = itemData_shift.mask = TCIF_IMAGE | TCIF_TEXT | TCIF_PARAM; + const int stringSize = 256; + TCHAR str1[stringSize]; + TCHAR str2[stringSize]; + + itemData_nDraggedTab.pszText = str1; + itemData_nDraggedTab.cchTextMax = (stringSize); + + itemData_shift.pszText = str2; + itemData_shift.cchTextMax = (stringSize); + + ::SendMessage(_hSelf, TCM_GETITEM, _nTabDragged, reinterpret_cast(&itemData_nDraggedTab)); + + if (_nTabDragged > nTab) + { + for (int i = _nTabDragged ; i > nTab ; i--) + { + ::SendMessage(_hSelf, TCM_GETITEM, i-1, reinterpret_cast(&itemData_shift)); + ::SendMessage(_hSelf, TCM_SETITEM, i, reinterpret_cast(&itemData_shift)); + } + } + else + { + for (int i = _nTabDragged ; i < nTab ; i++) + { + ::SendMessage(_hSelf, TCM_GETITEM, i+1, reinterpret_cast(&itemData_shift)); + ::SendMessage(_hSelf, TCM_SETITEM, i, reinterpret_cast(&itemData_shift)); + } + } + // + ::SendMessage(_hSelf, TCM_SETITEM, nTab, reinterpret_cast(&itemData_nDraggedTab)); + + //3. update the current index + _nTabDragged = nTab; + + } + } + else + { + //::SetCursor(::LoadCursor(_hInst, MAKEINTRESOURCE(IDC_DRAG_TAB))); + _isDraggingInside = false; + } + +} diff --git a/PowerEditor/src/WinControls/TabBar/TabBar.h b/PowerEditor/src/WinControls/TabBar/TabBar.h new file mode 100644 index 00000000..eb5399b6 --- /dev/null +++ b/PowerEditor/src/WinControls/TabBar/TabBar.h @@ -0,0 +1,382 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef TAB_BAR_H +#define TAB_BAR_H + +#include "Window.h" + +#ifndef _WIN32_IE +#define _WIN32_IE 0x0600 +#endif //_WIN32_IE + +//Notification message +#define TCN_TABDROPPED (TCN_FIRST - 10) +#define TCN_TABDROPPEDOUTSIDE (TCN_FIRST - 11) +#define TCN_TABDELETE (TCN_FIRST - 12) + +#define WM_TABSETSTYLE (WM_APP + 0x024) + +const int marge = 8; +const int nbCtrlMax = 10; + +#include +#include "menuCmdID.h" +#include "resource.h" + +const TCHAR TABBAR_ACTIVEFOCUSEDINDCATOR[64] = TEXT("Active tab focused indicator"); +const TCHAR TABBAR_ACTIVEUNFOCUSEDINDCATOR[64] = TEXT("Active tab unfocused indicator"); +const TCHAR TABBAR_ACTIVETEXT[64] = TEXT("Active tab text"); +const TCHAR TABBAR_INACTIVETEXT[64] = TEXT("Inactive tabs"); + +struct TBHDR { + NMHDR hdr; + int tabOrigin; +}; + +class TabBar : public Window +{ +public: + TabBar() : Window(), _nbItem(0), _hasImgLst(false), _hFont(NULL){}; + + virtual ~TabBar() {}; + + virtual void destroy(){ + if (_hFont) + DeleteObject(_hFont); + + if (_hLargeFont) + DeleteObject(_hLargeFont); + + if (_hVerticalFont) + DeleteObject(_hVerticalFont); + + if (_hVerticalLargeFont) + DeleteObject(_hVerticalLargeFont); + + ::DestroyWindow(_hSelf); + _hSelf = NULL; + }; + + virtual void init(HINSTANCE hInst, HWND hwnd, bool isVertical = false, bool isTraditional = false, bool isMultiLine = false); + + virtual void reSizeTo(RECT & rc2Ajust); + + int insertAtEnd(const TCHAR *subTabName); + + void activateAt(int index) const { + if (getCurrentTabIndex() != index) { + ::SendMessage(_hSelf, TCM_SETCURSEL, index, 0);} + TBHDR nmhdr; + nmhdr.hdr.hwndFrom = _hSelf; + nmhdr.hdr.code = TCN_SELCHANGE; + nmhdr.hdr.idFrom = reinterpret_cast(this); + nmhdr.tabOrigin = index; + + }; + void getCurrentTitle(TCHAR *title, int titleLen); + + int getCurrentTabIndex() const { + return ::SendMessage(_hSelf, TCM_GETCURSEL, 0, 0); + }; + void deletItemAt(int index); + + void deletAllItem() { + ::SendMessage(_hSelf, TCM_DELETEALLITEMS, 0, 0); + _nbItem = 0; + }; + + void setImageList(HIMAGELIST himl) { + _hasImgLst = true; + ::SendMessage(_hSelf, TCM_SETIMAGELIST, 0, (LPARAM)himl); + }; + + int nbItem() const { + return _nbItem; + }; + + void setFont(TCHAR *fontName, size_t fontSize) { + if (_hFont) + ::DeleteObject(_hFont); + + _hFont = ::CreateFont( fontSize, 0, + (_isVertical) ? 900:0, + (_isVertical) ? 900:0, + FW_NORMAL, + 0, 0, 0, 0, + 0, 0, 0, 0, + fontName); + if (_hFont) + ::SendMessage(_hSelf, WM_SETFONT, reinterpret_cast(_hFont), 0); + }; + + void setVertical(bool b) { + _isVertical = b; + }; + + void setMultiLine(bool b) { + _isMultiLine = b; + }; + + +protected: + size_t _nbItem; + bool _hasImgLst; + HFONT _hFont; + HFONT _hLargeFont; + HFONT _hVerticalFont; + HFONT _hVerticalLargeFont; + + int _ctrlID; + bool _isTraditional; + + bool _isVertical; + bool _isMultiLine; + + long getRowCount() const { + return long(::SendMessage(_hSelf, TCM_GETROWCOUNT, 0, 0)); + }; +}; + + +struct CloseButtonZone { + + CloseButtonZone(): _width(11), _hight(11), _fromTop(5), _fromRight(3){}; + + bool isHit(int x, int y, const RECT & testZone) const { + if (((x + _width + _fromRight) < testZone.right) || (x > (testZone.right - _fromRight))) + return false; + + if (((y - _hight - _fromTop) > testZone.top) || (y < (testZone.top + _fromTop))) + return false; + + return true; + }; + + RECT getButtonRectFrom(const RECT & tabItemRect) const { + RECT rect; + rect.right = tabItemRect.right - _fromRight; + rect.left = rect.right - _width; + rect.top = tabItemRect.top + _fromTop; + rect.bottom = rect.top + _hight; + + return rect; + }; + + int _width; + int _hight; + + int _fromTop; // distance from top in pixzl + 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) {}; + enum tabColourIndex { + activeText, activeFocusedTop, activeUnfocusedTop, inactiveText, inactiveBg + }; + + static void doDragNDrop(bool justDoIt) { + _doDragNDrop = justDoIt; + }; + + virtual void init(HINSTANCE hInst, HWND hwnd, bool isVertical = false, bool isTraditional = false, bool isMultiLine = false); + + static bool doDragNDropOrNot() { + return _doDragNDrop; + }; + + int getSrcTabIndex() const { + return _nSrcTab; + }; + + int getTabDraggedIndex() const { + return _nTabDragged; + }; + + POINT getDraggingPoint() const { + return _draggingPoint; + }; + + static void doOwnerDrawTab() { + ::SendMessage(_hwndArray[0], TCM_SETPADDING, 0, MAKELPARAM(6, 0)); + for (int i = 0 ; i < _nbCtrl ; i++) + { + if (_hwndArray[i]) + { + DWORD style = ::GetWindowLongPtr(_hwndArray[i], GWL_STYLE); + if (isOwnerDrawTab()) + style |= TCS_OWNERDRAWFIXED; + else + style &= ~TCS_OWNERDRAWFIXED; + + ::SetWindowLongPtr(_hwndArray[i], GWL_STYLE, style); + ::InvalidateRect(_hwndArray[i], NULL, TRUE); + + const int base = 6; + ::SendMessage(_hwndArray[i], TCM_SETPADDING, 0, MAKELPARAM(_drawTabCloseButton?base+3:base, 0)); + } + } + }; + + static void doVertical() { + for (int i = 0 ; i < _nbCtrl ; i++) + { + if (_hwndArray[i]) + SendMessage(_hwndArray[i], WM_TABSETSTYLE, isVertical(), TCS_VERTICAL); + } + }; + + static void doMultiLine() { + for (int i = 0 ; i < _nbCtrl ; i++) + { + if (_hwndArray[i]) + SendMessage(_hwndArray[i], WM_TABSETSTYLE, isMultiLine(), TCS_MULTILINE); + } + }; + + static bool isOwnerDrawTab() {return true;};//(_drawInactiveTab || _drawTopBar || _drawTabCloseButton);}; + static bool drawTopBar() {return _drawTopBar;}; + static bool drawInactiveTab() {return _drawInactiveTab;}; + static bool drawTabCloseButton() {return _drawTabCloseButton;}; + static bool isDbClk2Close() {return _isDbClk2Close;}; + static bool isVertical() { return _isCtrlVertical;}; + static bool isMultiLine() { return _isCtrlMultiLine;}; + + 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) { + switch (i) + { + case activeText: + _activeTextColour = colour2Set; + break; + case activeFocusedTop: + _activeTopBarFocusedColour = colour2Set; + break; + case activeUnfocusedTop: + _activeTopBarUnfocusedColour = colour2Set; + break; + case inactiveText: + _inactiveTextColour = colour2Set; + break; + case inactiveBg : + _inactiveBgColour = colour2Set; + break; + default : + return; + } + doOwnerDrawTab(); + }; + +protected: + // it's the boss to decide if we do the drag N drop + static bool _doDragNDrop; + // drag N drop members + bool _isDragging; + bool _isDraggingInside; + int _nSrcTab; + int _nTabDragged; + POINT _draggingPoint; // coordinate of Screen + WNDPROC _tabBarDefaultProc; + + RECT _currentHoverTabRect; + int _currentHoverTabItem; + + CloseButtonZone _closeButtonZone; + bool _isCloseHover; + int _whichCloseClickDown; + bool _lmbdHit; // Left Mouse Button Down Hit + + LRESULT runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); + + static LRESULT CALLBACK TabBarPlus_Proc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { + return (((TabBarPlus *)(::GetWindowLongPtr(hwnd, GWL_USERDATA)))->runProc(hwnd, Message, wParam, lParam)); + }; + void exchangeItemData(POINT point); + + + // it's the boss to decide if we do the ownerDraw style tab + static bool _drawInactiveTab; + static bool _drawTopBar; + static bool _drawTabCloseButton; + static bool _isDbClk2Close; + static bool _isCtrlVertical; + static bool _isCtrlMultiLine; + + static COLORREF _activeTextColour; + static COLORREF _activeTopBarFocusedColour; + static COLORREF _activeTopBarUnfocusedColour; + static COLORREF _inactiveTextColour; + static COLORREF _inactiveBgColour; + + static int _nbCtrl; + static HWND _hwndArray[nbCtrlMax]; + + void drawItem(DRAWITEMSTRUCT *pDrawItemStruct); + void draggingCursor(POINT screenPoint); + + int getTabIndexAt(const POINT & p) { + return getTabIndexAt(p.x, p.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 { + 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/TaskList/TaskList.cpp b/PowerEditor/src/WinControls/TaskList/TaskList.cpp new file mode 100644 index 00000000..8ac27f3a --- /dev/null +++ b/PowerEditor/src/WinControls/TaskList/TaskList.cpp @@ -0,0 +1,243 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "TaskList.h" +#include "TaskListDlg_rc.h" +#include "colors.h" +#include "Common.h" + +void TaskList::init(HINSTANCE hInst, HWND parent, HIMAGELIST hImaLst, int nbItem, int index2set) +{ + Window::init(hInst, parent); + + _currentIndex = index2set; + + INITCOMMONCONTROLSEX icex; + + // Ensure that the common control DLL is loaded. + icex.dwSize = sizeof(INITCOMMONCONTROLSEX); + icex.dwICC = ICC_LISTVIEW_CLASSES; + InitCommonControlsEx(&icex); + + _nbItem = nbItem; + + // Create the list-view window in report view with label editing enabled. + int listViewStyles = LVS_REPORT | LVS_OWNERDATA | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER\ + | LVS_NOSCROLL | LVS_SINGLESEL | LVS_AUTOARRANGE | LVS_OWNERDRAWFIXED\ + | LVS_SHAREIMAGELISTS/* | WS_BORDER*/; + + _hSelf = ::CreateWindow(WC_LISTVIEW, + TEXT(""), + WS_CHILD | listViewStyles, + 0, + 0, + 0, + 0, + _hParent, + (HMENU) NULL, + hInst, + NULL); + if (!_hSelf) + { + systemMessage(TEXT("System Err")); + throw int(69); + } + + ::SetWindowLongPtr(_hSelf, GWL_USERDATA, reinterpret_cast(this)); + _defaultProc = reinterpret_cast(::SetWindowLongPtr(_hSelf, GWL_WNDPROC, reinterpret_cast(staticProc))); + + DWORD exStyle = ListView_GetExtendedListViewStyle(_hSelf); + exStyle |= LVS_EX_FULLROWSELECT | LVS_EX_BORDERSELECT ; + ListView_SetExtendedListViewStyle(_hSelf, exStyle); + + + LVCOLUMN lvColumn; + lvColumn.mask = LVCF_WIDTH; + + lvColumn.cx = 1500; + + ListView_InsertColumn(_hSelf, 0, &lvColumn); + + ListView_SetItemCountEx(_hSelf, _nbItem, LVSICF_NOSCROLL); + ListView_SetImageList(_hSelf, hImaLst, LVSIL_SMALL); + + ListView_SetItemState(_hSelf, _currentIndex, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); + ListView_SetBkColor(_hSelf, veryLiteGrey); + ListView_SetTextBkColor(_hSelf, veryLiteGrey); +} + +RECT TaskList::adjustSize() +{ + RECT rc; + ListView_GetItemRect(_hSelf, 0, &rc, LVIR_ICON); + const int imgWidth = rc.right - rc.left; + const int marge = 30; + + for (int i = 0 ; i < _nbItem ; i++) + { + TCHAR buf[MAX_PATH]; + ListView_GetItemText(_hSelf, i, 0, buf, MAX_PATH); + int width = ListView_GetStringWidth(_hSelf, buf); + + if (width > (_rc.right - _rc.left)) + _rc.right = _rc.left + width + imgWidth + marge; + + _rc.bottom += rc.bottom - rc.top; + + } + + // additional space for horizontal scroll-bar + _rc.bottom += rc.bottom - rc.top; + + reSizeTo(_rc); + return _rc; +} + +int TaskList::updateCurrentIndex() +{ + for (int i = 0 ; i < _nbItem ; i++) + { + int isSelected = ListView_GetItemState(_hSelf, i, LVIS_SELECTED); + if (isSelected == LVIS_SELECTED) + { + _currentIndex = i; + return _currentIndex; + } + } + return _currentIndex; +} + +LRESULT TaskList::runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_KEYUP: + { + if (wParam == VK_CONTROL) + { + ::SendMessage(_hParent, WM_COMMAND, ID_PICKEDUP, _currentIndex); + } + } + return TRUE; + + case WM_MOUSEWHEEL : + { + //if (LOWORD(wParam) & MK_RBUTTON) + // It's not easy to press RBUTTON while moving a mouse wheel and holding CTRL :-) + // Actually, I thought MOUSEWHEEL is not working until I saw this code + { + short zDelta = (short) HIWORD(wParam); + if (zDelta > 0) + { + size_t selected = (_currentIndex - 1) < 0 ? (_nbItem - 1) : (_currentIndex - 1); + ListView_SetItemState(_hSelf, _currentIndex, 0, LVIS_SELECTED|LVIS_FOCUSED); + // tells what item(s) to be repainted + ListView_RedrawItems(_hSelf, _currentIndex, _currentIndex); + // repaint item(s) + UpdateWindow(_hSelf); + ListView_SetItemState(_hSelf, selected, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); + // tells what item(s) to be repainted + ListView_RedrawItems(_hSelf, selected, selected); + // repaint item(s) + UpdateWindow(_hSelf); + _currentIndex = selected; + } + else + { + size_t selected = (_currentIndex + 1) > (_nbItem - 1) ? 0 : (_currentIndex + 1); + ListView_SetItemState(_hSelf, _currentIndex, 0, LVIS_SELECTED|LVIS_FOCUSED); + // tells what item(s) to be repainted + ListView_RedrawItems(_hSelf, _currentIndex, _currentIndex); + // repaint item(s) + UpdateWindow(_hSelf); + ListView_SetItemState(_hSelf, selected, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); + // tells what item(s) to be repainted + ListView_RedrawItems(_hSelf, selected, selected); + // repaint item(s) + UpdateWindow(_hSelf); + _currentIndex = selected; + } + } + return TRUE; + } + + case WM_KEYDOWN : + { + //printStr(TEXT("WM_KEYDOWN")); + return TRUE; + } + + + case WM_GETDLGCODE : + { + MSG *msg = (MSG*)lParam; + + if ( msg != NULL) + { + if ((msg->message == WM_KEYDOWN) && (0x80 & GetKeyState(VK_CONTROL))) + { + // Shift+Tab is cool but I think VK_UP and VK_LEFT are also cool :-) + if (((msg->wParam == VK_TAB) && (0x80 & GetKeyState(VK_SHIFT))) || + (msg->wParam == VK_UP)) + { + size_t selected = (_currentIndex - 1) < 0 ? (_nbItem - 1) : (_currentIndex - 1); + ListView_SetItemState(_hSelf, _currentIndex, 0, LVIS_SELECTED|LVIS_FOCUSED); + // tells what item(s) to be repainted + ListView_RedrawItems(_hSelf, _currentIndex, _currentIndex); + // repaint item(s) + UpdateWindow(_hSelf); + ListView_SetItemState(_hSelf, selected, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); + // tells what item(s) to be repainted + ListView_RedrawItems(_hSelf, selected, selected); + // repaint item(s) + UpdateWindow(_hSelf); + _currentIndex = selected; + } + // VK_DOWN and VK_RIGHT do the same as VK_TAB does + else if ((msg->wParam == VK_TAB) || (msg->wParam == VK_DOWN)) + { + size_t selected = (_currentIndex + 1) > (_nbItem - 1) ? 0 : (_currentIndex + 1); + ListView_SetItemState(_hSelf, _currentIndex, 0, LVIS_SELECTED|LVIS_FOCUSED); + // tells what item(s) to be repainted + ListView_RedrawItems(_hSelf, _currentIndex, _currentIndex); + // repaint item(s) + UpdateWindow(_hSelf); + ListView_SetItemState(_hSelf, selected, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED); + // tells what item(s) to be repainted + ListView_RedrawItems(_hSelf, selected, selected); + // repaint item(s) + UpdateWindow(_hSelf); + _currentIndex = selected; + } + } + else + { + //printStr(TEXT("else")); + return TRUE; + } + //return DLGC_WANTALLKEYS ; + + } + return DLGC_WANTALLKEYS ; + } + + default : + return ::CallWindowProc(_defaultProc, hwnd, Message, wParam, lParam); + } + return FALSE; +} + diff --git a/PowerEditor/src/WinControls/TaskList/TaskList.h b/PowerEditor/src/WinControls/TaskList/TaskList.h new file mode 100644 index 00000000..647ef4c2 --- /dev/null +++ b/PowerEditor/src/WinControls/TaskList/TaskList.h @@ -0,0 +1,89 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef TASKLIST_H +#define TASKLIST_H + +#include "Window.h" + +#ifndef WM_MOUSEWHEEL +#define WM_MOUSEWHEEL 0x020A +#endif //WM_MOUSEWHEEL + +#include + +class TaskList : public Window +{ +public: + TaskList() : Window(), _currentIndex(0) { + _rc.left = 0; + _rc.top = 0; + _rc.right = 150; + _rc.bottom = 0; + }; + + virtual ~TaskList() {}; + + virtual void destroy(){ + if (_hFont) + DeleteObject(_hFont); + ::DestroyWindow(_hSelf); + _hSelf = NULL; + }; + + void init(HINSTANCE hInst, HWND hwnd, HIMAGELIST hImaLst, int nbItem, int index2set); + + void setFont(TCHAR *fontName, size_t fontSize) { + if (_hFont) + ::DeleteObject(_hFont); + + _hFont = ::CreateFont( fontSize, 0, 0, 0, + FW_NORMAL, + 0, 0, 0, 0, + 0, 0, 0, 0, + fontName); + if (_hFont) + ::SendMessage(_hSelf, WM_SETFONT, reinterpret_cast(_hFont), 0); + }; + + + RECT adjustSize(); + int getCurrentIndex() const { + return _currentIndex; + }; + int updateCurrentIndex(); + + HIMAGELIST getImgLst() const { + return ListView_GetImageList(_hSelf, LVSIL_SMALL); + }; +protected: + + WNDPROC _defaultProc; + LRESULT runProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam); + + static LRESULT CALLBACK staticProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { + return (((TaskList *)(::GetWindowLongPtr(hwnd, GWL_USERDATA)))->runProc(hwnd, Message, wParam, lParam)); + }; + + HFONT _hFont; + int _nbItem; + int _currentIndex; + RECT _rc; +}; + + +#endif // TASKLIST_H diff --git a/PowerEditor/src/WinControls/TaskList/TaskListDlg.h b/PowerEditor/src/WinControls/TaskList/TaskListDlg.h new file mode 100644 index 00000000..6d29f341 --- /dev/null +++ b/PowerEditor/src/WinControls/TaskList/TaskListDlg.h @@ -0,0 +1,255 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef TASKLISTDLG_H +#define TASKLISTDLG_H + +#include "StaticDialog.h" +#include "TaskListDlg_rc.h" +#include "TaskList.h" +#include "ImageListSet.h" +#include "Notepad_plus_msgs.h" + +const bool dirUp = true; +const bool dirDown = false; + +#define TASKLIST_USER (WM_USER + 8000) + #define WM_GETTASKLISTINFO (TASKLIST_USER + 01) + +struct TaskLstFnStatus { + int _iView; + int _docIndex; + generic_string _fn; + int _status; + TaskLstFnStatus(generic_string str, int status) : _fn(str), _status(status){}; + TaskLstFnStatus(int iView, int docIndex, generic_string str, int status) : _iView(iView), _docIndex(docIndex), _fn(str), _status(status) {}; +}; + +struct TaskListInfo { + vector _tlfsLst; + int _currentIndex; +}; + +static HWND hWndServer = NULL; +static HHOOK hook = NULL; + +static LRESULT CALLBACK hookProc(UINT nCode, WPARAM wParam, LPARAM lParam) +{ + if ((nCode >= 0) && (wParam == WM_RBUTTONUP)) + { + ::PostMessage(hWndServer, WM_RBUTTONUP, 0, 0); + } + + return ::CallNextHookEx(hook, nCode, wParam, lParam); +}; + +class TaskListDlg : public StaticDialog +{ +public : + TaskListDlg() : StaticDialog() {}; + void init(HINSTANCE hInst, HWND parent, HIMAGELIST hImgLst, bool dir) { + Window::init(hInst, parent); + _hImalist = hImgLst; + _initDir = dir; + }; + + int doDialog(bool isRTL = false) { + if (isRTL) + { + DLGTEMPLATE *pMyDlgTemplate = NULL; + HGLOBAL hMyDlgTemplate = makeRTLResource(IDD_VALUE_DLG, &pMyDlgTemplate); + int result = ::DialogBoxIndirectParam(_hInst, pMyDlgTemplate, _hParent, (DLGPROC)dlgProc, (LPARAM)this); + ::GlobalFree(hMyDlgTemplate); + return result; + } + return ::DialogBoxParam(_hInst, MAKEINTRESOURCE(IDD_TASKLIST_DLG), _hParent, (DLGPROC)dlgProc, (LPARAM)this); + }; + + virtual void destroy() {}; + +protected : + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) { + + switch (Message) + { + case WM_INITDIALOG : + { + ::SendMessage(_hParent, WM_GETTASKLISTINFO, (WPARAM)&_taskListInfo, 0); + int nbTotal = _taskListInfo._tlfsLst.size(); + + int i2set = _taskListInfo._currentIndex + (_initDir == dirDown?1:-1); + + if (i2set < 0) + i2set = nbTotal - 1; + + if (i2set > (nbTotal - 1)) + i2set = 0; + + _taskList.init(_hInst, _hSelf, _hImalist, nbTotal, i2set); + _taskList.setFont(TEXT("Verdana"), 14); + _rc = _taskList.adjustSize(); + + reSizeTo(_rc); + goToCenter(); + + _taskList.display(true); + hWndServer = _hSelf; + +#ifndef WH_MOUSE_LL +#define WH_MOUSE_LL 14 +#endif + winVer ver = (NppParameters::getInstance())->getWinVersion(); + _hHooker = ::SetWindowsHookEx(ver >= WV_W2K?WH_MOUSE_LL:WH_MOUSE, (HOOKPROC)hookProc, _hInst, 0); + hook = _hHooker; + return FALSE; + } + + case WM_DESTROY : + { + _taskList.destroy(); + ::UnhookWindowsHookEx(_hHooker); + return TRUE; + } + + + case WM_RBUTTONUP: + { + ::SendMessage(_hSelf, WM_COMMAND, ID_PICKEDUP, _taskList.getCurrentIndex()); + return TRUE; + } + + + case WM_DRAWITEM : + { + drawItem((DRAWITEMSTRUCT *)lParam); + return TRUE; + } + + case WM_NOTIFY: + { + switch (((LPNMHDR)lParam)->code) + { + case LVN_GETDISPINFO: + { + LV_ITEM &lvItem = reinterpret_cast((LV_DISPINFO FAR *)lParam)->item; + + TaskLstFnStatus & fileNameStatus = _taskListInfo._tlfsLst[lvItem.iItem]; + + lvItem.pszText = (TCHAR *)fileNameStatus._fn.c_str(); + lvItem.iImage = fileNameStatus._status; + + return TRUE; + } + + case NM_CLICK : + case NM_RCLICK : + { + ::SendMessage(_hSelf, WM_COMMAND, ID_PICKEDUP, _taskList.updateCurrentIndex()); + return TRUE; + } + + default: + break; + } + break; + } + + case WM_COMMAND : + { + switch (wParam) + { + case ID_PICKEDUP : + { + int listIndex = lParam; + int view2set = _taskListInfo._tlfsLst[listIndex]._iView; + int index2Switch = _taskListInfo._tlfsLst[listIndex]._docIndex; + ::SendMessage(_hParent, NPPM_ACTIVATEDOC, view2set, index2Switch); + ::EndDialog(_hSelf, -1); + return TRUE; + } + + default: + return FALSE; + } + } + + default : + return FALSE; + } + + return FALSE; + }; + +private : + TaskList _taskList; + TaskListInfo _taskListInfo; + HIMAGELIST _hImalist; + bool _initDir; + HHOOK _hHooker; + + void drawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) + { + RECT rect = lpDrawItemStruct->rcItem; + HDC hDC = lpDrawItemStruct->hDC; + int nItem = lpDrawItemStruct->itemID; + const TCHAR *label = _taskListInfo._tlfsLst[nItem]._fn.c_str(); + int iImage = _taskListInfo._tlfsLst[nItem]._status; + + COLORREF textColor = darkGrey; + int imgStyle = ILD_SELECTED; + + if (lpDrawItemStruct->itemState && ODS_SELECTED) + { + imgStyle = ILD_TRANSPARENT; + textColor = black; + + HFONT selectedFont = (HFONT)::GetStockObject(SYSTEM_FONT); + ::SelectObject(hDC, selectedFont); + } + + // + // DRAW IMAGE + // + HIMAGELIST hImgLst = _taskList.getImgLst(); + + IMAGEINFO info; + ImageList_GetImageInfo(hImgLst, iImage, &info); + + RECT & imageRect = info.rcImage; + //int yPos = (rect.top + (rect.bottom - rect.top)/2 + (isSelected?0:2)) - (imageRect.bottom - imageRect.top)/2; + + SIZE charPixel; + ::GetTextExtentPoint(hDC, TEXT(" "), 1, &charPixel); + int spaceUnit = charPixel.cx; + int marge = spaceUnit; + + rect.left += marge; + ImageList_Draw(hImgLst, iImage, hDC, rect.left, rect.top, imgStyle); + rect.left += imageRect.right - imageRect.left + spaceUnit * 2; + + // + // DRAW TEXT + // + ::SetTextColor(hDC, textColor); + rect.top -= ::GetSystemMetrics(SM_CYEDGE); + + ::DrawText(hDC, label, lstrlen(label), &rect, DT_SINGLELINE | DT_VCENTER | DT_LEFT); + }; +}; + + +#endif // TASKLISTDLG_H diff --git a/PowerEditor/src/WinControls/TaskList/TaskListDlg.rc b/PowerEditor/src/WinControls/TaskList/TaskListDlg.rc new file mode 100644 index 00000000..1b82e494 --- /dev/null +++ b/PowerEditor/src/WinControls/TaskList/TaskListDlg.rc @@ -0,0 +1,26 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include +#include "TaskListDlg_rc.h" + +IDD_TASKLIST_DLG DIALOGEX DISCARDABLE 0, 0, 300, 300 +STYLE WS_POPUP | WS_VISIBLE +FONT 8, TEXT("MS Shell Dlg"), 0, 0, 0x1 +BEGIN +END + diff --git a/PowerEditor/src/WinControls/TaskList/TaskListDlg_rc.h b/PowerEditor/src/WinControls/TaskList/TaskListDlg_rc.h new file mode 100644 index 00000000..ad19a531 --- /dev/null +++ b/PowerEditor/src/WinControls/TaskList/TaskListDlg_rc.h @@ -0,0 +1,24 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef TASKLISTDLGRC_H +#define TASKLISTDLGRC_H + +#define IDD_TASKLIST_DLG 2450 + #define ID_PICKEDUP (IDD_TASKLIST_DLG + 1) + +#endif // TASKLISTDLGRC_H diff --git a/PowerEditor/src/WinControls/ToolBar/ToolBar.cpp b/PowerEditor/src/WinControls/ToolBar/ToolBar.cpp new file mode 100644 index 00000000..18bcf3f1 --- /dev/null +++ b/PowerEditor/src/WinControls/ToolBar/ToolBar.cpp @@ -0,0 +1,392 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +//#include "..\..\resource.h" +#include "ToolBar.h" +#include "Shortcut.h" + +const int WS_TOOLBARSTYLE = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS |TBSTYLE_FLAT | CCS_TOP | BTNS_AUTOSIZE | CCS_NOPARENTALIGN | CCS_NORESIZE | CCS_NODIVIDER; + +bool ToolBar::init( HINSTANCE hInst, HWND hPere, toolBarStatusType type, + ToolBarButtonUnit *buttonUnitArray, int arraySize) +{ + Window::init(hInst, hPere); + _state = type; + int iconSize = (_state == TB_LARGE?32:16); + + _toolBarIcons.init(buttonUnitArray, arraySize); + _toolBarIcons.create(_hInst, iconSize); + + INITCOMMONCONTROLSEX icex; + icex.dwSize = sizeof(INITCOMMONCONTROLSEX); + icex.dwICC = ICC_WIN95_CLASSES|ICC_COOL_CLASSES|ICC_BAR_CLASSES|ICC_USEREX_CLASSES; + InitCommonControlsEx(&icex); + + //Create the list of buttons + _nrButtons = arraySize; + _nrDynButtons = _vDynBtnReg.size(); + _nrTotalButtons = _nrButtons + (_nrDynButtons ? _nrDynButtons + 1 : 0); + _pTBB = new TBBUTTON[_nrTotalButtons]; //add one for the extra separator + + int cmd = 0; + int bmpIndex = -1, style; + size_t i = 0; + for (; i < _nrButtons ; i++) + { + cmd = buttonUnitArray[i]._cmdID; + if (cmd != 0) + { + bmpIndex++; + style = BTNS_BUTTON; + } + else + { + style = BTNS_SEP; + } + + _pTBB[i].iBitmap = (cmd != 0?bmpIndex:0); + _pTBB[i].idCommand = cmd; + _pTBB[i].fsState = TBSTATE_ENABLED; + _pTBB[i].fsStyle = style; + _pTBB[i].dwData = 0; + _pTBB[i].iString = 0; + } + + if (_nrDynButtons > 0) { + //add separator + _pTBB[i].iBitmap = 0; + _pTBB[i].idCommand = 0; + _pTBB[i].fsState = TBSTATE_ENABLED; + _pTBB[i].fsStyle = BTNS_SEP; + _pTBB[i].dwData = 0; + _pTBB[i].iString = 0; + i++; + //add plugin buttons + for (size_t j = 0; j < _nrDynButtons ; j++, i++) + { + cmd = _vDynBtnReg[j].message; + bmpIndex++; + + _pTBB[i].iBitmap = bmpIndex; + _pTBB[i].idCommand = cmd; + _pTBB[i].fsState = TBSTATE_ENABLED; + _pTBB[i].fsStyle = BTNS_BUTTON; + _pTBB[i].dwData = 0; + _pTBB[i].iString = 0; + } + } + + reset(true); //load icons etc + + return true; +} + +void ToolBar::destroy() { + if (_pRebar) { + _pRebar->removeBand(_rbBand.wID); + _pRebar = NULL; + } + delete [] _pTBB; + ::DestroyWindow(_hSelf); + _hSelf = NULL; + _toolBarIcons.destroy(); +}; + +int ToolBar::getWidth() const { + RECT btnRect; + int totalWidth = 0; + for(size_t i = 0; i < _nrCurrentButtons; i++) { + ::SendMessage(_hSelf, TB_GETITEMRECT, i, (LPARAM)&btnRect); + totalWidth += btnRect.right - btnRect.left; + } + return totalWidth; +} + +int ToolBar::getHeight() const { + DWORD size = (DWORD)SendMessage(_hSelf, TB_GETBUTTONSIZE, 0, 0); + DWORD padding = (DWORD)SendMessage(_hSelf, TB_GETPADDING, 0,0); + int totalHeight = HIWORD(size) + HIWORD(padding); + + return totalHeight; +} + +void ToolBar::reset(bool create) +{ + + if(create && _hSelf) { + //Store current button state information + TBBUTTON tempBtn; + for(size_t i = 0; i < _nrCurrentButtons; i++) { + ::SendMessage(_hSelf, TB_GETBUTTON, (WPARAM)i, (LPARAM)&tempBtn); + _pTBB[i].fsState = tempBtn.fsState; + } + ::DestroyWindow(_hSelf); + _hSelf = NULL; + } + + if(!_hSelf) { + _hSelf = ::CreateWindowEx( + WS_EX_PALETTEWINDOW, + TOOLBARCLASSNAME, + TEXT(""), + WS_TOOLBARSTYLE, + 0, 0, + 0, 0, + _hParent, + NULL, + _hInst, + 0); + // Send the TB_BUTTONSTRUCTSIZE message, which is required for + // backward compatibility. + ::SendMessage(_hSelf, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0); + ::SendMessage(_hSelf, TB_SETEXTENDEDSTYLE, 0, (LPARAM)TBSTYLE_EX_HIDECLIPPEDBUTTONS); + } + + if (!_hSelf) + { + systemMessage(TEXT("System Err")); + throw int(9); + } + + if (_state != TB_STANDARD) + { + //If non standard icons, use custom imagelists + setDefaultImageList(); + setHotImageList(); + setDisableImageList(); + } + else + { + //Else set the internal imagelist with standard bitmaps + TBADDBITMAP addbmp = {_hInst, 0}; + TBADDBITMAP addbmpdyn = {0, 0}; + for (size_t i = 0 ; i < _nrButtons ; i++) + { + addbmp.nID = _toolBarIcons.getStdIconAt(i); + ::SendMessage(_hSelf, TB_ADDBITMAP, 1, (LPARAM)&addbmp); + } + if (_nrDynButtons > 0) { + for (size_t j = 0; j < _nrDynButtons; j++) + { + addbmpdyn.nID = (UINT_PTR)_vDynBtnReg.at(j).hBmp; + ::SendMessage(_hSelf, TB_ADDBITMAP, 1, (LPARAM)&addbmpdyn); + } + } + } + + if (create) { //if the toolbar has been recreated, readd the buttons + size_t nrBtnToAdd = (_state == TB_STANDARD?_nrTotalButtons:_nrButtons); + _nrCurrentButtons = nrBtnToAdd; + WORD btnSize = (_state == TB_LARGE?32:16); + ::SendMessage(_hSelf, TB_SETBUTTONSIZE , (WPARAM)0, (LPARAM)MAKELONG (btnSize, btnSize)); + ::SendMessage(_hSelf, TB_ADDBUTTONS, (WPARAM)nrBtnToAdd, (LPARAM)_pTBB); + } + ::SendMessage(_hSelf, TB_AUTOSIZE, 0, 0); + + if (_pRebar) { + _rbBand.hwndChild = getHSelf(); + _rbBand.cxMinChild = 0; + _rbBand.cyIntegral = 1; + _rbBand.cyMinChild = _rbBand.cyMaxChild = getHeight(); + _rbBand.cxIdeal = getWidth(); + + _pRebar->reNew(REBAR_BAR_TOOLBAR, &_rbBand); + } +} + +void ToolBar::registerDynBtn(UINT messageID, toolbarIcons* tIcon) +{ + // Note: Register of buttons only possible before init! + if ((_hSelf == NULL) && (messageID != 0) && (tIcon->hToolbarBmp != NULL)) + { + tDynamicList dynList; + dynList.message = messageID; + dynList.hBmp = tIcon->hToolbarBmp; + dynList.hIcon = tIcon->hToolbarIcon; + _vDynBtnReg.push_back(dynList); + } +} + +void ToolBar::doPopop(POINT chevPoint) { + //first find hidden buttons + int width = Window::getWidth(); + + size_t start = 0; + RECT btnRect = {0,0,0,0}; + while(start < _nrCurrentButtons) { + ::SendMessage(_hSelf, TB_GETITEMRECT, start, (LPARAM)&btnRect); + if(btnRect.right > width) + break; + start++; + } + + if (start < _nrCurrentButtons) { //some buttons are hidden + HMENU menu = ::CreatePopupMenu(); + int cmd; + generic_string text; + while (start < _nrCurrentButtons) { + cmd = _pTBB[start].idCommand; + getNameStrFromCmd(cmd, text); + if (_pTBB[start].idCommand != 0) { + if (::SendMessage(_hSelf, TB_ISBUTTONENABLED, cmd, 0) != 0) + AppendMenu(menu, MF_ENABLED, cmd, text.c_str()); + else + AppendMenu(menu, MF_DISABLED|MF_GRAYED, cmd, text.c_str()); + } else + AppendMenu(menu, MF_SEPARATOR, 0, TEXT("")); + start++; + } + TrackPopupMenu(menu, 0, chevPoint.x, chevPoint.y, 0, _hSelf, NULL); + } +} + +void ToolBar::addToRebar(ReBar * rebar) { + if (_pRebar) + return; + _pRebar = rebar; + + ZeroMemory(&_rbBand, sizeof(REBARBANDINFO)); + _rbBand.cbSize = sizeof(REBARBANDINFO); + _rbBand.fMask = RBBIM_STYLE | RBBIM_CHILD | RBBIM_CHILDSIZE | + RBBIM_SIZE | RBBIM_IDEALSIZE | RBBIM_ID; + + _rbBand.fStyle = RBBS_VARIABLEHEIGHT | RBBS_USECHEVRON; + _rbBand.hwndChild = getHSelf(); + _rbBand.wID = REBAR_BAR_TOOLBAR; //ID REBAR_BAR_TOOLBAR for toolbar + _rbBand.cxMinChild = 0; + _rbBand.cyIntegral = 1; + _rbBand.cyMinChild = _rbBand.cyMaxChild = getHeight(); + _rbBand.cxIdeal = _rbBand.cx = getWidth(); + + _pRebar->addBand(&_rbBand, true); + + _rbBand.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE | RBBIM_SIZE; +} + +void ReBar::init(HINSTANCE hInst, HWND hPere) +{ + Window::init(hInst, hPere); + + _hSelf = CreateWindowEx(WS_EX_TOOLWINDOW, + REBARCLASSNAME, + NULL, + WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|RBS_VARHEIGHT| + RBS_BANDBORDERS | CCS_NODIVIDER | CCS_NOPARENTALIGN, + 0,0,0,0, _hParent, NULL, _hInst, NULL); + + REBARINFO rbi; + ZeroMemory(&rbi, sizeof(REBARINFO)); + rbi.cbSize = sizeof(REBARINFO); + rbi.fMask = 0; + rbi.himl = (HIMAGELIST)NULL; + ::SendMessage(_hSelf, RB_SETBARINFO, 0, (LPARAM)&rbi); +} + +bool ReBar::addBand(REBARBANDINFO * rBand, bool useID) { + if (rBand->fMask & RBBIM_STYLE) + rBand->fStyle |= RBBS_GRIPPERALWAYS; + else + rBand->fStyle = RBBS_GRIPPERALWAYS; + rBand->fMask |= RBBIM_ID | RBBIM_STYLE; + if (useID) { + if (isIDTaken(rBand->wID)) + return false; + + } else { + rBand->wID = getNewID(); + } + ::SendMessage(_hSelf, RB_INSERTBAND, (WPARAM)-1, (LPARAM)rBand); //add to end of list + return true; +} + +void ReBar::reNew(int id, REBARBANDINFO * rBand) { + int index = (int)SendMessage(_hSelf, RB_IDTOINDEX, (WPARAM)id, 0); + ::SendMessage(_hSelf, RB_SETBANDINFO, (WPARAM)index, (LPARAM)rBand); +}; + +void ReBar::removeBand(int id) { + int index = (int)SendMessage(_hSelf, RB_IDTOINDEX, (WPARAM)id, 0); + if (id >= REBAR_BAR_EXTERNAL) + releaseID(id); + ::SendMessage(_hSelf, RB_DELETEBAND, (WPARAM)index, (LPARAM)0); +} + +void ReBar::setIDVisible(int id, bool show) { + int index = (int)SendMessage(_hSelf, RB_IDTOINDEX, (WPARAM)id, 0); + if (index == -1 ) + return; //error + REBARBANDINFO rbBand; + rbBand.cbSize = sizeof(rbBand); + rbBand.fMask = RBBIM_STYLE; + ::SendMessage(_hSelf, RB_GETBANDINFO, (WPARAM)index, (LPARAM)&rbBand); + if (show) + rbBand.fStyle &= (RBBS_HIDDEN ^ -1); + else + rbBand.fStyle |= RBBS_HIDDEN; + ::SendMessage(_hSelf, RB_SETBANDINFO, (WPARAM)index, (LPARAM)&rbBand); +} + +bool ReBar::getIDVisible(int id) { + int index = (int)SendMessage(_hSelf, RB_IDTOINDEX, (WPARAM)id, 0); + if (index == -1 ) + return false; //error + REBARBANDINFO rbBand; + rbBand.cbSize = sizeof(rbBand); + rbBand.fMask = RBBIM_STYLE; + ::SendMessage(_hSelf, RB_GETBANDINFO, (WPARAM)index, (LPARAM)&rbBand); + return ((rbBand.fStyle & RBBS_HIDDEN) == 0); +} + +int ReBar::getNewID() { + int idToUse = REBAR_BAR_EXTERNAL; + int curVal = 0; + size_t size = usedIDs.size(); + for(size_t i = 0; i < size; i++) { + curVal = usedIDs.at(i); + if (curVal < idToUse) { + continue; + } else if (curVal == idToUse) { + idToUse++; + } else { + break; //found gap + } + } + + usedIDs.push_back(idToUse); + return idToUse; +} + +void ReBar::releaseID(int id) { + size_t size = usedIDs.size(); + for(size_t i = 0; i < size; i++) { + if (usedIDs.at(i) == id) { + usedIDs.erase(usedIDs.begin()+i); + break; + } + } +} + +bool ReBar::isIDTaken(int id) { + size_t size = usedIDs.size(); + for(size_t i = 0; i < size; i++) { + if (usedIDs.at(i) == id) { + return true; + } + } + return false; +} + diff --git a/PowerEditor/src/WinControls/ToolBar/ToolBar.h b/PowerEditor/src/WinControls/ToolBar/ToolBar.h new file mode 100644 index 00000000..1c0979e4 --- /dev/null +++ b/PowerEditor/src/WinControls/ToolBar/ToolBar.h @@ -0,0 +1,174 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef TOOL_BAR_H +#define TOOL_BAR_H + +#include "Window.h" +#include "Notepad_plus_msgs.h" + +#define REBAR_BAR_TOOLBAR 0 +#define REBAR_BAR_SEARCH 1 + +#define REBAR_BAR_EXTERNAL 10 +#ifndef _WIN32_IE +#define _WIN32_IE 0x0600 +#endif //_WIN32_IE + +#include +#include +using namespace std; + +enum toolBarStatusType {/*TB_HIDE, */TB_SMALL, TB_LARGE, TB_STANDARD}; + +#include "ImageListSet.h" + + +typedef struct { + UINT message; // identification of icon in tool bar (menu ID) + HBITMAP hBmp; // bitmap for toolbar + HICON hIcon; // icon for toolbar +} tDynamicList; + +class ReBar; + +class ToolBar : public Window +{ +public : + ToolBar():Window(), _pTBB(NULL), _nrButtons(0), _nrDynButtons(0), _nrTotalButtons(0), _nrCurrentButtons(0), _pRebar(NULL) {}; + virtual ~ToolBar(){}; + + virtual bool init(HINSTANCE hInst, HWND hPere, toolBarStatusType type, + ToolBarButtonUnit *buttonUnitArray, int arraySize); + + virtual void destroy(); + void enable(int cmdID, bool doEnable) const { + ::SendMessage(_hSelf, TB_ENABLEBUTTON, cmdID, (LPARAM)doEnable); + }; + + int getWidth() const; + int getHeight() const; + + void reduce() { + if (_state == TB_SMALL) + return; + + _toolBarIcons.resizeIcon(16); + bool recreate = (_state == TB_STANDARD); + setState(TB_SMALL); + reset(recreate); //recreate toolbar if std icons were used + Window::redraw(); + }; + void enlarge() { + if (_state == TB_LARGE) + return; + + _toolBarIcons.resizeIcon(32); + bool recreate = (_state == TB_STANDARD); + setState(TB_LARGE); + reset(recreate); //recreate toolbar if std icons were used + Window::redraw(); + }; + void setToUglyIcons() { + if (_state == TB_STANDARD) + return; + bool recreate = true; + setState(TB_STANDARD); + reset(recreate); //must recreate toolbar if setting to internal bitmaps + Window::redraw(); + } + + bool getCheckState(int ID2Check) const { + return bool(::SendMessage(_hSelf, TB_GETSTATE, (WPARAM)ID2Check, 0) & TBSTATE_CHECKED); + }; + + void setCheck(int ID2Check, bool willBeChecked) const { + ::SendMessage(_hSelf, TB_CHECKBUTTON, (WPARAM)ID2Check, (LPARAM)MAKELONG(willBeChecked, 0)); + }; + + toolBarStatusType getState() const { + return _state; + }; + + bool changeIcons(int whichLst, int iconIndex, const TCHAR *iconLocation){ + return _toolBarIcons.replaceIcon(whichLst, iconIndex, iconLocation); + }; + + void registerDynBtn(UINT message, toolbarIcons* hBmp); + + void doPopop(POINT chevPoint); //show the popup if buttons are hidden + + void addToRebar(ReBar * rebar); + +private : + TBBUTTON *_pTBB; + ToolBarIcons _toolBarIcons; + toolBarStatusType _state; + vector _vDynBtnReg; + size_t _nrButtons; + size_t _nrDynButtons; + size_t _nrTotalButtons; + size_t _nrCurrentButtons; + ReBar * _pRebar; + REBARBANDINFO _rbBand; + + + void setDefaultImageList() { + ::SendMessage(_hSelf, TB_SETIMAGELIST , (WPARAM)0, (LPARAM)_toolBarIcons.getDefaultLst()); + }; + void setHotImageList() { + ::SendMessage(_hSelf, TB_SETHOTIMAGELIST , (WPARAM)0, (LPARAM)_toolBarIcons.getHotLst()); + }; + void setDisableImageList() { + ::SendMessage(_hSelf, TB_SETDISABLEDIMAGELIST, (WPARAM)0, (LPARAM)_toolBarIcons.getDisableLst()); + }; + + void reset(bool create = false); + void setState(toolBarStatusType state) { + _state = state; + } + +}; + +class ReBar : public Window +{ +public : + ReBar():Window() { usedIDs.clear(); }; + + virtual void destroy() { + ::DestroyWindow(_hSelf); + _hSelf = NULL; + usedIDs.clear(); + }; + + void init(HINSTANCE hInst, HWND hPere); + bool addBand(REBARBANDINFO * rBand, bool useID); //useID true if ID from info should be used (false for plugins). wID in bandinfo will be set to used ID + void reNew(int id, REBARBANDINFO * rBand); //wID from bandinfo is used for update + void removeBand(int id); + + void setIDVisible(int id, bool show); + bool getIDVisible(int id); + +private: + vector usedIDs; + + int getNewID(); + void releaseID(int id); + bool isIDTaken(int id); +}; + +#endif // TOOL_BAR_H diff --git a/PowerEditor/src/WinControls/ToolTip/ToolTip.cpp b/PowerEditor/src/WinControls/ToolTip/ToolTip.cpp new file mode 100644 index 00000000..63cf4209 --- /dev/null +++ b/PowerEditor/src/WinControls/ToolTip/ToolTip.cpp @@ -0,0 +1,81 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#include "ToolTip.h" + + + +LRESULT CALLBACK dlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); + + +void ToolTip::init(HINSTANCE hInst, HWND hParent) +{ + if (_hSelf == NULL) + { + Window::init(hInst, hParent); + + _hSelf = CreateWindowEx( 0, TOOLTIPS_CLASS, NULL, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, NULL, NULL ); + if (!_hSelf) + { + systemMessage(TEXT("System Err")); + throw int(6969); + } + + ::SetWindowLongPtr(_hSelf, GWL_USERDATA, reinterpret_cast(this)); + _defaultProc = reinterpret_cast(::SetWindowLongPtr(_hSelf, GWL_WNDPROC, reinterpret_cast(staticWinProc))); + } +} + + +void ToolTip::Show(RECT rectTitle, TCHAR * pszTitle, int iXOff, int iWidthOff) +{ + if (isVisible()) + destroy(); + + if (lstrlen(pszTitle) == 0) + return; + + // INITIALIZE MEMBERS OF THE TOOLINFO STRUCTURE + _ti.cbSize = sizeof(TOOLINFO); + _ti.uFlags = TTF_TRACK | TTF_ABSOLUTE; + _ti.hwnd = ::GetParent(_hParent); + _ti.hinst = _hInst; + _ti.uId = 0; + + _ti.rect.left = rectTitle.left; + _ti.rect.top = rectTitle.top; + _ti.rect.right = rectTitle.right; + _ti.rect.bottom = rectTitle.bottom; + + HFONT _hFont = (HFONT)::SendMessage(_hParent, WM_GETFONT, 0, 0); + ::SendMessage(_hSelf, WM_SETFONT, reinterpret_cast(_hFont), TRUE); + + _ti.lpszText = pszTitle; + ::SendMessage(_hSelf, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &_ti); + ::SendMessage(_hSelf, TTM_TRACKPOSITION, 0, (LPARAM)(DWORD) MAKELONG(_ti.rect.left + iXOff, _ti.rect.top + iWidthOff)); + ::SendMessage(_hSelf, TTM_TRACKACTIVATE, true, (LPARAM)(LPTOOLINFO) &_ti); +} + + +LRESULT ToolTip::runProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + return ::CallWindowProc(_defaultProc, _hSelf, message, wParam, lParam); +} + diff --git a/PowerEditor/src/WinControls/ToolTip/ToolTip.h b/PowerEditor/src/WinControls/ToolTip/ToolTip.h new file mode 100644 index 00000000..aa0db2d4 --- /dev/null +++ b/PowerEditor/src/WinControls/ToolTip/ToolTip.h @@ -0,0 +1,63 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#ifndef __TOOLTIP_H__ +#define __TOOLTIP_H__ + +#include +#include "Notepad_plus.h" +#include "Window.h" +#include + + +using namespace std; + + +class ToolTip : public Window +{ +public : + ToolTip() : _bTrackMouse(FALSE) {}; + + void destroy(void){ + ::DestroyWindow(_hSelf); + _hSelf = NULL; + }; + +// Attributes +public: + +// Implementation +public: + virtual void init(HINSTANCE hInst, HWND hParent); + void Show(RECT rectTitle, TCHAR* pszTitleText, int iXOff = 0, int iWidthOff = 0); + +protected: + WNDPROC _defaultProc; + BOOL _bTrackMouse; + TOOLINFO _ti; + + + static LRESULT CALLBACK staticWinProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) { + return (((ToolTip *)(::GetWindowLongPtr(hwnd, GWL_USERDATA)))->runProc(Message, wParam, lParam)); + }; + LRESULT runProc(UINT Message, WPARAM wParam, LPARAM lParam); + void SendHitMessage(void); +}; + +#endif // __TOOLTIP_H__ diff --git a/PowerEditor/src/WinControls/TrayIcon/trayIconControler.cpp b/PowerEditor/src/WinControls/TrayIcon/trayIconControler.cpp new file mode 100644 index 00000000..6cd2c4e2 --- /dev/null +++ b/PowerEditor/src/WinControls/TrayIcon/trayIconControler.cpp @@ -0,0 +1,26 @@ +#include "trayIconControler.h" +#include +trayIconControler::trayIconControler(HWND hwnd, UINT uID, UINT uCBMsg, HICON hicon, TCHAR *tip) +{ + _nid.cbSize = sizeof(_nid); + _nid.hWnd = hwnd; + _nid.uID = uID; + _nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; + _nid.uCallbackMessage = uCBMsg; + _nid.hIcon = hicon; + lstrcpy(_nid.szTip, tip); + + ::RegisterWindowMessage(TEXT("TaskbarCreated")); + _isIconShowed = false; +} + +int trayIconControler::doTrayIcon(DWORD op) +{ + if ((op != ADD)&&(op != REMOVE)) return INCORRECT_OPERATION; + if (((_isIconShowed)&&(op == ADD))||((!_isIconShowed)&&(op == REMOVE))) + return OPERATION_INCOHERENT; + ::Shell_NotifyIcon(op, &_nid); + _isIconShowed = !_isIconShowed; + + return 0; +} diff --git a/PowerEditor/src/WinControls/TrayIcon/trayIconControler.h b/PowerEditor/src/WinControls/TrayIcon/trayIconControler.h new file mode 100644 index 00000000..c4dd3c44 --- /dev/null +++ b/PowerEditor/src/WinControls/TrayIcon/trayIconControler.h @@ -0,0 +1,25 @@ +#ifndef TRAY_ICON_CONTROLER_H +#define TRAY_ICON_CONTROLER_H + +#include + +#define ADD NIM_ADD +#define REMOVE NIM_DELETE + +// code d'erreur +#define INCORRECT_OPERATION 1 +#define OPERATION_INCOHERENT 2 + +class trayIconControler +{ +public: + trayIconControler(HWND hwnd, UINT uID, UINT uCBMsg, HICON hicon, TCHAR *tip); + int doTrayIcon(DWORD op); + bool isInTray() const {return _isIconShowed;}; + +private: + NOTIFYICONDATA _nid; + bool _isIconShowed; +}; + +#endif //TRAY_ICON_CONTROLER_H diff --git a/PowerEditor/src/WinControls/TreeView/TreeView.cpp b/PowerEditor/src/WinControls/TreeView/TreeView.cpp new file mode 100644 index 00000000..86e20089 --- /dev/null +++ b/PowerEditor/src/WinControls/TreeView/TreeView.cpp @@ -0,0 +1,73 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "TreeView.h" + +HTREEITEM TreeView::insertTo(HTREEITEM parent, TCHAR *itemStr, int imgIndex) +{ + TV_INSERTSTRUCT tvinsert; + tvinsert.hParent=parent; + tvinsert.hInsertAfter=parent?TVI_LAST:TVI_ROOT; + tvinsert.item.mask=TVIF_TEXT|TVIF_IMAGE|TVIF_SELECTEDIMAGE; + tvinsert.item.pszText=itemStr; + tvinsert.item.iImage=imgIndex; + tvinsert.item.iSelectedImage=0; + return (HTREEITEM)::SendMessage(_hSelf, TVM_INSERTITEM, 0, (LPARAM)&tvinsert); +} + +void TreeView::init(HINSTANCE hInst, HWND pere) +{ + Window::init(hInst, pere); + 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. + + _hSelf = CreateWindowEx(0, + WC_TREEVIEW, + TEXT("Tree View"), + WS_VISIBLE | WS_CHILD | WS_BORDER | + TVS_HASLINES | TVS_HASBUTTONS | TVS_SHOWSELALWAYS , + 0, 0, 0, 0, + _hParent, + NULL, + _hInst, + NULL); + + if (!_hSelf) + throw int(56); + + Parent = insertTo(NULL, TEXT("MAOCS30 Command"), 0); + Root=Parent; + Before=Parent; + + Parent = insertTo(Parent, TEXT("Native command"), 0); + insertTo(Parent, TEXT("Power On"), 0); + insertTo(Parent, TEXT("Power off"), 0); + insertTo(Parent, TEXT("Entrant"), 0); + insertTo(Parent, TEXT("Sortant"), 0); + 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/TreeView/TreeView.h b/PowerEditor/src/WinControls/TreeView/TreeView.h new file mode 100644 index 00000000..5d6deeb9 --- /dev/null +++ b/PowerEditor/src/WinControls/TreeView/TreeView.h @@ -0,0 +1,44 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef TREE_VIEW_H +#define TREE_VIEW_H + +#include +#include "Window.h" + +#ifndef _WIN32_IE +#define _WIN32_IE 0x0600 +#endif //_WIN32_IE + +#include + +class TreeView : public Window +{ +public : + TreeView(){}; + ~TreeView(){}; + virtual void init(HINSTANCE hInst, HWND pere); + virtual void destroy() { + ::DestroyWindow(_hSelf); + }; + +private : + HTREEITEM insertTo(HTREEITEM parent, TCHAR *itemStr, int imgIndex); +}; + +#endif \ No newline at end of file diff --git a/PowerEditor/src/WinControls/Window.h b/PowerEditor/src/WinControls/Window.h new file mode 100644 index 00000000..7bd64cbd --- /dev/null +++ b/PowerEditor/src/WinControls/Window.h @@ -0,0 +1,119 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef WINDOW_CONTROL_H +#define WINDOW_CONTROL_H + +#include + +class Window +{ +public: + Window(): _hInst(NULL), _hParent(NULL), _hSelf(NULL){}; + virtual ~Window() {}; + + virtual void init(HINSTANCE hInst, HWND parent) + { + _hInst = hInst; + _hParent = parent; + } + + virtual void destroy() = 0; + + 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 !!! + { + ::MoveWindow(_hSelf, rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, TRUE); + redraw(); + }; + + virtual void redraw() const { + ::InvalidateRect(_hSelf, NULL, TRUE); + ::UpdateWindow(_hSelf); + }; + + virtual void getClientRect(RECT & rc) const { + ::GetClientRect(_hSelf, &rc); + }; + + virtual void getWindowRect(RECT & rc) const { + ::GetWindowRect(_hSelf, &rc); + }; + + virtual int getWidth() const { + RECT rc; + ::GetClientRect(_hSelf, &rc); + return (rc.right - rc.left); + }; + + virtual int getHeight() const { + RECT rc; + ::GetClientRect(_hSelf, &rc); + if (::IsWindowVisible(_hSelf) == TRUE) + return (rc.bottom - rc.top); + return 0; + }; + + virtual bool isVisible() const { + return (::IsWindowVisible(_hSelf)?true:false); + }; + + HWND getHSelf() const { + /* + if (!_hSelf) + { + ::MessageBox(NULL, TEXT("_hSelf == NULL"), TEXT("class Window"), MB_OK); + throw int(999); + } + */ + return _hSelf; + }; + + HWND getHParent() const { + return _hParent; + }; + + void getFocus() const { + ::SetFocus(_hSelf); + }; + + HINSTANCE getHinst() const { + if (!_hInst) + { + ::MessageBox(NULL, TEXT("_hInst == NULL"), TEXT("class Window"), MB_OK); + throw int(1999); + } + return _hInst; + }; +protected: + HINSTANCE _hInst; + HWND _hParent; + HWND _hSelf; +}; + +#endif //WINDOW_CONTROL_H + + diff --git a/PowerEditor/src/WinControls/WindowInterface.h b/PowerEditor/src/WinControls/WindowInterface.h new file mode 100644 index 00000000..276a1e6d --- /dev/null +++ b/PowerEditor/src/WinControls/WindowInterface.h @@ -0,0 +1,33 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef WINDOW_INTERFACE_H +#define WINDOW_INTERFACE_H + +#include "Window.h" + +class WindowInterface : public Window +{ +public : + void init(HINSTANCE hInst, HWND parent, HWND hSelf) { + Window::init(hInst, parent); + _hSelf = hSelf; + }; + virtual void destroy() {}; +}; + +#endif // WINDOW_INTERFACE_H diff --git a/PowerEditor/src/WinControls/WindowsDlg/SizeableDlg.cpp b/PowerEditor/src/WinControls/WindowsDlg/SizeableDlg.cpp new file mode 100644 index 00000000..ff358309 --- /dev/null +++ b/PowerEditor/src/WinControls/WindowsDlg/SizeableDlg.cpp @@ -0,0 +1,58 @@ +#include +#include "WindowsDlg.h" +#include "WindowsDlgRc.h" + +SizeableDlg::SizeableDlg(WINRECT* pWinMap) + : MyBaseClass(), _winMgr(pWinMap) +{ +} + +BOOL SizeableDlg::onInitDialog() +{ + _winMgr.InitToFitSizeFromCurrent(_hSelf); + _winMgr.CalcLayout(_hSelf); + _winMgr.SetWindowPositions(_hSelf); + //getClientRect(_rc); + return TRUE; +} + +void SizeableDlg::onSize(UINT nType, int cx, int cy) +{ + _winMgr.CalcLayout(cx,cy,_hSelf); + _winMgr.SetWindowPositions(_hSelf); +} + +void SizeableDlg::onGetMinMaxInfo(MINMAXINFO* lpMMI) +{ + _winMgr.GetMinMaxInfo(_hSelf, lpMMI); +} + +LRESULT SizeableDlg::onWinMgr(WPARAM wp, LPARAM lp) +{ + return 0; +} + +BOOL CALLBACK SizeableDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + 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) + { + return (BOOL)onWinMgr(wParam, lParam); + } + break; + } + return FALSE; +} \ No newline at end of file diff --git a/PowerEditor/src/WinControls/WindowsDlg/SizeableDlg.h b/PowerEditor/src/WinControls/WindowsDlg/SizeableDlg.h new file mode 100644 index 00000000..2d4f2c8a --- /dev/null +++ b/PowerEditor/src/WinControls/WindowsDlg/SizeableDlg.h @@ -0,0 +1,20 @@ + + +#include "StaticDialog.h" +#include "WindowsDlgRc.h" +#include "WinMgr.h" + +class SizeableDlg : public StaticDialog { + typedef StaticDialog MyBaseClass; +public: + SizeableDlg(WINRECT* pWinMap); + +protected: + CWinMgr _winMgr; // window manager + + virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + virtual BOOL onInitDialog(); + virtual void onSize(UINT nType, int cx, int cy); + virtual void onGetMinMaxInfo(MINMAXINFO* lpMMI); + virtual LRESULT onWinMgr(WPARAM wp, LPARAM lp); +}; diff --git a/PowerEditor/src/WinControls/WindowsDlg/WinMgr.cpp b/PowerEditor/src/WinControls/WindowsDlg/WinMgr.cpp new file mode 100644 index 00000000..88cc623c --- /dev/null +++ b/PowerEditor/src/WinControls/WindowsDlg/WinMgr.cpp @@ -0,0 +1,480 @@ +//////////////////////////////////////////////////////////////// +// MSDN Magazine -- July 2001 +// If this code works, it was written by Paul DiLascia. +// If not, I don't know who wrote it. +// 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. +// Replaced CWnd*/HWND, CRect/RECT, CSize/SIZE, CPoint/POINT + +#include +#include +#include "WinMgr.h" + +// Theo - Style Helpers +inline static DWORD GetStyle(HWND hWnd) { + return (DWORD)GetWindowLongPtr(hWnd, GWL_STYLE); +} + +inline static DWORD GetExStyle(HWND hWnd) { + return (DWORD)GetWindowLongPtr(hWnd, GWL_EXSTYLE); +} + +const UINT WM_WINMGR = RegisterWindowMessage(TEXT("WM_WINMGR")); + +CWinMgr::CWinMgr(WINRECT* pWinMap) : m_map(pWinMap) +{ + WINRECT::InitMap(m_map); +} + +CWinMgr::~CWinMgr() +{ +} + +////////////////// +// Set each control's tofit (desired) size to current size. Useful for +// dialogs, to "remember" the current sizes as desired size. +// +void CWinMgr::InitToFitSizeFromCurrent(HWND hWnd) +{ + assert(hWnd); + assert(m_map); + GetWindowPositions(hWnd); + for (WINRECT* w = m_map; !w->IsEnd(); w++) { + if (w->Type()==WRCT_TOFIT && !w->IsGroup()) { + w->SetToFitSize(RectToSize(w->GetRect())); + } + } +} + +////////////////// +// Load all rectangles from current window positions. +// +void CWinMgr::GetWindowPositions(HWND hWnd) +{ + assert(m_map); + assert(hWnd); + for (WINRECT* wrc=m_map; !wrc->IsEnd(); wrc++) { + if (wrc->IsWindow()) { + HWND HChild = GetDlgItem(hWnd, wrc->GetID()); + if (HChild) { + GetWindowRect(HChild, &wrc->GetRect()); + ::ScreenToClient(hWnd, &RectToPoint(wrc->GetRect())); + } + } + } +} + +////////////////// +// Move all the windows. Use DeferWindowPos for speed. +// +void +CWinMgr::SetWindowPositions(HWND hWnd) +{ + int nWindows = CountWindows(); + if (m_map && hWnd && nWindows>0) { + HDWP hdwp = ::BeginDeferWindowPos(nWindows); + int count=0; + for (WINRECT* wrc=m_map; !wrc->IsEnd(); wrc++) { + if (wrc->IsWindow()) { + assert(count < nWindows); + HWND hwndChild = ::GetDlgItem(hWnd, wrc->GetID()); + if (hwndChild) { + const RECT& rc = wrc->GetRect(); + ::DeferWindowPos(hdwp, + hwndChild, + NULL, // HWND insert after + rc.left,rc.top,RectWidth(rc),RectHeight(rc), + SWP_NOZORDER); + InvalidateRect(hwndChild,NULL,TRUE); // repaint + count++; + } + } else { + // not a window: still need to repaint background + InvalidateRect(hWnd, &wrc->GetRect(), TRUE); + } + } + ::EndDeferWindowPos(hdwp); + } +} + +////////////////// +// Count number of table entries that correspond to windows--ie, +// that have a child window ID associated with the entry. +// +int CWinMgr::CountWindows() +{ + assert(m_map); + int nWin = 0; + for (WINRECT* w=m_map; !w->IsEnd(); w++) { + if (w->IsWindow()) + nWin++; + } + return nWin; +} + +////////////////// +// Find the entry for a given control ID +// +WINRECT* CWinMgr::FindRect(UINT nID) +{ + assert(m_map); + for (WINRECT* w=m_map; !w->IsEnd(); w++) { + if (w->GetID()==nID) + return w; + } + return NULL; +} + +////////////////// +// Calculate size/positions for a row or column group This is the main +// algorithm. If a window is given, it's used to get the min/max size and +// desired size for TOFIT types. +// +void +CWinMgr::CalcGroup(WINRECT* pGroup, HWND hWnd) +{ + // If this bombs, most likely the first entry in your map is not a group! + assert(pGroup && pGroup->IsGroup()); + assert(hWnd); + + // adjust total avail by margins + RECT rcTotal = pGroup->GetRect(); + int w,h; + if (pGroup->GetMargins(w,h)) { + w = min(abs(w), RectWidth(rcTotal)/2); + 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 + int hwRemaining = bRow ? RectHeight(rcTotal) : RectWidth(rcTotal); + + // First, set all rects to their minimum sizes. + // This ensures that each rect gets its min size. + CWinGroupIterator it; + for (it=pGroup; it; it.Next()) { + WINRECT* wrc = it; + SIZEINFO szi; + OnGetSizeInfo(szi, wrc, hWnd); + int hwMin = bRow ? szi.szMin.cy : szi.szMin.cx; + hwMin = min(hwMin, hwRemaining); // truncate + wrc->SetHeightOrWidth(hwMin, bRow); // set + hwRemaining -= hwMin; // decrement remaining height/width + assert(hwRemaining>=0); + } + + // Now adjust all rects upward to desired size. Save REST rect for last. + WINRECT* pRestRect = NULL; + for (it=pGroup; it; it.Next()) { + WINRECT* wrc = it; + if (wrc->Type()==WRCT_REST) { + assert(pRestRect==NULL); // can only be one REST rect! + pRestRect = wrc; // remember it + } else { + AdjustSize(wrc, bRow, hwRemaining, hWnd); + } + } + assert(hwRemaining>=0); + + // Adjust REST rect if any + if (pRestRect) { + AdjustSize(pRestRect, bRow, hwRemaining, hWnd); + assert(hwRemaining==0); + } + + // All the sizes of the entries have been calculated, including + // groups (but not their children). Now move all the rects so they're + // adjacent to one another, without altering sizes. + PositionRects(pGroup, rcTotal, bRow); + + // Finally, descend recursively into each subgroup. + for (it=pGroup; it; it.Next()) { + WINRECT* wrc = it; + if (wrc->IsGroup()) + CalcGroup(wrc, hWnd); // recurse! + } +} + +////////////////// +// Adjust the size of a single entry upwards to its desired size. +// Decrement hwRemaining by amount increased. +// +void +CWinMgr::AdjustSize(WINRECT* wrc, BOOL bRow, + int& hwRemaining, HWND hWnd) +{ + SIZEINFO szi; + OnGetSizeInfo(szi, wrc, hWnd); + int hw = bRow ? szi.szDesired.cy : szi.szDesired.cx; // desired ht or wid + if (wrc->Type() == WRCT_REST) { + // for REST type, use all remaining space + RECT& rc = wrc->GetRect(); + hw = hwRemaining + (bRow ? RectHeight(rc) : RectWidth(rc)); + } + + // Now hw is the desired height or width, and the current size of the + // entry is the min size. So adjust the size upwards, and decrement + // hwRemaining appropriately. This is a little confusing, but necessary so + // each entry gets its min size. + // + int hwCurrent = wrc->GetHeightOrWidth(bRow); // current size + int hwExtra = hw - hwCurrent; // amount extra + hwExtra = min(max(hwExtra, 0), hwRemaining); // truncate + hw = hwCurrent + hwExtra; // new height-or-width + wrc->SetHeightOrWidth(hw, bRow); // set... + hwRemaining -= hwExtra; // and adjust remaining +} + +////////////////// +// Position all the rects so they're as wide/high as the total and follow one +// another; ie, are adjacent. This operation leaves the height (rows) and +// width (columns) unaffected. For rows, set each row's width to rcTotal and +// one below the other; for columns, set each column as tall as rcTotal and +// each to the right of the previous. +// +void +CWinMgr::PositionRects(WINRECT* pGroup, const RECT& rcTotal, BOOL bRow) +{ + LONG xoryPos = bRow ? rcTotal.top : rcTotal.left; + + CWinGroupIterator it; + for (it=pGroup; it; it.Next()) { + WINRECT* wrc = it; + RECT& rc = wrc->GetRect(); + if (bRow) { // for ROWS: + LONG height = RectHeight(rc); // height of row = total height + rc.top = xoryPos; // top = running yPos + rc.bottom = rc.top + height; // ... + rc.left = rcTotal.left; // ... + rc.right = rcTotal.right; // ... + xoryPos += height; // increment yPos + + } else { // for COLS: + LONG width = RectWidth(rc); // width = total width + rc.left = xoryPos; // left = running xPos + rc.right = rc.left + width; // ... + rc.top = rcTotal.top; // ... + rc.bottom = rcTotal.bottom; // ... + xoryPos += width; // increment xPos + } + } +} + +////////////////// +// Get size information for a single entry (WINRECT). Returns size info in +// the SIZEINFO argument. For a group, calculate size info as aggregate of +// subentries. +// +void +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 + + if (wrc->IsGroup()) { + // For groups, calculate min, max, desired size as aggregate of children + szi.szDesired = SIZEZERO; + BOOL bRow = wrc->IsRowGroup(); + + CWinGroupIterator it; + for (it=wrc; it; it.Next()) { + WINRECT* wrc2 = it; + SIZEINFO szi2; + OnGetSizeInfo(szi2, wrc2, hWnd); + if (bRow) { + szi.szMin.cx = max(szi.szMin.cx, szi2.szMin.cx); + szi.szMin.cy += szi2.szMin.cy; + szi.szMax.cx = min(szi.szMax.cx, szi2.szMax.cx); + szi.szMax.cy = min(szi.szMax.cy + szi2.szMax.cy, INFINITY); + szi.szDesired.cx = max(szi.szDesired.cx, szi2.szDesired.cx); + szi.szDesired.cy += szi2.szDesired.cy; + + } else { + szi.szMin.cx += szi2.szMin.cx; + szi.szMin.cy = max(szi.szMin.cy, szi2.szMin.cy); + szi.szMax.cx = min(szi.szMax.cx + szi2.szMax.cx, INFINITY); + szi.szMax.cy = min(szi.szMax.cy, szi2.szMax.cy); + szi.szDesired.cx += szi2.szDesired.cx; + szi.szDesired.cy = max(szi.szDesired.cy, szi2.szDesired.cy); + } + } + + // Add margins. + int w2,h2; + wrc->GetMargins(w2,h2); // get margins + w2<<=1; h2<<=1; // double + szi.szMin.cx += max(0,w2); // negative margins ==> don't include in min + szi.szMin.cy += max(0,h2); // ditto + szi.szDesired.cx += abs(w2); // for desired size, use abs vallue + szi.szDesired.cy += abs(h2); // ditto + + } else { + // not a group + WINRECT* parent = wrc->Parent(); + assert(parent); + RECT& rcParent = parent->GetRect(); + BOOL bRow = parent->IsRowGroup(); + int hw, hwMin, hwTotal, pct; + + switch (wrc->Type()) { + case WRCT_FIXED: + hw = hwMin = wrc->GetParam(); // ht/wid is parameter + if (hw<0) { // if fixed val is negative: + hw = -hw; // use absolute val for desired.. + hwMin = 0; // ..and zero for minimum + } + if (bRow) { + szi.szMax.cy = szi.szDesired.cy = hw; + szi.szMin.cy = hwMin; + } else { + szi.szMax.cx = szi.szDesired.cx = hw; + szi.szMin.cx = hwMin; + } + break; + + case WRCT_PCT: + pct = wrc->GetParam(); + assert(0HasToFitSize()) { + szi.szDesired = wrc->GetToFitSize(); + } + break; + + case WRCT_REST: + break; + + default: + assert(FALSE); + } + + // If the entry is a window, send message to get min/max/tofit size. + // Only set tofit size if type is TOFIT. + // + if (wrc->IsWindow() && hWnd) { + HWND hChild = GetDlgItem(hWnd, wrc->GetID()); + if (hChild) { + if (!IsWindowVisible(hChild) && IsWindowVisible(hWnd)) { + // parent visible but child not ==> tofit size is zero + // important so hidden windows use no space + szi.szDesired = SIZEZERO; + } else { + szi.szAvail = RectToSize(rcParent); + SendGetSizeInfo(szi, hWnd, wrc->GetID()); + } + } + } + szi.szDesired = maxsize(minsize(szi.szDesired,szi.szMax), szi.szMin); + } +} + +////////////////// +// Send message to parent, then window itself, to get size info. +// +BOOL CWinMgr::SendGetSizeInfo(SIZEINFO& szi, HWND hWnd, UINT nID) +{ + NMWINMGR nmw; + nmw.code = NMWINMGR::GET_SIZEINFO; // request size info + nmw.idFrom = nID; // ID of child I'm computing + nmw.sizeinfo = szi; // copy + + if (!SendMessage(hWnd, WM_WINMGR, nID, (LPARAM)&nmw) && !nmw.processed) { + HWND hwndChild = ::GetDlgItem(hWnd, nID); + if (!hwndChild || !::SendMessage(hwndChild,WM_WINMGR,nID,(LPARAM)&nmw)) + return FALSE; + } + szi = nmw.sizeinfo; // copy back to caller's struct + return TRUE; +} + +////////////////// +// Get min/max info. +// +void +CWinMgr::GetMinMaxInfo(HWND hWnd, MINMAXINFO* lpMMI) +{ + SIZEINFO szi; + GetMinMaxInfo(hWnd, szi); // call overloaded version + lpMMI->ptMinTrackSize = SizeToPoint(szi.szMin); + lpMMI->ptMaxTrackSize = SizeToPoint(szi.szMax); +} + +////////////////// +// Get min/max info. +// +void CWinMgr::GetMinMaxInfo(HWND hWnd, SIZEINFO& szi) +{ + OnGetSizeInfo(szi, m_map, hWnd); // get size info + if (!hWnd) // window not created ==> done + return; + + // Add extra space for frame/dialog screen junk. + DWORD dwStyle = GetStyle(hWnd); + DWORD dwExStyle = GetExStyle(hWnd); + if (dwStyle & WS_VISIBLE) { + SIZE& szMin = szi.szMin; // ref! + if (!(dwStyle & WS_CHILD)) { + if (dwStyle & WS_CAPTION) + szMin.cy += GetSystemMetrics(SM_CYCAPTION); + if (::GetMenu(hWnd)) + szMin.cy += GetSystemMetrics(SM_CYMENU); + } + if (dwStyle & WS_THICKFRAME) { + szMin.cx += 2*GetSystemMetrics(SM_CXSIZEFRAME); + szMin.cy += 2*GetSystemMetrics(SM_CYSIZEFRAME); + } else if (dwStyle & WS_BORDER) { + szMin.cx += 2*GetSystemMetrics(SM_CXBORDER); + szMin.cy += 2*GetSystemMetrics(SM_CYBORDER); + } + if (dwExStyle & WS_EX_CLIENTEDGE) { + szMin.cx += 2*GetSystemMetrics(SM_CXEDGE); + szMin.cy += 2*GetSystemMetrics(SM_CYEDGE); + } + } +} + +////////////////// +// Move desired rectangle by a given vector amount. +// Call this when a sizer bar tells you it has moved. +// +void CWinMgr::MoveRect(WINRECT* pwrcMove, POINT ptMove, HWND pParentWnd) +{ + assert(pwrcMove); + WINRECT* prev = pwrcMove->Prev(); + assert(prev); + WINRECT* next = pwrcMove->Next(); + assert(next); + + BOOL bIsRow = pwrcMove->Parent()->IsRowGroup(); + + RECT& rcNext = next->GetRect(); + RECT& rcPrev = prev->GetRect(); + if (bIsRow) { + // a row can only be moved up or down + ptMove.x = 0; + rcPrev.bottom += ptMove.y; + rcNext.top += ptMove.y; + } else { + // a column can only be moved left or right + ptMove.y = 0; + rcPrev.right += ptMove.x; + rcNext.left += ptMove.x; + } + OffsetRect(pwrcMove->GetRect(), ptMove); + if (prev->IsGroup()) + CalcGroup(prev, pParentWnd); + if (next->IsGroup()) + CalcGroup(next, pParentWnd); +} + +// Theo - Removed Tracing diff --git a/PowerEditor/src/WinControls/WindowsDlg/WinMgr.h b/PowerEditor/src/WinControls/WindowsDlg/WinMgr.h new file mode 100644 index 00000000..30421805 --- /dev/null +++ b/PowerEditor/src/WinControls/WindowsDlg/WinMgr.h @@ -0,0 +1,303 @@ +//////////////////////////////////////////////////////////////// +// MSDN Magazine -- July 2001 +// If this code works, it was written by Paul DiLascia. +// If not, I don't know who wrote it. +// Compiles with Visual C++ 6.0. Runs on Win 98 and probably Win 2000 too. +// Set tabsize = 3 in your editor. +// +// WinMgr.h -- Main header file for WinMgr library. +// +// Theo - Heavily modified to remove MFC dependencies +// Replaced CWnd*/HWND, CRect/RECT, CSize/SIZE, CPoint/POINT +#ifndef WINMGR_H +#define WINMGR_H + +#ifndef _WINDOWS_H_ +# include +#endif +#include + +#pragma once + +// when using screen dimensions, this is infinite +//const LONG INFINITY=0x7fff; // max short +//change to DEFINE for GCC +#define INFINITY 0x7fff // max short + +const SIZE SIZEZERO = {0, 0}; +const SIZE SIZEMAX = {INFINITY,INFINITY}; + +inline SIZE GetSize(LONG w, LONG h) { + SIZE sz = {w, h}; return sz; +} + +inline POINT GetPoint(LONG x, LONG y) { + POINT pt = {x, y}; return pt; +} + +inline LONG RectWidth(const RECT& rc) { + return rc.right - rc.left; +} + +inline LONG RectHeight(const RECT& rc) { + return rc.bottom - rc.top; +} + +inline SIZE RectToSize(const RECT& rc) { + return GetSize(RectWidth(rc), RectHeight(rc)); +} + +inline POINT RectToPoint(const RECT& rc) { + POINT pt = {rc.left, rc.top}; + return pt; +} + +inline POINT SizeToPoint(SIZE sz) { + return GetPoint(sz.cx, sz.cy); +} + +inline RECT &OffsetRect(RECT& rc, POINT pt) { + rc.left += pt.x; rc.right += pt.x; + rc.top += pt.y; rc.bottom += pt.y; + return rc; +} + +// handy functions to take the min or max of a SIZE +inline SIZE minsize(SIZE a, SIZE b) { + return GetSize(min((UINT)a.cx,(UINT)b.cx),min((UINT)a.cy,(UINT)b.cy)); +} + +inline SIZE maxsize(SIZE a, SIZE b) { + return GetSize(max((UINT)a.cx,(UINT)b.cx),max((UINT)a.cy,(UINT)b.cy)); +} + +////////////////// +// Size info about a rectangle/row/column +// +struct SIZEINFO { + SIZE szAvail; // total size avail (passed) + SIZE szDesired; // desired size: default=current + SIZE szMin; // minimum size: default=SIZEZERO + SIZE szMax; // maximum size: default=MAXSIZE +}; + +// types of rectangles: +#define WRCT_END 0 // end of table +#define WRCT_FIXED 0x0001 // height/width is fixed +#define WRCT_PCT 0x0002 // height/width is percent of total +#define WRCT_REST 0x0003 // height/width is whatever remains +#define WRCT_TOFIT 0x0004 // height/width to fit contents +#define WRCF_TYPEMASK 0x000F + +// group flags +#define WRCF_ROWGROUP 0x0010 // beginning of row group +#define WRCF_COLGROUP 0x0020 // beginning of column group +#define WRCF_ENDGROUP 0x00F0 // end of group +#define WRCF_GROUPMASK 0x00F0 + +////////////////// +// This structure is used to hold a rectangle and describe its layout. Each +// WINRECT corresponds to a child rectangle/window. Each window that uses +// WinMgr provides a table (C array) of these to describe its layout. +// +class WINRECT { +protected: + // pointers initialized by the window manager for easy traversing: + WINRECT* next; // next at this level + WINRECT* prev; // prev at this level + + // data + RECT rc; // current rectangle position/size + WORD flags; // flags (see above) + UINT nID; // window ID if this WINRECT represents a window + LONG param; // arg depends on type + +public: + WINRECT(WORD f, UINT id, LONG p); + + static WINRECT* InitMap(WINRECT* map, WINRECT* parent=NULL); + + WINRECT* Prev() { return prev; } + WINRECT* Next() { return next; } + WINRECT* Children() { return IsGroup() ? this+1 : NULL; } + WINRECT* Parent(); + WORD GetFlags() { return flags; } + WORD SetFlags(WORD f) { return flags=f; } + LONG GetParam() { return param; } + LONG SetParam(LONG p) { return param=p; } + UINT GetID() { return nID; } + UINT SetID(UINT id) { return nID=id; } + RECT& GetRect() { return rc; } + void SetRect(const RECT& r) { rc = r; } + WORD Type() const { return flags & WRCF_TYPEMASK; } + WORD GroupType() const { return flags & WRCF_GROUPMASK; } + BOOL IsGroup() const { return GroupType() && GroupType()!=WRCF_ENDGROUP; } + BOOL IsEndGroup() const { return flags==0 || flags==WRCF_ENDGROUP; } + BOOL IsEnd() const { return flags==0; } + BOOL IsWindow() const { return nID>0; } + BOOL IsRowGroup() const { return (flags & WRCF_GROUPMASK)==WRCF_ROWGROUP; } + void SetHeight(LONG h) { rc.bottom = rc.top + h; } + void SetWidth(LONG w) { rc.right = rc.left + w; } + LONG GetHeightOrWidth(BOOL bHeight) const { + return bHeight ? RectHeight(rc) : RectWidth(rc); + } + void SetHeightOrWidth(LONG horw, BOOL bHeight) { + bHeight ? SetHeight(horw) : SetWidth(horw); + } + BOOL GetMargins(int& w, int& h); + + // For TOFIT types, param is the TOFIT size, if nonzero. Used in dialogs, + // with CWinMgr::InitToFitSizeFromCurrent. + BOOL HasToFitSize() { return param != 0; } + SIZE GetToFitSize() { SIZE sz = {LOWORD(param),HIWORD(param)}; return sz; } + void SetToFitSize(SIZE sz) { param = MAKELONG(sz.cx,sz.cy); } +}; + +////////////////// +// Below are all the macros to build your window map. +// + +// Begin/end window map. 'name' can be anything you want +#define BEGIN_WINDOW_MAP(name) WINRECT name[] = { +#define END_WINDOW_MAP() WINRECT(WRCT_END,-1,0) }; + +// Begin/end a group. +// The first entry in your map must be BEGINROWS or BEGINCOLS. +#define BEGINROWS(type,id,m) WINRECT(WRCF_ROWGROUP|type,id,m), +#define BEGINCOLS(type,id,m) WINRECT(WRCF_COLGROUP|type,id,m), +#define ENDGROUP() WINRECT(WRCF_ENDGROUP,-1,0), + +// This macros is used only with BEGINGROWS or BEGINCOLS to specify margins +#define RCMARGINS(w,h) MAKELONG(w,h) + +// Macros for primitive (non-group) entries. +// val applies to height for a row entry; width for a column entry. +#define RCFIXED(id,val) WINRECT(WRCT_FIXED,id,val), +#define RCPERCENT(id,val) WINRECT(WRCT_PCT,id,val), +#define RCREST(id) WINRECT(WRCT_REST,id,0), +#define RCTOFIT(id) WINRECT(WRCT_TOFIT,id,0), +#define RCSPACE(val) RCFIXED(-1,val) + +////////////////// +// Use this to iterate the entries in a group. +// +// CWinGroupIterator it; +// for (it=pGroup; it; it.Next()) { +// WINRECT* wrc = it; +// .. +// } +// +class CWinGroupIterator { +protected: + WINRECT* pCur; // current entry +public: + CWinGroupIterator() { pCur = NULL; } + CWinGroupIterator& operator=(WINRECT* pg) { + assert(pg->IsGroup()); // can only iterate a group! + pCur = pg->Children(); + return *this; + } + operator WINRECT*() { return pCur; } + WINRECT* pWINRECT() { return pCur; } + WINRECT* Next() { return pCur = pCur ? pCur->Next() : NULL;} +}; + +// Registered WinMgr message +extern const UINT WM_WINMGR; + +// Notification struct, passed as LPARAM +struct NMWINMGR : public NMHDR { + enum { // notification codes: + GET_SIZEINFO = 1, // WinMgr is requesting size info + SIZEBAR_MOVED // user moved sizer bar + }; + + // each notification code has its own part of union + union { + SIZEINFO sizeinfo; // used for GET_SIZEINFO + struct { // used for SIZEBAR_MOVED + POINT ptMoved; // distance moved (x or y = zero) + } sizebar; + }; + BOOL processed; + + // ctor: initialize to zeroes + NMWINMGR() { memset(this,0,sizeof(NMWINMGR)); } +}; + +/////////////////// +// Window manager. This class calculates all the sizes and positions of the +// rectangles in the window map. +// +class CWinMgr /*: public CObject*/ { +public: + CWinMgr(WINRECT* map); + virtual ~CWinMgr(); + + virtual void GetWindowPositions(HWND hWnd); // load map from window posns + virtual void SetWindowPositions(HWND hWnd); // set window posns from map + + // get min/max/desired size of a rectangle + virtual void OnGetSizeInfo(SIZEINFO& szi, WINRECT* pwrc, HWND hWnd=NULL); + + // calc layout using client area as total area + void CalcLayout(HWND hWnd) { + assert(hWnd); + RECT rcClient; + GetClientRect(hWnd, &rcClient); + CalcLayout(rcClient, hWnd); + } + + // calc layout using cx, cy (for OnSize) + void CalcLayout(int cx, int cy, HWND hWnd=NULL) { + RECT rc = {0,0,cx,cy}; + CalcLayout(rc, hWnd); + } + + // calc layout using given rect as total area + void CalcLayout(RECT rcTotal, HWND hWnd=NULL) { + assert(m_map); + m_map->SetRect(rcTotal); + CalcGroup(m_map, hWnd); + } + + // Move rectangle vertically or horizontally. Used with sizer bars. + void MoveRect(int nID, POINT ptMove, HWND pParentWnd) { + MoveRect(FindRect(nID), ptMove, pParentWnd); + } + void MoveRect(WINRECT* pwrcMove, POINT ptMove, HWND pParentWnd); + + RECT GetRect(UINT nID) { return FindRect(nID)->GetRect(); } + void SetRect(UINT nID, const RECT& rc) { FindRect(nID)->SetRect(rc); } + + // get WINRECT corresponding to ID + WINRECT* FindRect(UINT nID); + + // Calculate MINMAXINFO + void GetMinMaxInfo(HWND hWnd, MINMAXINFO* lpMMI); + void GetMinMaxInfo(HWND hWnd, SIZEINFO& szi); + + // set TOFIT size for all windows from current window sizes + void InitToFitSizeFromCurrent(HWND hWnd); + + // Theo - Removed Tracing + +protected: + WINRECT* m_map; // THE window map + + int CountWindows(); + BOOL SendGetSizeInfo(SIZEINFO& szi, HWND hWnd, UINT nID); + + // you can override to do wierd stuff or fix bugs + virtual void CalcGroup(WINRECT* group, HWND hWnd); + virtual void AdjustSize(WINRECT* pEntry, BOOL bRow, + int& hwRemaining, HWND hWnd); + virtual void PositionRects(WINRECT* pGroup, + const RECT& rcTotal,BOOL bRow); + +private: + CWinMgr() { assert(FALSE); } // no default constructor +}; + +// Theo - Removed CSizerBar and CSizeableDlg +#endif \ No newline at end of file diff --git a/PowerEditor/src/WinControls/WindowsDlg/WinRect.cpp b/PowerEditor/src/WinControls/WindowsDlg/WinRect.cpp new file mode 100644 index 00000000..2ae1cbf6 --- /dev/null +++ b/PowerEditor/src/WinControls/WindowsDlg/WinRect.cpp @@ -0,0 +1,84 @@ +//////////////////////////////////////////////////////////////// +// MSDN Magazine -- July 2001 +// If this code works, it was written by Paul DiLascia. +// If not, I don't know who wrote it. +// Compiles with Visual C++ 6.0. Runs on Win 98 and probably Win 2000 too. +// Set tabsize = 3 in your editor. +// +//#include "StdAfx.h" +#include "windows.h" +#include +#include "WinMgr.h" + +////////////////// +// Construct from args +// +WINRECT::WINRECT(WORD f, UINT id, LONG p) +{ + memset(this, 0, sizeof(WINRECT)); + flags = f; + nID = id; + param = p; +} + +////////////////// +// Get the parent of a given WINRECT. To find the parent, chase the prev +// pointer to the start of the list, then take the item before that in +// memory. +// +WINRECT* WINRECT::Parent() +{ + WINRECT* pEntry = NULL; + for (pEntry=this; pEntry->Prev(); pEntry=pEntry->Prev()) { + ; // go backwards to the end + } + // the entry before the first child is the group + WINRECT *parent = pEntry-1; + assert(parent->IsGroup()); + return parent; +} + +////////////////// +// Get group margins +// +BOOL WINRECT::GetMargins(int& w, int& h) +{ + if (IsGroup()) { + w=(short)LOWORD(param); + h=(short)HIWORD(param); + return TRUE; + } + w=h=0; + return FALSE; +} + +////////////////// +// Initialize map: set up all the next/prev pointers. This converts the +// linear array to a more convenient linked list. Called from END_WINDOW_MAP. +// +WINRECT* WINRECT::InitMap(WINRECT* pWinMap, WINRECT* parent) +{ + assert(pWinMap); + + WINRECT* pwrc = pWinMap; // current table entry + WINRECT* prev = NULL; // previous entry starts out none + + while (!pwrc->IsEndGroup()) { + pwrc->prev=prev; + pwrc->next=NULL; + if (prev) + prev->next = pwrc; + prev = pwrc; + if (pwrc->IsGroup()) { + pwrc = InitMap(pwrc+1,pwrc); // recurse! Returns end-of-grp + assert(pwrc->IsEndGroup()); + } + pwrc++; + } + // safety checks + assert(pwrc->IsEndGroup()); + assert(prev); + assert(prev->next==NULL); + return parent ? pwrc : NULL; +} + diff --git a/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.cpp b/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.cpp new file mode 100644 index 00000000..1ac32fb8 --- /dev/null +++ b/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.cpp @@ -0,0 +1,882 @@ +#include +#include "WindowsDlg.h" +#include "WindowsDlgRc.h" +#include "DocTabView.h" +#include +#include +#include + +#ifndef _countof +#define _countof(x) (sizeof(x)/sizeof((x)[0])) +#endif + +#ifndef LVS_EX_DOUBLEBUFFER +#define LVS_EX_DOUBLEBUFFER 0x00010000 +#endif + +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 GetExStyle(HWND hWnd) { + return (DWORD)GetWindowLongPtr(hWnd, GWL_EXSTYLE); +} + +inline static BOOL ModifyStyle(HWND hWnd, DWORD dwRemove, DWORD dwAdd) { + DWORD dwStyle = ::GetWindowLongPtr(hWnd, GWL_STYLE); + DWORD dwNewStyle = (dwStyle & ~dwRemove) | dwAdd; + if(dwStyle == dwNewStyle) + return FALSE; + ::SetWindowLongPtr(hWnd, GWL_STYLE, dwNewStyle); + return TRUE; +} + +inline static BOOL ModifyStyleEx(HWND hWnd, DWORD dwRemove, DWORD dwAdd) { + DWORD dwStyle = ::GetWindowLongPtr(hWnd, GWL_EXSTYLE); + DWORD dwNewStyle = (dwStyle & ~dwRemove) | dwAdd; + if(dwStyle == dwNewStyle) + return FALSE; + ::SetWindowLongPtr(hWnd, GWL_EXSTYLE, dwNewStyle); + return TRUE; +} + + +struct NumericStringEquivalence +{ + bool operator()(const TCHAR* s1, const TCHAR* s2) const + { return numstrcmp(s1, s2) < 0; } + static inline int numstrcmp_get(const TCHAR **str, int *length) + { + const TCHAR *p = *str; + int value = 0; + for (*length = 0; isdigit(*p); (*length)++) + value = value * 10 + *p++ - '0'; + *str = p; + return (value); + } + static int numstrcmp(const TCHAR *str1, const TCHAR *str2) + { + TCHAR *p1, *p2; + int c1, c2, lcmp; + for(;;) + { + c1 = tolower(*str1), c2 = tolower(*str2); + if ( c1 == 0 || c2 == 0 ) + break; + else if (isdigit(c1) && isdigit(c2)) + { + lcmp = generic_strtol(str1, &p1, 10) - generic_strtol(str2, &p2, 10); + if ( lcmp == 0 ) + lcmp = (p2 - str2) - (p1 - str1); + if ( lcmp != 0 ) + return (lcmp > 0 ? 1 : -1); + str1 = p1, str2 = p2; + } + else + { + lcmp = (c1 - c2); + if (lcmp != 0) + return (lcmp > 0 ? 1 : -1); + ++str1, ++str2; + } + } + lcmp = (c1 - c2); + return ( lcmp < 0 ) ? -1 : (lcmp > 0 ? 1 : 0); + } +}; + +struct BufferEquivalent +{ + NumericStringEquivalence _strequiv; + DocTabView *_pTab; + int _iColumn; + bool _reverse; + BufferEquivalent(DocTabView *pTab, int iColumn, bool reverse) + : _pTab(pTab), _iColumn(iColumn), _reverse(reverse) + {} + + bool operator()(int i1, int i2) const + { + if (i1 == i2) return false; // equivalence test not equality + if (_reverse) std::swap(i1, i2); + return compare(i1, i2); + } + + bool compare(int i1, int i2) const + { + BufferID bid1 = _pTab->getBufferByIndex(i1); + BufferID bid2 = _pTab->getBufferByIndex(i2); + Buffer * b1 = MainFileManager->getBufferByID(bid1); + Buffer * b2 = MainFileManager->getBufferByID(bid2); + if (_iColumn == 0) + { + const TCHAR *s1 = b1->getFileName(); + const TCHAR *s2 = b2->getFileName(); + return _strequiv(s1, s2); + } + else if (_iColumn == 1) + { + const TCHAR *s1 = b1->getFullPathName(); + const TCHAR *s2 = b2->getFullPathName(); + return _strequiv(s1, s2); //we can compare the full path to sort on directory, since after sorting directories sorting files is the second thing to do (if directories are the same that is) + } + else if (_iColumn == 2) + { + int t1 = (int)b1->getLangType(); + int t2 = (int)b2->getLangType(); + return (t1 < t2); // yeah should be the name + } + return false; + } +}; + +////////////////// +// Window map tells CWinMgr how to position dialog controls +// +BEGIN_WINDOW_MAP(WindowsDlgMap) + BEGINROWS(WRCT_REST,0,RCMARGINS(8,8)) + BEGINCOLS(WRCT_REST,0,0) // Begin list control column + BEGINROWS(WRCT_REST,0,0) + RCREST(IDC_WINDOWS_LIST) + RCSPACE(20) + ENDGROUP() + RCSPACE(12) + BEGINROWS(WRCT_TOFIT,0,0) + RCSPACE(12) + RCTOFIT(IDOK) + RCSPACE(-12) + RCTOFIT(IDC_WINDOWS_SAVE) + RCSPACE(-12) + RCTOFIT(IDC_WINDOWS_CLOSE) + RCSPACE(-12) + RCTOFIT(IDC_WINDOWS_SORT) + RCREST(-1) + RCTOFIT(IDCANCEL) + ENDGROUP() + ENDGROUP() + ENDGROUP() +END_WINDOW_MAP() + +RECT WindowsDlg::_lastKnownLocation; + +WindowsDlg::WindowsDlg() : MyBaseClass(WindowsDlgMap), _isSorted(false) +{ + _szMinButton = SIZEZERO; + _szMinListCtrl = SIZEZERO; +} + +void WindowsDlg::init(HINSTANCE hInst, HWND parent, DocTabView *pTab) +{ + MyBaseClass::init(hInst, parent); + _pTab = pTab; +} + +void WindowsDlg::init(HINSTANCE hInst, HWND parent) +{ + assert(!"Call other initialize method"); + MyBaseClass::init(hInst, parent); + _pTab = NULL; +} + +BOOL CALLBACK WindowsDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG : + { + changeDlgLang(); + return MyBaseClass::run_dlgProc(message, wParam, lParam); + } + 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 WM_DESTROY : + //destroy(); + return TRUE; + + case WM_NOTIFY : + { + if (wParam == IDC_WINDOWS_LIST) + { + NMHDR* pNMHDR = (NMHDR*)lParam; + if (pNMHDR->code == LVN_GETDISPINFO) + { + NMLVDISPINFO *pLvdi = (NMLVDISPINFO *)pNMHDR; + //if(pLvdi->item.mask & LVIF_IMAGE) + // ; + if(pLvdi->item.mask & LVIF_TEXT) + { + pLvdi->item.pszText[0] = 0; + int index = pLvdi->item.iItem; + if (index >= _pTab->nbItem() || index >= (int)_idxMap.size()) + return FALSE; + index = _idxMap[index]; + + //const Buffer& buffer = _pView->getBufferAt(index); + BufferID bufID = _pTab->getBufferByIndex(index); + Buffer * buf = MainFileManager->getBufferByID(bufID); + if (pLvdi->item.iSubItem == 0) // file name + { + int len = pLvdi->item.cchTextMax; + const TCHAR *fileName = buf->getFileName(); + generic_strncpy(pLvdi->item.pszText, fileName, len-1); + pLvdi->item.pszText[len-1] = 0; + len = lstrlen(pLvdi->item.pszText); + if (buf->isDirty()) + { + if (len < pLvdi->item.cchTextMax) + { + pLvdi->item.pszText[len++] = '*'; + pLvdi->item.pszText[len] = 0; + } + } + else if (buf->isReadOnly()) + { + len += lstrlen(readonlyString); + if (len <= pLvdi->item.cchTextMax) + lstrcat(pLvdi->item.pszText, readonlyString); + } + } + else if (pLvdi->item.iSubItem == 1) // directory + { + const TCHAR *fullName = buf->getFullPathName(); + const TCHAR *fileName = buf->getFileName(); + int len = lstrlen(fullName)-lstrlen(fileName); + if (!len) { + len = 1; + fullName = TEXT(""); + } + if (pLvdi->item.cchTextMax < len) + len = pLvdi->item.cchTextMax; + generic_strncpy(pLvdi->item.pszText, fullName, len-1); + pLvdi->item.pszText[len-1] = 0; + } + else if (pLvdi->item.iSubItem == 2) // Type + { + int len = pLvdi->item.cchTextMax; + NppParameters *pNppParameters = NppParameters::getInstance(); + Lang *lang = pNppParameters->getLangFromID(buf->getLangType()); + if (NULL != lang) + { + generic_strncpy(pLvdi->item.pszText, lang->getLangName(), len-1); + } + } + } + return TRUE; + } + else if (pNMHDR->code == LVN_COLUMNCLICK) // sort columns with stable sort + { + NMLISTVIEW *pNMLV = (NMLISTVIEW *)pNMHDR; + if (pNMLV->iItem == -1) + { + bool reverse = false; + int iColumn = pNMLV->iSubItem; + if (_lastSort == iColumn) + { + reverse = true; + _lastSort = -1; + } + else + { + _lastSort = iColumn; + } + int i; + int n = _idxMap.size(); + vector sortMap; + sortMap.resize(n); + for (i=0; icode == LVN_ITEMACTIVATE || pNMHDR->code == LVN_ITEMCHANGED || pNMHDR->code == LVN_ODSTATECHANGED) + { + updateButtonState(); + return TRUE; + } + else if (pNMHDR->code == NM_DBLCLK) + { + ::PostMessage(_hSelf, WM_COMMAND, IDOK, 0); + //activateCurrent(); + return TRUE; + } + else if (pNMHDR->code == LVN_KEYDOWN) + { + NMLVKEYDOWN *lvkd = (NMLVKEYDOWN *)pNMHDR; + // Ctrl+A + short ctrl = GetKeyState(VK_CONTROL); + short alt = GetKeyState(VK_MENU); + short shift = GetKeyState(VK_SHIFT); + if (lvkd->wVKey == 0x41/*a*/ && ctrl<0 && alt>=0 && shift>=0) + { + for (int i=0, n=ListView_GetItemCount(_hList); iGetDocument()->FirstChild()->ToDeclaration(); + if (declaration) + { + const char * encodingStr = declaration->Encoding(); + nativeLangEncoding = getCpFromStringValue(encodingStr); + } +#endif + + // Set Title + const char *titre = (_dlgNode->ToElement())->Attribute("title"); + if (titre && titre[0]) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(titre, nativeLangEncoding); + ::SetWindowText(_hSelf, nameW); +#else + ::SetWindowText(_hSelf, titre); +#endif + } + + // Set the text of child control + for (TiXmlNodeA *childNode = _dlgNode->FirstChildElement("Item"); + childNode ; + childNode = childNode->NextSibling("Item") ) + { + TiXmlElementA *element = childNode->ToElement(); + int id; + const char *sentinel = element->Attribute("id", &id); + const char *name = element->Attribute("name"); + if (sentinel && (name && name[0])) + { + HWND hItem = ::GetDlgItem(_hSelf, id); + if (hItem) + { +#ifdef UNICODE + const wchar_t *nameW = wmc->char2wchar(name, nativeLangEncoding); + ::SetWindowText(hItem, nameW); +#else + ::SetWindowText(hItem, name); +#endif + } + } + } + return true; +} + +BOOL WindowsDlg::onInitDialog() +{ + _winMgr.InitToFitSizeFromCurrent(_hSelf); + + // save min size for OK/Cancel buttons + _szMinButton = RectToSize(_winMgr.GetRect(IDOK)); + _szMinListCtrl = RectToSize(_winMgr.GetRect(IDC_WINDOWS_LIST)); + _lastSort = -1; + + _winMgr.CalcLayout(_hSelf); + _winMgr.SetWindowPositions(_hSelf); + getClientRect(_rc); + + _hList = ::GetDlgItem(_hSelf, IDC_WINDOWS_LIST); + DWORD exStyle = ListView_GetExtendedListViewStyle(_hList); + exStyle |= LVS_EX_HEADERDRAGDROP|LVS_EX_FULLROWSELECT|LVS_EX_DOUBLEBUFFER; + ListView_SetExtendedListViewStyle(_hList, exStyle); + RECT rc; + GetClientRect(_hList, &rc); + LONG width = rc.right - rc.left; + + LVCOLUMN lvColumn; + memset(&lvColumn, 0, sizeof(lvColumn)); + lvColumn.mask = LVCF_WIDTH|LVCF_TEXT|LVCF_SUBITEM|LVCF_FMT; + lvColumn.fmt = LVCFMT_LEFT; + lvColumn.pszText = TEXT("Name"); + lvColumn.cx = width/4; + SendMessage(_hList, LVM_INSERTCOLUMN, 0, LPARAM(&lvColumn)); + + lvColumn.pszText = TEXT("Path"); + lvColumn.cx = 300; + SendMessage(_hList, LVM_INSERTCOLUMN, 1, LPARAM(&lvColumn)); + + lvColumn.fmt = LVCFMT_CENTER; + lvColumn.pszText = TEXT("Type"); + lvColumn.cx = 40; + SendMessage(_hList, LVM_INSERTCOLUMN, 2, LPARAM(&lvColumn)); + + fitColumnsToSize(); + + if (_lastKnownLocation.bottom > 0 && _lastKnownLocation.right > 0) + { + SetWindowPos(_hSelf, NULL, _lastKnownLocation.left, _lastKnownLocation.top, + _lastKnownLocation.right-_lastKnownLocation.left, _lastKnownLocation.bottom-_lastKnownLocation.top, SWP_SHOWWINDOW); + } + else + { + goToCenter(); + } + + doRefresh(true); + return TRUE; +} + +void WindowsDlg::onSize(UINT nType, int cx, int cy) +{ + MyBaseClass::onSize(nType, cx, cy); + fitColumnsToSize(); +} + +void WindowsDlg::onGetMinMaxInfo(MINMAXINFO* lpMMI) +{ + MyBaseClass::onGetMinMaxInfo(lpMMI); +} + +LRESULT WindowsDlg::onWinMgr(WPARAM wp, LPARAM lp) +{ + NMWINMGR &nmw = *(NMWINMGR *)lp; + if (nmw.code==NMWINMGR::GET_SIZEINFO) { + switch(wp) + { + case IDOK: + case IDCANCEL: + case IDC_WINDOWS_SAVE: + case IDC_WINDOWS_CLOSE: + case IDC_WINDOWS_SORT: + nmw.sizeinfo.szMin = _szMinButton; + nmw.processed = TRUE; + return TRUE; + + case IDC_WINDOWS_LIST: + nmw.sizeinfo.szMin = _szMinListCtrl; + nmw.processed = TRUE; + return TRUE; + } + } + return MyBaseClass::onWinMgr(wp, lp); +} + +void WindowsDlg::doRefresh(bool invalidate /*= false*/) +{ + if (_hSelf != NULL && isVisible()) + { + if (_hList != NULL) + { + size_t count = (_pTab != NULL) ? _pTab->nbItem() : 0; + size_t oldSize = _idxMap.size(); + if (!invalidate && count == oldSize) + return; + + if (count != oldSize) + { + size_t lo = 0; + _idxMap.resize(count); + if (oldSize < count) + lo = oldSize; + for (size_t i=lo; igetCurrentTabIndex(); + int pos = 0; + for (vector::iterator itr = _idxMap.begin(), end = _idxMap.end(); itr != end; ++itr, ++pos) + { + if (*itr == curSel) + { + ListView_SetItemState(_hList, pos, LVIS_SELECTED|LVIS_FOCUSED, LVIS_SELECTED|LVIS_FOCUSED) + } + else + { + ListView_SetItemState(_hList, pos, 0, LVIS_SELECTED); + } + } +} + +void WindowsDlg::doSave() +{ + NMWINDLG nmdlg; + nmdlg.type = WDT_SAVE; + 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 (UINT i=-1, j=0;;++j) { + i = ListView_GetNextItem(_hList, i, LVNI_SELECTED); + if (i == -1) break; + nmdlg.Items[j] = _idxMap[i]; + } + SendMessage(_hParent, WDN_NOTIFY, 0, LPARAM(&nmdlg)); + delete[] nmdlg.Items; + ::InvalidateRect(_hList, &_rc, FALSE); + ListView_RedrawItems(_hList, 0, ListView_GetSelectedCount(_hList)); +} + +void WindowsDlg::destroy() +{ + ::GetWindowRect(_hSelf, &_lastKnownLocation); + + HWND hSelf = _hSelf; + _hSelf = NULL; + ::DestroyWindow(hSelf); + +} + +void WindowsDlg::activateCurrent() +{ + if (ListView_GetSelectedCount(_hList) == 1) + { + NMWINDLG nmdlg; + nmdlg.type = WDT_ACTIVATE; + //nmdlg.curSel = ListView_GetNextItem(_hList, -1, LVNI_ALL|LVNI_SELECTED); + nmdlg.curSel = _idxMap[ListView_GetNextItem(_hList, -1, LVNI_ALL|LVNI_SELECTED)]; + nmdlg.hwndFrom = _hSelf; + nmdlg.code = WDN_NOTIFY; + SendMessage(_hParent, WDN_NOTIFY, 0, LPARAM(&nmdlg)); + + ::GetWindowRect(_hSelf, &_lastKnownLocation); + EndDialog(_hSelf, IDOK); + } +} + +void WindowsDlg::doClose() +{ + NMWINDLG nmdlg; + nmdlg.type = WDT_CLOSE; + //nmdlg.curSel = ListView_GetNextItem(_hList, -1, LVNI_SELECTED); + 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; + UINT n = nmdlg.nItems = ListView_GetSelectedCount(_hList); + nmdlg.Items = new UINT[nmdlg.nItems]; + vector key; + key.resize(n, 0x7fffffff); + for(UINT i=-1, j=0;; ++j) { + i = ListView_GetNextItem(_hList, i, LVNI_SELECTED); + if (i == -1) break; + ListView_SetItemState(_hList, i, 0, LVIS_SELECTED); // deselect + nmdlg.Items[j] = _idxMap[i]; + key[j] = i; + } + SendMessage(_hParent, WDN_NOTIFY, 0, LPARAM(&nmdlg)); + if (nmdlg.processed) + { + // Trying to retain sort order. fairly sure there is a much better algorithm for this + vector::iterator kitr = key.begin(); + for (UINT i=0; i::iterator itr = _idxMap.begin(), end = _idxMap.end(); itr != end; ++itr) + if (*itr > oldVal) + --(*itr); + } + } + _idxMap.erase(std::remove_if(_idxMap.begin(), _idxMap.end(), bind2nd(equal_to(), -1)), _idxMap.end()); + } + delete[] nmdlg.Items; + + if (_pTab->nbItem() != _idxMap.size()) + doRefresh(true); + else + { + // select first previously selected item (or last one if only the last one was removed) + if (index == _idxMap.size()) index --; + if (index >= 0) + { + ListView_SetItemState(_hList, index, LVIS_SELECTED, LVIS_SELECTED); + ListView_RedrawItems(_hList, 0, _idxMap.size() - 1); + } + ListView_SetItemCount(_hList, _idxMap.size()); + } +} + +void WindowsDlg::doSortToTabs() +{ + int curSel = ListView_GetNextItem(_hList, -1, LVNI_SELECTED); + + if (curSel == -1) + curSel = 0; + + NMWINDLG nmdlg; + nmdlg.type = WDT_SORT; + nmdlg.hwndFrom = _hSelf; + //nmdlg.curSel = curSel; + nmdlg.curSel = _idxMap[curSel]; + nmdlg.code = WDN_NOTIFY; + UINT n = nmdlg.nItems = ListView_GetItemCount(_hList); + nmdlg.Items = new UINT[nmdlg.nItems]; + vector key; + key.resize(n, 0x7fffffff); + for(UINT i=-1, j=0;; ++j) { + 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) + { + _idxMap.clear(); + doRefresh(true); + } + delete[] nmdlg.Items; +} + +WindowsMenu::WindowsMenu() +{} + +WindowsMenu::~WindowsMenu() +{ + if (_hMenu) + DestroyMenu(_hMenu); +} + +void WindowsMenu::init(HINSTANCE hInst, HMENU hMainMenu, const TCHAR *translation) +{ + _hMenu = ::LoadMenu(hInst, MAKEINTRESOURCE(IDR_WINDOWS_MENU)); + + if (translation && translation[0]) + { + generic_string windowStr(translation); + windowStr += TEXT("..."); + ::ModifyMenu(_hMenu, IDM_WINDOW_WINDOWS, MF_BYCOMMAND, IDM_WINDOW_WINDOWS, windowStr.c_str()); + } + + UINT pos = 0; + for(pos = GetMenuItemCount(hMainMenu) - 1; pos > 0; --pos) + { + if ((GetMenuState(hMainMenu, pos, MF_BYPOSITION) & MF_POPUP) != MF_POPUP) + continue; + break; + } + + MENUITEMINFO mii; + memset(&mii, 0, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_STRING|MIIM_SUBMENU; + + TCHAR buffer[32]; + LoadString(hInst, IDR_WINDOWS_MENU, buffer, 32); + mii.dwTypeData = (TCHAR *)((translation && translation[0])?translation:buffer); + mii.hSubMenu = _hMenu; + InsertMenuItem(hMainMenu, pos, TRUE, &mii); +} + +void WindowsMenu::initPopupMenu(HMENU hMenu, DocTabView *pTab) +{ + if (hMenu == _hMenu) + { + int curDoc = pTab->getCurrentTabIndex(); + int nMaxDoc = IDM_WINDOW_MRU_LIMIT - IDM_WINDOW_MRU_FIRST + 1; + int nDoc = pTab->nbItem(); + nDoc = min(nDoc, nMaxDoc); + int id, pos; + for (id=IDM_WINDOW_MRU_FIRST, pos=0; idgetBufferByIndex(pos); + Buffer * buf = MainFileManager->getBufferByID(bufID); + + MENUITEMINFO mii; + memset(&mii, 0, sizeof(mii)); + mii.cbSize = sizeof(mii); + mii.fMask = MIIM_STRING|MIIM_STATE|MIIM_ID; + mii.dwTypeData = buildFileName(buffer, 60, pos, buf->getFileName()); + mii.fState &= ~(MF_GRAYED|MF_DISABLED|MF_CHECKED); + if (pos == curDoc) + mii.fState |= MF_CHECKED; + mii.wID = id; + + UINT state = GetMenuState(hMenu, id, MF_BYCOMMAND); + if (state == -1) + InsertMenuItem(hMenu, IDM_WINDOW_WINDOWS, FALSE, &mii); + else + SetMenuItemInfo(hMenu, id, FALSE, &mii); + } + for ( ; id<=IDM_WINDOW_MRU_LIMIT; ++id) + { + DeleteMenu(hMenu, id, FALSE); + } + } +} +/* +void WindowsMenu::uninitPopupMenu(HMENU hMenu, ScintillaEditView *pView) +{ + if (hMenu == _hMenu) + { + + } +} +*/ +static TCHAR* convertFileName(TCHAR *buffer, const TCHAR *filename) +{ + TCHAR *b = buffer; + const TCHAR *p = filename; + while (*p) + { + if (*p == '&') *b++ = '&'; + *b++ = *p++; + } + *b = 0; + return buffer; +} + +TCHAR *WindowsMenu::buildFileName(TCHAR *buffer, int len, int pos, const TCHAR *filename) +{ + TCHAR cwd[MAX_PATH]; + buffer[0] = 0; + GetCurrentDirectory(_countof(cwd), cwd); + lstrcat(cwd, TEXT("\\")); + + TCHAR *itr = buffer; + TCHAR *end = buffer + len - 1; + if (pos < 9) + { + *itr++ = '&'; + *itr++ = '1' + pos; + } + else if (pos == 9) + { + *itr++ = '1'; + *itr++ = '&'; + *itr++ = '0'; + } + else + { + wsprintf(itr, TEXT("%d"), pos+1); + itr = itr + lstrlen(itr); + } + *itr++ = ':'; + *itr++ = ' '; + if (0 == generic_strnicmp(filename, cwd, lstrlen(cwd))) + { + TCHAR cnvName[MAX_PATH]; + const TCHAR *s1 = PathFindFileName(filename); + int len = lstrlen(s1); + if (len < (end-itr)) + { + lstrcpy(cnvName, s1); + } + else + { + int n = (len-3-(itr-buffer))/2; + generic_strncpy(cnvName, s1, n); + lstrcpy(cnvName+n, TEXT("...")); + lstrcat(cnvName, s1 + lstrlen(s1) - n); + } + convertFileName(itr, cnvName); + } + else + { + TCHAR cnvName[MAX_PATH*2]; + const TCHAR *s1 = convertFileName(cnvName, filename); + PathCompactPathEx(itr, filename, len - (itr-buffer), 0); + } + return buffer; +} \ No newline at end of file diff --git a/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.h b/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.h new file mode 100644 index 00000000..1580804e --- /dev/null +++ b/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.h @@ -0,0 +1,114 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef WINDOWS_DLG_H +#define WINDOWS_DLG_H + +#include "SizeableDlg.h" +#include "WindowsDlgRc.h" +#include "Parameters.h" +#include +#include + +class DocTabView; + +typedef enum { + WDT_ACTIVATE = 1, + WDT_SAVE = 2, + WDT_CLOSE = 3, + WDT_SORT = 4, +} WinDlgNotifyType; + + +struct NMWINDLG : public NMHDR { + + BOOL processed; + WinDlgNotifyType type; + UINT curSel; + UINT nItems; + UINT *Items; + + // ctor: initialize to zeroes + NMWINDLG() { memset(this,0,sizeof(NMWINDLG)); } +}; + +extern const UINT WDN_NOTIFY; + + +class WindowsDlg : public SizeableDlg +{ + typedef SizeableDlg MyBaseClass; + + class CachedValue + { + std::generic_string fullname; + int index; + }; + +public : + WindowsDlg(); + int doDialog(TiXmlNodeA *dlgNode); + virtual void init(HINSTANCE hInst, HWND parent, DocTabView *pTab); + + void doRefresh(bool invalidate = false); + bool changeDlgLang(); + +protected : + virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + virtual BOOL onInitDialog(); + virtual void onSize(UINT nType, int cx, int cy); + virtual void onGetMinMaxInfo(MINMAXINFO* lpMMI); + virtual LRESULT onWinMgr(WPARAM wp, LPARAM lp); + virtual void destroy(); + void fitColumnsToSize(); + void resetSelection(); + void doSave(); + void doClose(); + void doSortToTabs(); + void updateButtonState(); + void activateCurrent(); + + HWND _hList; + static RECT _lastKnownLocation; + SIZE _szMinButton; + SIZE _szMinListCtrl; + DocTabView *_pTab; + std::vector _idxMap; + int _lastSort; + bool _isSorted; + TiXmlNodeA *_dlgNode; + +private: + virtual void init(HINSTANCE hInst, HWND parent); +}; + +class WindowsMenu +{ +public: + WindowsMenu(); + ~WindowsMenu(); + void init(HINSTANCE hInst, HMENU hMainMenu, const TCHAR *translation); + //void initMenu(HMENU hMenu, ScintillaEditView *pView); + void initPopupMenu(HMENU hMenu, DocTabView *pTab); + //void uninitPopupMenu(HMENU hMenu, ScintillaEditView *pView); +private: + TCHAR *buildFileName(TCHAR *buffer, int len, int pos, const TCHAR *filename); + HMENU _hMenu; +}; + + +#endif //WINDOWS_DLG_H diff --git a/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.rc b/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.rc new file mode 100644 index 00000000..6ee96843 --- /dev/null +++ b/PowerEditor/src/WinControls/WindowsDlg/WindowsDlg.rc @@ -0,0 +1,48 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +//#ifndef _WINDOWS_ +#include +//#endif +#include "WindowsDlgRc.h" + +IDD_WINDOWS DIALOGEX 0, 0, 450, 300 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | DS_MODALFRAME +CAPTION "Windows" +FONT 8, TEXT("MS Shell Dlg"), 400, 0, 0x1 +BEGIN + CONTROL "", IDC_WINDOWS_LIST, TEXT("SysListView32"), LVS_REPORT | LVS_OWNERDATA | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | WS_BORDER | WS_TABSTOP, 7, 7, 206, 160 + DEFPUSHBUTTON "&Activate",IDOK,219,7,60,14 + PUSHBUTTON "&Save",IDC_WINDOWS_SAVE,219,26,60,14 + PUSHBUTTON "&Close Window(s)",IDC_WINDOWS_CLOSE,219,44,60,14 + PUSHBUTTON "Sort &Tabs",IDC_WINDOWS_SORT,219,60,60,14 + PUSHBUTTON "&OK",IDCANCEL,219,169,60,14 +END + +IDR_WINDOWS_MENU MENU +BEGIN + MENUITEM "Recent Window", IDM_WINDOW_MRU_FIRST, GRAYED + MENUITEM "&Windows...", IDM_WINDOW_WINDOWS +END + + +STRINGTABLE +BEGIN + IDR_WINDOWS_MENU "&Window" +END diff --git a/PowerEditor/src/WinControls/WindowsDlg/WindowsDlgRc.h b/PowerEditor/src/WinControls/WindowsDlg/WindowsDlgRc.h new file mode 100644 index 00000000..dbd18323 --- /dev/null +++ b/PowerEditor/src/WinControls/WindowsDlg/WindowsDlgRc.h @@ -0,0 +1,19 @@ +#ifdef __GNUC__ +#define _WIN32_IE 0x0600 + + #ifndef LVS_OWNERDATA + #define LVS_OWNERDATA 4096 + #endif + +#endif + +#define IDD_WINDOWS 7000 + #define IDC_WINDOWS_LIST (IDD_WINDOWS + 1) + #define IDC_WINDOWS_SAVE (IDD_WINDOWS + 2) + #define IDC_WINDOWS_CLOSE (IDD_WINDOWS + 3) + #define IDC_WINDOWS_SORT (IDD_WINDOWS + 4) + +#define IDR_WINDOWS_MENU 11000 + #define IDM_WINDOW_WINDOWS (IDR_WINDOWS_MENU + 1) + #define IDM_WINDOW_MRU_FIRST (IDR_WINDOWS_MENU + 20) + #define IDM_WINDOW_MRU_LIMIT (IDR_WINDOWS_MENU + 29) diff --git a/PowerEditor/src/WinControls/shortcut/RunMacroDlg.cpp b/PowerEditor/src/WinControls/shortcut/RunMacroDlg.cpp new file mode 100644 index 00000000..4cf0bad3 --- /dev/null +++ b/PowerEditor/src/WinControls/shortcut/RunMacroDlg.cpp @@ -0,0 +1,115 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +// created by Daniel Volk mordorpost@volkarts.com + +#include "RunMacroDlg.h" +#include "ScintillaEditView.h" +#include "Notepad_plus_msgs.h" +//#include "constant.h" + + +BOOL CALLBACK RunMacroDlg::run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) + { + case WM_INITDIALOG : + { + initMacroList(); + + TCHAR str[512]; + wsprintf(str, TEXT("%d"), m_Times); + + ::SetDlgItemText(_hSelf, IDC_M_RUN_TIMES, str); + switch ( m_Mode ) + { + case RM_RUN_MULTI: + check(IDC_M_RUN_MULTI); + break; + case RM_RUN_EOF: + check(IDC_M_RUN_EOF); + break; + } + ::SendDlgItemMessage(_hSelf, IDC_M_RUN_TIMES, EM_LIMITTEXT, 4, 0); + goToCenter(); + + return TRUE; + } + + case WM_COMMAND : + { + if (HIWORD(wParam) == EN_CHANGE) + { + switch (LOWORD(wParam)) + { + case IDC_M_RUN_TIMES: + check(IDC_M_RUN_MULTI); + return TRUE; + + default: + return FALSE; + } + } + + switch (wParam) + { + case IDCANCEL : + ::ShowWindow(_hSelf, SW_HIDE); + return TRUE; + + case IDOK : + if ( isCheckedOrNot(IDC_M_RUN_MULTI) ) + { + m_Mode = RM_RUN_MULTI; + m_Times = ::GetDlgItemInt(_hSelf, IDC_M_RUN_TIMES, NULL, FALSE); + } + else if ( isCheckedOrNot(IDC_M_RUN_EOF) ) + { + m_Mode = RM_RUN_EOF; + } + + if (::SendDlgItemMessage(_hSelf, IDC_MACRO_COMBO, CB_GETCOUNT, 0, 0)) + ::SendMessage(_hParent, WM_MACRODLGRUNMACRO, 0, 0); + + return TRUE; + + default: + if ((HIWORD(wParam) == CBN_SELCHANGE) && (LOWORD(wParam) == IDC_MACRO_COMBO)) + { + m_macroIndex = ::SendDlgItemMessage(_hSelf, IDC_MACRO_COMBO, CB_GETCURSEL, 0, 0); + return TRUE; + } + } + } + } + return FALSE; +} + +void RunMacroDlg::check(int id) +{ + // IDC_M_RUN_MULTI + if ( id == IDC_M_RUN_MULTI ) + ::SendDlgItemMessage(_hSelf, IDC_M_RUN_MULTI, BM_SETCHECK, BST_CHECKED, 0); + else + ::SendDlgItemMessage(_hSelf, IDC_M_RUN_MULTI, BM_SETCHECK, BST_UNCHECKED, 0); + + // IDC_M_RUN_EOF + if ( id == IDC_M_RUN_EOF ) + ::SendDlgItemMessage(_hSelf, IDC_M_RUN_EOF, BM_SETCHECK, BST_CHECKED, 0); + else + ::SendDlgItemMessage(_hSelf, IDC_M_RUN_EOF, BM_SETCHECK, BST_UNCHECKED, 0); +} diff --git a/PowerEditor/src/WinControls/shortcut/RunMacroDlg.h b/PowerEditor/src/WinControls/shortcut/RunMacroDlg.h new file mode 100644 index 00000000..8630caf2 --- /dev/null +++ b/PowerEditor/src/WinControls/shortcut/RunMacroDlg.h @@ -0,0 +1,97 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +// created by Daniel Volk mordorpost@volkarts.com + +#ifndef RUN_MACRO_DLG_H +#define RUN_MACRO_DLG_H + +#include + +#include "StaticDialog.h" +#include "RunMacroDlg_rc.h" +#include "Buffer.h" +#include "ScintillaEditView.h" +#include "StatusBar.h" + + +using namespace std; + +#define RM_CANCEL -1 +#define RM_RUN_MULTI 1 +#define RM_RUN_EOF 2 + +class RunMacroDlg : public StaticDialog +{ +public : + RunMacroDlg() : StaticDialog(), m_Mode(RM_RUN_MULTI), m_Times(1) {}; + ~RunMacroDlg() { + }; + + void init(HINSTANCE hInst, HWND hPere/*, ScintillaEditView **ppEditView*/) { + Window::init(hInst, hPere); + }; + + void doDialog(bool isRTL = false) { + if (!isCreated()) + create(IDD_RUN_MACRO_DLG, isRTL); + else + ::ShowWindow(_hSelf, SW_SHOW); + }; + + //virtual void create(int, bool = false); + + void initMacroList() { + if (!isCreated()) return; + + NppParameters *pNppParam = NppParameters::getInstance(); + vector & macroList = pNppParam->getMacroList(); + + ::SendDlgItemMessage(_hSelf, IDC_MACRO_COMBO, CB_RESETCONTENT, 0, 0); + + if (::SendMessage(_hParent, WM_ISCURRENTMACRORECORDED, 0, 0)) + ::SendDlgItemMessage(_hSelf, IDC_MACRO_COMBO, CB_ADDSTRING, 0, (LPARAM)TEXT("Current recorded macro")); + + for (size_t i = 0 ; i < macroList.size() ; i++) + ::SendDlgItemMessage(_hSelf, IDC_MACRO_COMBO, CB_ADDSTRING, 0, (LPARAM)macroList[i].getName()); + + ::SendDlgItemMessage(_hSelf, IDC_MACRO_COMBO, CB_SETCURSEL, 0, 0); + m_macroIndex = 0; + }; + + int getMode() const {return m_Mode;}; + int getTimes() const {return m_Times;}; + int getMacro2Exec() const { + bool isCurMacroPresent = ::SendMessage(_hParent, WM_ISCURRENTMACRORECORDED, 0, 0) == TRUE; + return isCurMacroPresent?(m_macroIndex - 1):m_macroIndex; + }; + +private : + virtual BOOL CALLBACK run_dlgProc(UINT message, WPARAM wParam, LPARAM lParam); + + bool isCheckedOrNot(int checkControlID) const { + return (BST_CHECKED == ::SendMessage(::GetDlgItem(_hSelf, checkControlID), BM_GETCHECK, 0, 0)); + }; + + void check(int); + + int m_Mode; + int m_Times; + int m_macroIndex; +}; + +#endif //RUN_MACRO_DLG_H diff --git a/PowerEditor/src/WinControls/shortcut/RunMacroDlg.rc b/PowerEditor/src/WinControls/shortcut/RunMacroDlg.rc new file mode 100644 index 00000000..615a75aa --- /dev/null +++ b/PowerEditor/src/WinControls/shortcut/RunMacroDlg.rc @@ -0,0 +1,41 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +// created by Daniel Volk mordorpost@volkarts.com + +#ifndef RUN_MACRO_DLG_RC +#define RUN_MACRO_DLG_RC +#include +#include "RunMacroDlg_rc.h" + +IDD_RUN_MACRO_DLG DIALOGEX 0, 0, 168, 110 +STYLE DS_SETFONT | DS_3DLOOK | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | + WS_SYSMENU +EXSTYLE WS_EX_TOOLWINDOW +CAPTION "Run Macro Multiple Times" +FONT 8, TEXT("MS Shell Dlg"), 400, 0, 0x1 +BEGIN + DEFPUSHBUTTON "&Run",IDOK,27,82,50,14 + PUSHBUTTON "&Cancel",IDCANCEL,91,82,50,14 + CONTROL "Run",IDC_M_RUN_MULTI,"Button",BS_AUTORADIOBUTTON,21,38,47,10 + CONTROL "Run until &end of file", IDC_M_RUN_EOF,"Button", BS_AUTORADIOBUTTON,21,56,140,10 + EDITTEXT IDC_M_RUN_TIMES,68,35,25,14,ES_AUTOHSCROLL | ES_NUMBER | WS_EX_DLGMODALFRAME + COMBOBOX IDC_MACRO_COMBO,67,10,96,30,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP + RTEXT "Macro to run :",IDC_MACRO2RUN_STATIC,5,12,59,8 + LTEXT "times",IDC_TIMES_STATIC,97,38,65,8 +END +#endif // RUN_MACRO_DLG_RC diff --git a/PowerEditor/src/WinControls/shortcut/RunMacroDlg_rc.h b/PowerEditor/src/WinControls/shortcut/RunMacroDlg_rc.h new file mode 100644 index 00000000..685c4eb0 --- /dev/null +++ b/PowerEditor/src/WinControls/shortcut/RunMacroDlg_rc.h @@ -0,0 +1,32 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +// created by Daniel Volk mordorpost@volkarts.com + +#ifndef RUN_MACRO_DLG_RC_H +#define RUN_MACRO_DLG_RC_H + +#define IDD_RUN_MACRO_DLG 8000 +#define IDC_M_RUN_MULTI 8001 +#define IDC_M_RUN_EOF 8002 +#define IDC_M_RUN_TIMES 8003 +#define IDC_MACRO_COMBO 8004 +//#define IDC_MACROGROUP_STATIC 8005 +#define IDC_TIMES_STATIC 8005 +#define IDC_MACRO2RUN_STATIC 8006 + +#endif //RUN_MACRO_DLG_RC_H diff --git a/PowerEditor/src/WinControls/shortcut/shortcut.cpp b/PowerEditor/src/WinControls/shortcut/shortcut.cpp new file mode 100644 index 00000000..1b96f63b --- /dev/null +++ b/PowerEditor/src/WinControls/shortcut/shortcut.cpp @@ -0,0 +1,823 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "shortcut.h" +#include "Parameters.h" +#include "ScintillaEditView.h" +#include "resource.h" +#include "Notepad_plus.h" + +#include "keys.h" +const int KEY_STR_LEN = 16; + +struct KeyIDNAME { + const TCHAR * name; + UCHAR id; +}; + +KeyIDNAME namedKeyArray[] = { +{TEXT("None"), VK_NULL}, + +{TEXT("Backspace"), VK_BACK}, +{TEXT("Tab"), VK_TAB}, +{TEXT("Enter"), VK_RETURN}, +{TEXT("Esc"), VK_ESCAPE}, +{TEXT("Spacebar"), VK_SPACE}, + +{TEXT("Page up"), VK_PRIOR}, +{TEXT("Page down"), VK_NEXT}, +{TEXT("End"), VK_END}, +{TEXT("Home"), VK_HOME}, +{TEXT("Left"), VK_LEFT}, +{TEXT("Up"), VK_UP}, +{TEXT("Right"), VK_RIGHT}, +{TEXT("Down"), VK_DOWN}, + +{TEXT("INS"), VK_INSERT}, +{TEXT("DEL"), VK_DELETE}, + +{TEXT("0"), VK_0}, +{TEXT("1"), VK_1}, +{TEXT("2"), VK_2}, +{TEXT("3"), VK_3}, +{TEXT("4"), VK_4}, +{TEXT("5"), VK_5}, +{TEXT("6"), VK_6}, +{TEXT("7"), VK_7}, +{TEXT("8"), VK_8}, +{TEXT("9"), VK_9}, +{TEXT("A"), VK_A}, +{TEXT("B"), VK_B}, +{TEXT("C"), VK_C}, +{TEXT("D"), VK_D}, +{TEXT("E"), VK_E}, +{TEXT("F"), VK_F}, +{TEXT("G"), VK_G}, +{TEXT("H"), VK_H}, +{TEXT("I"), VK_I}, +{TEXT("J"), VK_J}, +{TEXT("K"), VK_K}, +{TEXT("L"), VK_L}, +{TEXT("M"), VK_M}, +{TEXT("N"), VK_N}, +{TEXT("O"), VK_O}, +{TEXT("P"), VK_P}, +{TEXT("Q"), VK_Q}, +{TEXT("R"), VK_R}, +{TEXT("S"), VK_S}, +{TEXT("T"), VK_T}, +{TEXT("U"), VK_U}, +{TEXT("V"), VK_V}, +{TEXT("W"), VK_W}, +{TEXT("X"), VK_X}, +{TEXT("Y"), VK_Y}, +{TEXT("Z"), VK_Z}, + +{TEXT("Numpad 0"), VK_NUMPAD0}, +{TEXT("Numpad 1"), VK_NUMPAD1}, +{TEXT("Numpad 2"), VK_NUMPAD2}, +{TEXT("Numpad 3"), VK_NUMPAD3}, +{TEXT("Numpad 4"), VK_NUMPAD4}, +{TEXT("Numpad 5"), VK_NUMPAD5}, +{TEXT("Numpad 6"), VK_NUMPAD6}, +{TEXT("Numpad 7"), VK_NUMPAD7}, +{TEXT("Numpad 8"), VK_NUMPAD8}, +{TEXT("Numpad 9"), VK_NUMPAD9}, +{TEXT("Num *"), VK_MULTIPLY}, +{TEXT("Num +"), VK_ADD}, +//{TEXT("Num Enter"), VK_SEPARATOR}, //this one doesnt seem to work +{TEXT("Num -"), VK_SUBTRACT}, +{TEXT("Num ."), VK_DECIMAL}, +{TEXT("Num /"), VK_DIVIDE}, +{TEXT("F1"), VK_F1}, +{TEXT("F2"), VK_F2}, +{TEXT("F3"), VK_F3}, +{TEXT("F4"), VK_F4}, +{TEXT("F5"), VK_F5}, +{TEXT("F6"), VK_F6}, +{TEXT("F7"), VK_F7}, +{TEXT("F8"), VK_F8}, +{TEXT("F9"), VK_F9}, +{TEXT("F10"), VK_F10}, +{TEXT("F11"), VK_F11}, +{TEXT("F12"), VK_F12}, + +{TEXT("~"), VK_OEM_3}, +{TEXT("-"), VK_OEM_MINUS}, +{TEXT("="), VK_OEM_PLUS}, +{TEXT("["), VK_OEM_4}, +{TEXT("]"), VK_OEM_6}, +{TEXT(";"), VK_OEM_1}, +{TEXT("'"), VK_OEM_7}, +{TEXT("\\"), VK_OEM_5}, +{TEXT(","), VK_OEM_COMMA}, +{TEXT("."), VK_OEM_PERIOD}, +{TEXT("/"), VK_OEM_2}, + +{TEXT("<>"), VK_OEM_102}, +}; + +#define nrKeys sizeof(namedKeyArray)/sizeof(KeyIDNAME) + +/* +TCHAR vKeyArray[][KEY_STR_LEN] = \ +{TEXT(""), TEXT("BACKSPACE"), TEXT("TAB"), TEXT("ENTER"), TEXT("PAUSE"), TEXT("CAPS LOCK"), TEXT("ESC"), TEXT("SPACEBAR"), TEXT("PAGE UP"), TEXT("PAGE DOWN"),\ +"END", TEXT("HOME"), TEXT("LEFT ARROW"), TEXT("UP ARROW"), TEXT("RIGHT ARROW"), TEXT("DOWN ARROW"), TEXT("INS"), TEXT("DEL"),\ +"0", TEXT("1"), TEXT("2"), TEXT("3"), TEXT("4"), TEXT("5"), TEXT("6"), TEXT("7"), TEXT("8"), TEXT("9"),\ +"A", TEXT("B"), TEXT("C"), TEXT("D"), TEXT("E"), TEXT("F"), TEXT("G"), TEXT("H"), TEXT("I"), TEXT("J"), TEXT("K"), TEXT("L"), TEXT("M"),\ +"N", TEXT("O"), TEXT("P"), TEXT("Q"), TEXT("R"), TEXT("S"), TEXT("T"), TEXT("U"), TEXT("V"), TEXT("W"), TEXT("X"), TEXT("Y"), TEXT("Z"),\ +"NUMPAD0", TEXT("NUMPAD1"), TEXT("NUMPAD2"), TEXT("NUMPAD3"), TEXT("NUMPAD4"),\ +"NUMPAD5", TEXT("NUMPAD6"), TEXT("NUMPAD7"), TEXT("NUMPAD8"), TEXT("NUMPAD9"),\ +"F1", TEXT("F2"), TEXT("F3"), TEXT("F4"), TEXT("F5"), TEXT("F6"),\ +"F7", TEXT("F8"), TEXT("F9"), TEXT("F10"), TEXT("F11"), TEXT("F12")}; + +UCHAR vkeyValue[] = {\ +0x00, 0x08, 0x09, 0x0D, 0x13, 0x14, 0x1B, 0x20, 0x21, 0x22,\ +0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x2D, 0x2E, 0x30, 0x31,\ +0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42,\ +0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C,\ +0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56,\ +0x57, 0x58, 0x59, 0x5A, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65,\ +0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,\ +0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B}; +*/ + +generic_string Shortcut::toString() const +{ + generic_string sc = TEXT(""); + if (!isEnabled()) + return sc; + + if (_keyCombo._isCtrl) + sc += TEXT("Ctrl+"); + if (_keyCombo._isAlt) + sc += TEXT("Alt+"); + if (_keyCombo._isShift) + sc += TEXT("Shift+"); + + generic_string keyString; + getKeyStrFromVal(_keyCombo._key, keyString); + sc += keyString; + return sc; +} + +void Shortcut::setName(const TCHAR * name) { + lstrcpyn(_menuName, name, nameLenMax); + lstrcpyn(_name, name, nameLenMax); + int i = 0, j = 0; + while(name[j] != 0 && i < nameLenMax) { + if (name[j] != '&') { + _name[i] = name[j]; + i++; + } else { //check if this ampersand is being escaped + if (name[j+1] == '&') { //escaped ampersand + _name[i] = name[j]; + i++; + j++; //skip escaped ampersand + } + } + j++; + } + _name[i] = 0; +} + +generic_string ScintillaKeyMap::toString() const { + return toString(0); +} + +generic_string ScintillaKeyMap::toString(int index) const { + generic_string sc = TEXT(""); + if (!isEnabled()) + return sc; + + KeyCombo kc = _keyCombos[index]; + if (kc._isCtrl) + sc += TEXT("Ctrl+"); + if (kc._isAlt) + sc += TEXT("Alt+"); + if (kc._isShift) + sc += TEXT("Shift+"); + + generic_string keyString; + getKeyStrFromVal(kc._key, keyString); + sc += keyString; + return sc; +} + +KeyCombo ScintillaKeyMap::getKeyComboByIndex(int index) const { + return _keyCombos[index]; +} + +void ScintillaKeyMap::setKeyComboByIndex(int index, KeyCombo combo) { + if(combo._key == 0 && (size > 1)) { //remove the item if possible + _keyCombos.erase(_keyCombos.begin() + index); + } + _keyCombos[index] = combo; +} + +void ScintillaKeyMap::removeKeyComboByIndex(int index) { + if (size > 1 && index > -1 && index < int(size)) { + _keyCombos.erase(_keyCombos.begin() + index); + size--; + } +} + +int ScintillaKeyMap::addKeyCombo(KeyCombo combo) { //returns index where key is added, or -1 when invalid + if (combo._key == 0) //do not allow to add disabled keycombos + return -1; + if (!isEnabled()) { //disabled, override current combo with new enabled one + _keyCombos[0] = combo; + return 0; + } + for(size_t i = 0; i < size; i++) { //if already in the list do not add it + KeyCombo & kc = _keyCombos[i]; + if (combo._key == kc._key && combo._isCtrl == kc._isCtrl && combo._isAlt == kc._isAlt && combo._isShift == kc._isShift) + return i; //already in the list + } + _keyCombos.push_back(combo); + size++; + return (size - 1); +} + +bool ScintillaKeyMap::isEnabled() const { + return (_keyCombos[0]._key != 0); +} + +size_t ScintillaKeyMap::getSize() const { + return size; +} + +void getKeyStrFromVal(UCHAR keyVal, generic_string & str) +{ + str = TEXT(""); + bool found = false; + int i; + for (i = 0; i < nrKeys; i++) { + if (keyVal == namedKeyArray[i].id) { + found = true; + break; + } + } + if (found) + str = namedKeyArray[i].name; + else + str = TEXT("Unlisted"); +} + +void getNameStrFromCmd(DWORD cmd, generic_string & str) +{ + if ((cmd >= ID_MACRO) && (cmd < ID_MACRO_LIMIT)) + { + vector & theMacros = (NppParameters::getInstance())->getMacroList(); + int i = cmd - ID_MACRO; + str = theMacros[i].getName(); + } + else if ((cmd >= ID_USER_CMD) && (cmd < ID_USER_CMD_LIMIT)) + { + vector & userCommands = (NppParameters::getInstance())->getUserCommandList(); + int i = cmd - ID_USER_CMD; + str = userCommands[i].getName(); + } + else if ((cmd >= ID_PLUGINS_CMD) && (cmd < ID_PLUGINS_CMD_LIMIT)) + { + vector & pluginCmds = (NppParameters::getInstance())->getPluginCommandList(); + int i = 0; + for (size_t j = 0 ; j < pluginCmds.size() ; j++) + { + if (pluginCmds[j].getID() == cmd) + { + i = j; + break; + } + } + str = pluginCmds[i].getName(); + } + else + { + HWND hNotepad_plus = ::FindWindow(Notepad_plus::getClassName(), NULL); + const int commandSize = 64; + TCHAR cmdName[commandSize]; + int nbChar = ::GetMenuString((HMENU)::SendMessage(hNotepad_plus, NPPM_INTERNAL_GETMENU, 0, 0), cmd, cmdName, commandSize, MF_BYCOMMAND); + if (!nbChar) + return; + bool fin = false; + int j = 0; + size_t len = lstrlen(cmdName); + for (size_t i = 0 ; i < len; i++) + { + switch(cmdName[i]) + { + case '\t': + cmdName[j] = '\0'; + fin = true; + break; + + case '&': + break; + + default : + cmdName[j++] = cmdName[i]; + } + if (fin) + break; + } + cmdName[j] = '\0'; + str = cmdName; + } + return; +} + +BOOL CALLBACK Shortcut::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + switch (Message) + { + case WM_INITDIALOG : + { + ::SetDlgItemText(_hSelf, IDC_NAME_EDIT, getMenuName()); //display the menu name, with ampersands + if (!_canModifyName) + ::SendDlgItemMessage(_hSelf, IDC_NAME_EDIT, EM_SETREADONLY, TRUE, 0); + int textlen = (int)::SendDlgItemMessage(_hSelf, IDC_NAME_EDIT, WM_GETTEXTLENGTH, 0, 0); + + ::SendDlgItemMessage(_hSelf, IDC_CTRL_CHECK, BM_SETCHECK, _keyCombo._isCtrl?BST_CHECKED:BST_UNCHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDC_ALT_CHECK, BM_SETCHECK, _keyCombo._isAlt?BST_CHECKED:BST_UNCHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDC_SHIFT_CHECK, BM_SETCHECK, _keyCombo._isShift?BST_CHECKED:BST_UNCHECKED, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), isValid() && (textlen > 0 || !_canModifyName)); + int iFound = -1; + for (size_t i = 0 ; i < nrKeys ; i++) + { + ::SendDlgItemMessage(_hSelf, IDC_KEY_COMBO, CB_ADDSTRING, 0, (LPARAM)namedKeyArray[i].name); + + if (_keyCombo._key == namedKeyArray[i].id) + iFound = i; + } + + if (iFound != -1) + ::SendDlgItemMessage(_hSelf, IDC_KEY_COMBO, CB_SETCURSEL, iFound, 0); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_WARNING_STATIC), isEnabled()?SW_HIDE:SW_SHOW); + + goToCenter(); + return TRUE; + } + + case WM_COMMAND : + { + int textlen = (int)::SendDlgItemMessage(_hSelf, IDC_NAME_EDIT, WM_GETTEXTLENGTH, 0, 0); + switch (wParam) + { + case IDC_CTRL_CHECK : + _keyCombo._isCtrl = BST_CHECKED == ::SendDlgItemMessage(_hSelf, wParam, BM_GETCHECK, 0, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), isValid() && (textlen > 0 || !_canModifyName)); + return TRUE; + + case IDC_ALT_CHECK : + _keyCombo._isAlt = BST_CHECKED == ::SendDlgItemMessage(_hSelf, wParam, BM_GETCHECK, 0, 0); + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), isValid() && (textlen > 0 || !_canModifyName)); + return TRUE; + + case IDC_SHIFT_CHECK : + _keyCombo._isShift = BST_CHECKED == ::SendDlgItemMessage(_hSelf, wParam, BM_GETCHECK, 0, 0); + return TRUE; + + case IDOK : + if (!isEnabled()) { + _keyCombo._isCtrl = _keyCombo._isAlt = _keyCombo._isShift = false; + } + if (_canModifyName) { + TCHAR editName[nameLenMax]; + ::SendDlgItemMessage(_hSelf, IDC_NAME_EDIT, WM_GETTEXT, nameLenMax, (LPARAM)editName); + setName(editName); + } + ::EndDialog(_hSelf, 0); + return TRUE; + + case IDCANCEL : + ::EndDialog(_hSelf, -1); + return TRUE; + + default: + if (HIWORD(wParam) == EN_CHANGE) + { + if (LOWORD(wParam) == IDC_NAME_EDIT) + { + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), isValid() && (textlen > 0 || !_canModifyName)); + return TRUE; + } + } + else if (HIWORD(wParam) == CBN_SELCHANGE) + { + if (LOWORD(wParam) == IDC_KEY_COMBO) + { + int i = ::SendDlgItemMessage(_hSelf, LOWORD(wParam), CB_GETCURSEL, 0, 0); + _keyCombo._key = namedKeyArray[i].id; + ::EnableWindow(::GetDlgItem(_hSelf, IDOK), isValid() && (textlen > 0 || !_canModifyName)); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_WARNING_STATIC), isEnabled()?SW_HIDE:SW_SHOW); + return TRUE; + } + } + return FALSE; + } + } + default : + return FALSE; + } + return FALSE; +} + +// return true if one of CommandShortcuts is deleted. Otherwise false. +void Accelerator::updateShortcuts() +{ + NppParameters *pNppParam = NppParameters::getInstance(); + + vector & shortcuts = pNppParam->getUserShortcuts(); + vector & macros = pNppParam->getMacroList(); + vector & userCommands = pNppParam->getUserCommandList(); + vector & pluginCommands = pNppParam->getPluginCommandList(); + + size_t nbMenu = shortcuts.size(); + size_t nbMacro = macros.size(); + size_t nbUserCmd = userCommands.size(); + size_t nbPluginCmd = pluginCommands.size(); + + if (_pAccelArray) + delete [] _pAccelArray; + _pAccelArray = new ACCEL[nbMenu+nbMacro+nbUserCmd+nbPluginCmd]; + + int offset = 0; + size_t i = 0; + //no validation performed, it might be that invalid shortcuts are being used by default. Allows user to 'hack', might be a good thing + for(i = 0; i < nbMenu; i++) { + if (shortcuts[i].isEnabled()) {// && shortcuts[i].isValid()) { + _pAccelArray[offset].cmd = (WORD)(shortcuts[i].getID()); + _pAccelArray[offset].fVirt = shortcuts[i].getAcceleratorModifiers(); + _pAccelArray[offset].key = shortcuts[i].getKeyCombo()._key; + offset++; + } + } + + for(i = 0; i < nbMacro; i++) { + if (macros[i].isEnabled()) {// && macros[i].isValid()) { + _pAccelArray[offset].cmd = (WORD)(macros[i].getID()); + _pAccelArray[offset].fVirt = macros[i].getAcceleratorModifiers(); + _pAccelArray[offset].key = macros[i].getKeyCombo()._key; + offset++; + } + } + + for(i = 0; i < nbUserCmd; i++) { + if (userCommands[i].isEnabled()) {// && userCommands[i].isValid()) { + _pAccelArray[offset].cmd = (WORD)(userCommands[i].getID()); + _pAccelArray[offset].fVirt = userCommands[i].getAcceleratorModifiers(); + _pAccelArray[offset].key = userCommands[i].getKeyCombo()._key; + offset++; + } + } + + for(i = 0; i < nbPluginCmd; i++) { + if (pluginCommands[i].isEnabled()) {// && pluginCommands[i].isValid()) { + _pAccelArray[offset].cmd = (WORD)(pluginCommands[i].getID()); + _pAccelArray[offset].fVirt = pluginCommands[i].getAcceleratorModifiers(); + _pAccelArray[offset].key = pluginCommands[i].getKeyCombo()._key; + offset++; + } + } + + _nbAccelItems = offset; + + updateFullMenu(); + reNew(); //update the table + return; +} + +void Accelerator::updateFullMenu() { + NppParameters * pNppParam = NppParameters::getInstance(); + vector commands = pNppParam->getUserShortcuts(); + for(size_t i = 0; i < commands.size(); i++) { + updateMenuItemByCommand(commands[i]); + } + + vector mcommands = pNppParam->getMacroList(); + for(size_t i = 0; i < mcommands.size(); i++) { + updateMenuItemByCommand(mcommands[i]); + } + + vector ucommands = pNppParam->getUserCommandList(); + for(size_t i = 0; i < ucommands.size(); i++) { + updateMenuItemByCommand(ucommands[i]); + } + + vector pcommands = pNppParam->getPluginCommandList(); + for(size_t i = 0; i < pcommands.size(); i++) { + updateMenuItemByCommand(pcommands[i]); + } + + ::DrawMenuBar(_hMenuParent); +} + +void Accelerator::updateMenuItemByCommand(CommandShortcut csc) { + int cmdID = (int)csc.getID(); + ::ModifyMenu(_hAccelMenu, cmdID, MF_BYCOMMAND, cmdID, csc.toMenuItemString().c_str()); +} + +recordedMacroStep::recordedMacroStep(int iMessage, long wParam, long lParam) + : message(iMessage), wParameter(wParam), lParameter(lParam), MacroType(mtUseLParameter) +{ + if (lParameter) { + switch (message) { + case SCI_SETTEXT : + case SCI_REPLACESEL : + case SCI_REPLACETARGET : + case SCI_REPLACETARGETRE : + case SCI_SEARCHINTARGET : + case SCI_ADDTEXT : + case SCI_ADDSTYLEDTEXT : + case SCI_INSERTTEXT : + case SCI_APPENDTEXT : + case SCI_SETWORDCHARS : + case SCI_SETWHITESPACECHARS : + case SCI_SETSTYLINGEX : + case SCI_TEXTWIDTH : + case SCI_STYLESETFONT : + case SCI_SEARCHNEXT : + case SCI_SEARCHPREV : + sParameter = *reinterpret_cast(lParameter); + MacroType = mtUseSParameter; + lParameter = 0; + break; + + default : // for all other messages, use lParameter "as is" + break; + } + } +} + +void recordedMacroStep::PlayBack(Window* pNotepad, ScintillaEditView *pEditView) +{ + if (MacroType == mtMenuCommand) + ::SendMessage(pNotepad->getHSelf(), WM_COMMAND, wParameter, 0); + + else + { + long lParam = lParameter; + if (MacroType == mtUseSParameter) + lParam = reinterpret_cast(sParameter.c_str()); + pEditView->execute(message, wParameter, lParam); + if ( (message == SCI_SETTEXT) + || (message == SCI_REPLACESEL) + || (message == SCI_ADDTEXT) + || (message == SCI_ADDSTYLEDTEXT) + || (message == SCI_INSERTTEXT) + || (message == SCI_APPENDTEXT) ) { + SCNotification scnN; + scnN.nmhdr.code = SCN_CHARADDED; + scnN.nmhdr.hwndFrom = pEditView->getHSelf(); + scnN.nmhdr.idFrom = 0; + scnN.ch = sParameter.at(0); + ::SendMessage(pNotepad->getHSelf(), WM_NOTIFY, 0, reinterpret_cast(&scnN)); + } + } +} + +void ScintillaAccelerator::init(vector * vScintillas, HMENU hMenu, HWND menuParent) { + _hAccelMenu = hMenu; + _hMenuParent = menuParent; + size_t nr = vScintillas->size(); + for(size_t i = 0; i < nr; i++) { + _vScintillas.push_back(vScintillas->at(i)); + } + _nrScintillas = (int)nr; +} + +void ScintillaAccelerator::updateKeys() +{ + NppParameters *pNppParam = NppParameters::getInstance(); + vector & map = pNppParam->getScintillaKeyList(); + size_t mapSize = map.size(); + size_t index; + + for(int i = 0; i < _nrScintillas; i++) + { + ::SendMessage(_vScintillas[i], SCI_CLEARALLCMDKEYS, 0, 0); + for(size_t j = mapSize - 1; j >= 0; j--) //reverse order, top of the list has highest priority + { + ScintillaKeyMap skm = map[j]; + if (skm.isEnabled()) + { //no validating, scintilla accepts more keys + size_t size = skm.getSize(); + for(index = 0; index < size; index++) + ::SendMessage(_vScintillas[i], SCI_ASSIGNCMDKEY, skm.toKeyDef(index), skm.getScintillaKeyID()); + } + if (skm.getMenuCmdID() != 0) + { + updateMenuItemByID(skm, skm.getMenuCmdID()); + } + if (j == 0) //j is unsigned, so default method doesnt work + break; + } + } +} + +void ScintillaAccelerator::updateMenuItemByID(ScintillaKeyMap skm, int id) +{ + NppParameters *pNppParam = NppParameters::getInstance(); + const int commandSize = 64; + TCHAR cmdName[commandSize]; + ::GetMenuString(_hAccelMenu, id, cmdName, commandSize, MF_BYCOMMAND); + int i = 0; + while(cmdName[i] != 0) + { + if (cmdName[i] == '\t') + { + cmdName[i] = 0; + break; + } + i++; + } + generic_string menuItem = cmdName; + if (skm.isEnabled()) + { + menuItem += TEXT("\t"); + //menuItem += TEXT("Sc:"); //sc: scintilla shortcut + menuItem += skm.toString(); + } + ::ModifyMenu(_hAccelMenu, id, MF_BYCOMMAND, id, menuItem.c_str()); + ::DrawMenuBar(_hMenuParent); +} + +//This procedure uses _keyCombo as a temp. variable to store current settings which can then later be applied (by pressing OK) +void ScintillaKeyMap::applyToCurrentIndex() { + int index = (int)::SendDlgItemMessage(_hSelf, IDC_LIST_KEYS, LB_GETCURSEL, 0, 0); + if(index == LB_ERR) + return; + setKeyComboByIndex(index, _keyCombo); + updateListItem(index); + ::SendDlgItemMessage(_hSelf, IDC_LIST_KEYS, LB_SETCURSEL, index, 0); + +} + +void ScintillaKeyMap::validateDialog() { + bool valid = isValid(); //current combo valid? + bool isDisabling = _keyCombo._key == 0; //true if this keycombo were to disable the shortcut + bool isDisabled = !isEnabled(); //true if this shortcut already is + + ::EnableWindow(::GetDlgItem(_hSelf, IDC_BUTTON_ADD), valid && !isDisabling); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_BUTTON_APPLY), valid && (!isDisabling || size == 1)); + ::EnableWindow(::GetDlgItem(_hSelf, IDC_BUTTON_RMVE), (size > 1)?TRUE:FALSE); + ::ShowWindow(::GetDlgItem(_hSelf, IDC_WARNING_STATIC), isDisabled?SW_SHOW:SW_HIDE); +} + +void ScintillaKeyMap::showCurrentSettings() { + int i = ::SendDlgItemMessage(_hSelf, IDC_LIST_KEYS, LB_GETCURSEL, 0, 0); + _keyCombo = _keyCombos[i]; + ::SendDlgItemMessage(_hSelf, IDC_CTRL_CHECK, BM_SETCHECK, _keyCombo._isCtrl?BST_CHECKED:BST_UNCHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDC_ALT_CHECK, BM_SETCHECK, _keyCombo._isAlt?BST_CHECKED:BST_UNCHECKED, 0); + ::SendDlgItemMessage(_hSelf, IDC_SHIFT_CHECK, BM_SETCHECK, _keyCombo._isShift?BST_CHECKED:BST_UNCHECKED, 0); + for (size_t i = 0 ; i < nrKeys ; i++) + { + if (_keyCombo._key == namedKeyArray[i].id) + { + ::SendDlgItemMessage(_hSelf, IDC_KEY_COMBO, CB_SETCURSEL, i, 0); + break; + } + } +} + +void ScintillaKeyMap::updateListItem(int index) { + ::SendDlgItemMessage(_hSelf, IDC_LIST_KEYS, LB_INSERTSTRING, index, (LPARAM)toString(index).c_str()); + ::SendDlgItemMessage(_hSelf, IDC_LIST_KEYS, LB_DELETESTRING, index+1, 0); +} + +BOOL CALLBACK ScintillaKeyMap::run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) +{ + + switch (Message) + { + case WM_INITDIALOG : + { + ::SetDlgItemText(_hSelf, IDC_NAME_EDIT, _name); + int textlen = (int)::SendDlgItemMessage(_hSelf, IDC_NAME_EDIT, WM_GETTEXTLENGTH, 0, 0); + _keyCombo = _keyCombos[0]; + + for (size_t i = 0 ; i < nrKeys ; i++) + { + ::SendDlgItemMessage(_hSelf, IDC_KEY_COMBO, CB_ADDSTRING, 0, (LPARAM)namedKeyArray[i].name); + } + + for(size_t i = 0; i < size; i++) { + ::SendDlgItemMessage(_hSelf, IDC_LIST_KEYS, LB_ADDSTRING, 0, (LPARAM)toString(i).c_str()); + } + ::SendDlgItemMessage(_hSelf, IDC_LIST_KEYS, LB_SETCURSEL, 0, 0); + + showCurrentSettings(); + validateDialog(); + + goToCenter(); + return TRUE; + } + + case WM_COMMAND : + { + switch (wParam) + { + case IDC_CTRL_CHECK : + _keyCombo._isCtrl = BST_CHECKED == ::SendDlgItemMessage(_hSelf, wParam, BM_GETCHECK, 0, 0); + //applyToCurrentIndex(); + validateDialog(); + return TRUE; + + case IDC_ALT_CHECK : + _keyCombo._isAlt = BST_CHECKED == ::SendDlgItemMessage(_hSelf, wParam, BM_GETCHECK, 0, 0); + //applyToCurrentIndex(); + validateDialog(); + return TRUE; + + case IDC_SHIFT_CHECK : + _keyCombo._isShift = BST_CHECKED == ::SendDlgItemMessage(_hSelf, wParam, BM_GETCHECK, 0, 0); + //applyToCurrentIndex(); + return TRUE; + + case IDOK : + //Cleanup + _keyCombo._key = 0; + _keyCombo._isCtrl = _keyCombo._isAlt = _keyCombo._isShift = false; + ::EndDialog(_hSelf, 0); + return TRUE; + + case IDCANCEL : + ::EndDialog(_hSelf, -1); + return TRUE; + + case IDC_BUTTON_ADD: { + int oldsize = size; + int res = addKeyCombo(_keyCombo); + if (res > -1) { + if (res == oldsize) { + ::SendDlgItemMessage(_hSelf, IDC_LIST_KEYS, LB_INSERTSTRING, -1, (LPARAM)toString(res).c_str()); + }else { //update current generic_string, can happen if it was disabled + updateListItem(res); + } + ::SendDlgItemMessage(_hSelf, IDC_LIST_KEYS, LB_SETCURSEL, res, 0); + } + showCurrentSettings(); + validateDialog(); + return TRUE; } + + case IDC_BUTTON_RMVE: { + if (size == 1) //cannot delete last shortcut + return TRUE; + int i = ::SendDlgItemMessage(_hSelf, IDC_LIST_KEYS, LB_GETCURSEL, 0, 0); + removeKeyComboByIndex(i); + ::SendDlgItemMessage(_hSelf, IDC_LIST_KEYS, LB_DELETESTRING, i, 0); + if (i == size) + i = size - 1; + ::SendDlgItemMessage(_hSelf, IDC_LIST_KEYS, LB_SETCURSEL, i, 0); + showCurrentSettings(); + validateDialog(); + return TRUE; } + + case IDC_BUTTON_APPLY: { + applyToCurrentIndex(); + validateDialog(); + return TRUE; } + + default: + if (HIWORD(wParam) == CBN_SELCHANGE || HIWORD(wParam) == LBN_SELCHANGE) + { + switch(LOWORD(wParam)) { + case IDC_KEY_COMBO: + { + int i = ::SendDlgItemMessage(_hSelf, IDC_KEY_COMBO, CB_GETCURSEL, 0, 0); + _keyCombo._key = namedKeyArray[i].id; + //applyToCurrentIndex(); + validateDialog(); + return TRUE; + } + case IDC_LIST_KEYS: + { + showCurrentSettings(); + return TRUE; + } + } + } + return FALSE; + } + } + default : + return FALSE; + } + + return FALSE; +} diff --git a/PowerEditor/src/WinControls/shortcut/shortcut.h b/PowerEditor/src/WinControls/shortcut/shortcut.h new file mode 100644 index 00000000..c9c5b438 --- /dev/null +++ b/PowerEditor/src/WinControls/shortcut/shortcut.h @@ -0,0 +1,381 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. +#ifndef SHORTCUTS_H +#define SHORTCUTS_H + +//#include "Parameters.h" +#include +#include +#include +#include "shortcutRc.h" +#include "StaticDialog.h" +#include "Scintilla.h" +#include "Common.h" + +using namespace std; + +const size_t nameLenMax = 64; + +class NppParameters; + +void getKeyStrFromVal(UCHAR keyVal, generic_string & str); +void getNameStrFromCmd(DWORD cmd, generic_string & str); +static int keyTranslate(int keyIn) { + switch (keyIn) { + case VK_DOWN: return SCK_DOWN; + case VK_UP: return SCK_UP; + case VK_LEFT: return SCK_LEFT; + case VK_RIGHT: return SCK_RIGHT; + case VK_HOME: return SCK_HOME; + case VK_END: return SCK_END; + case VK_PRIOR: return SCK_PRIOR; + case VK_NEXT: return SCK_NEXT; + case VK_DELETE: return SCK_DELETE; + case VK_INSERT: return SCK_INSERT; + case VK_ESCAPE: return SCK_ESCAPE; + case VK_BACK: return SCK_BACK; + case VK_TAB: return SCK_TAB; + case VK_RETURN: return SCK_RETURN; + case VK_ADD: return SCK_ADD; + case VK_SUBTRACT: return SCK_SUBTRACT; + case VK_DIVIDE: return SCK_DIVIDE; + case VK_OEM_2: return '/'; + case VK_OEM_3: return '`'; + case VK_OEM_4: return '['; + case VK_OEM_5: return '\\'; + case VK_OEM_6: return ']'; + default: return keyIn; + } +}; + +struct KeyCombo { + bool _isCtrl; + bool _isAlt; + bool _isShift; + UCHAR _key; +}; + +class Shortcut : public StaticDialog { +public: + Shortcut(): _canModifyName(false) { + setName(TEXT("")); + _keyCombo._isCtrl = false; + _keyCombo._isAlt = false; + _keyCombo._isShift = false; + _keyCombo._key = 0; + }; + + Shortcut(const TCHAR *name, bool isCtrl, bool isAlt, bool isShift, UCHAR key) : _canModifyName(false) { + _name[0] = '\0'; + if (name) { + setName(name); + } else { + setName(TEXT("")); + } + _keyCombo._isCtrl = isCtrl; + _keyCombo._isAlt = isAlt; + _keyCombo._isShift = isShift; + _keyCombo._key = key; + }; + + Shortcut(const Shortcut & sc) { + setName(sc.getMenuName()); + _keyCombo = sc._keyCombo; + _canModifyName = sc._canModifyName; + } + + BYTE getAcceleratorModifiers() { + return ( FVIRTKEY | (_keyCombo._isCtrl?FCONTROL:0) | (_keyCombo._isAlt?FALT:0) | (_keyCombo._isShift?FSHIFT:0) ); + }; + + Shortcut & operator=(const Shortcut & sc) { + //Do not allow setting empty names + //So either we have an empty name or the other name has to be set + if (_name[0] == 0 || sc._name[0] != 0) { + setName(sc.getMenuName()); + } + _keyCombo = sc._keyCombo; + this->_canModifyName = sc._canModifyName; + return *this; + } + friend inline const bool operator==(const Shortcut & a, const Shortcut & b) { + return ((lstrcmp(a.getMenuName(), b.getMenuName()) == 0) && + (a._keyCombo._isCtrl == b._keyCombo._isCtrl) && + (a._keyCombo._isAlt == b._keyCombo._isAlt) && + (a._keyCombo._isShift == b._keyCombo._isShift) && + (a._keyCombo._key == b._keyCombo._key) + ); + }; + + friend inline const bool operator!=(const Shortcut & a, const Shortcut & b) { + return !(a == b); + }; + + virtual int doDialog() { + return ::DialogBoxParam(_hInst, MAKEINTRESOURCE(IDD_SHORTCUT_DLG), _hParent, (DLGPROC)dlgProc, (LPARAM)this); + }; + + virtual bool isValid() const { //valid should only be used in cases where the shortcut isEnabled(). + if (_keyCombo._key == 0) + return true; //disabled _keyCombo always valid, just disabled + + //These keys need a modifier, else invalid + if ( ((_keyCombo._key >= 'A') && (_keyCombo._key <= 'Z')) || ((_keyCombo._key >= '0') && (_keyCombo._key <= '9')) || _keyCombo._key == VK_SPACE || _keyCombo._key == VK_CAPITAL || _keyCombo._key == VK_BACK || _keyCombo._key == VK_RETURN) { + return ((_keyCombo._isCtrl) || (_keyCombo._isAlt)); + } + // the remaining keys are always valid + return true; + }; + virtual bool isEnabled() const { //true if _keyCombo != 0, false if _keyCombo == 0, in which case no accelerator should be made + return (_keyCombo._key != 0); + }; + + virtual generic_string toString() const; //the hotkey part + generic_string toMenuItemString() const { //generic_string suitable for menu + generic_string str = _menuName; + if(isEnabled()) + { + str += TEXT("\t"); + str += toString(); + } + return str; + }; + const KeyCombo & getKeyCombo() const { + return _keyCombo; + }; + + const TCHAR * getName() const { + return _name; + }; + + const TCHAR * getMenuName() const { + return _menuName; + } + + void setName(const TCHAR * name); + +protected : + KeyCombo _keyCombo; + virtual BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); + bool _canModifyName; + TCHAR _name[nameLenMax]; //normal name is plain text (for display purposes) + TCHAR _menuName[nameLenMax]; //menu name has ampersands for quick keys +}; + +class CommandShortcut : public Shortcut { +public: + CommandShortcut(Shortcut sc, long id) : Shortcut(sc), _id(id) {}; + unsigned long getID() const {return _id;}; + void setID(unsigned long id) { _id = id;}; + +private : + unsigned long _id; +}; + + +class ScintillaKeyMap : public Shortcut { +public: + ScintillaKeyMap(Shortcut sc, unsigned long scintillaKeyID, unsigned long id): Shortcut(sc), _menuCmdID(id), _scintillaKeyID(scintillaKeyID) { + _keyCombos.clear(); + _keyCombos.push_back(_keyCombo); + _keyCombo._key = 0; + size = 1; + }; + unsigned long getScintillaKeyID() const {return _scintillaKeyID;}; + int getMenuCmdID() const {return _menuCmdID;}; + int toKeyDef(int index) const { + KeyCombo kc = _keyCombos[index]; + int keymod = (kc._isCtrl?SCMOD_CTRL:0) | (kc._isAlt?SCMOD_ALT:0) | (kc._isShift?SCMOD_SHIFT:0); + return keyTranslate((int)kc._key) + (keymod << 16); + }; + + KeyCombo getKeyComboByIndex(int index) const; + void ScintillaKeyMap::setKeyComboByIndex(int index, KeyCombo combo); + void removeKeyComboByIndex(int index); + void clearDups() { + if (size > 1) + _keyCombos.erase(_keyCombos.begin()+1, _keyCombos.end()); + size = 1; + }; + int addKeyCombo(KeyCombo combo); + bool isEnabled() const; + size_t getSize() const; + + generic_string toString() const; + generic_string toString(int index) const; + + int doDialog() { + return ::DialogBoxParam(_hInst, MAKEINTRESOURCE(IDD_SHORTCUTSCINT_DLG), _hParent, (DLGPROC)dlgProc, (LPARAM)this); + }; + + //only compares the internal KeyCombos, nothing else + friend inline const bool operator==(const ScintillaKeyMap & a, const ScintillaKeyMap & b) { + bool equal = a.size == b.size; + if (!equal) + return false; + size_t i = 0; + while(equal && (i < a.size)) { + equal = + (a._keyCombos[i]._isCtrl == b._keyCombos[i]._isCtrl) && + (a._keyCombos[i]._isAlt == b._keyCombos[i]._isAlt) && + (a._keyCombos[i]._isShift == b._keyCombos[i]._isShift) && + (a._keyCombos[i]._key == b._keyCombos[i]._key); + i++; + } + return equal; + }; + + friend inline const bool operator!=(const ScintillaKeyMap & a, const ScintillaKeyMap & b) { + return !(a == b); + }; + +private: + unsigned long _scintillaKeyID; + int _menuCmdID; + vector _keyCombos; + size_t size; + void applyToCurrentIndex(); + void validateDialog(); + void showCurrentSettings(); + void updateListItem(int index); +protected : + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam); +}; + + +class Window; +class ScintillaEditView; + +struct recordedMacroStep { + enum MacroTypeIndex {mtUseLParameter, mtUseSParameter, mtMenuCommand}; + + int message; + long wParameter; + long lParameter; + generic_string sParameter; + MacroTypeIndex MacroType; + + recordedMacroStep(int iMessage, long wParam, long lParam); + recordedMacroStep(int iCommandID) : message(0), wParameter(iCommandID), lParameter(0), MacroType(mtMenuCommand) {}; + + recordedMacroStep(int type, int iMessage, long wParam, long lParam, const TCHAR *sParam) + : message(iMessage), wParameter(wParam), lParameter(lParam), MacroType(MacroTypeIndex(type)){ + sParameter = *reinterpret_cast(sParam); + }; + bool isValid() const { + return true; + }; + + void PlayBack(Window* pNotepad, ScintillaEditView *pEditView); +}; + +typedef vector Macro; + +class MacroShortcut : public CommandShortcut { +friend class NppParameters; +public: + MacroShortcut(Shortcut sc, Macro macro, int id) : CommandShortcut(sc, id), _macro(macro) {_canModifyName = true;}; + Macro & getMacro() {return _macro;}; +private: + Macro _macro; +}; + + +class UserCommand : public CommandShortcut { +friend class NppParameters; +public: + UserCommand(Shortcut sc, const TCHAR *cmd, int id) : CommandShortcut(sc, id), _cmd(cmd) {_canModifyName = true;}; + const TCHAR* getCmd() const {return _cmd.c_str();}; +private: + generic_string _cmd; +}; + +class PluginCmdShortcut : public CommandShortcut { +//friend class NppParameters; +public: + PluginCmdShortcut(Shortcut sc, int id, const TCHAR *moduleName, unsigned short internalID) :\ + CommandShortcut(sc, id), _id(id), _internalID(internalID) { + lstrcpy(_moduleName, moduleName); + }; + bool isValid() const { + if (!Shortcut::isValid()) + return false; + if ((!_moduleName[0]) || (_internalID == -1)) + return false; + return true; + } + const TCHAR * getModuleName() const {return _moduleName;}; + int getInternalID() const {return _internalID;}; + unsigned long getID() const {return _id;}; + +private : + unsigned long _id; + TCHAR _moduleName[nameLenMax]; + int _internalID; +}; + +class Accelerator { //Handles accelerator keys for Notepad++ menu, including custom commands +friend class ShortcutMapper; +public: + Accelerator():_hAccelMenu(NULL), _hMenuParent(NULL), _hAccTable(NULL), _pAccelArray(NULL), _nbAccelItems(0){}; + ~Accelerator(){ + if (_hAccTable) + ::DestroyAcceleratorTable(_hAccTable); + if (_pAccelArray) + delete [] _pAccelArray; + }; + void init(HMENU hMenu, HWND menuParent) { + _hAccelMenu = hMenu; + _hMenuParent = menuParent; + updateShortcuts(); + }; + HACCEL getAccTable() const {return _hAccTable;}; + + void updateShortcuts(); + void updateFullMenu(); + +private: + HMENU _hAccelMenu; + HWND _hMenuParent; + HACCEL _hAccTable; + ACCEL *_pAccelArray; + int _nbAccelItems; + + void reNew() { + if(_hAccTable) + ::DestroyAcceleratorTable(_hAccTable); + _hAccTable = ::CreateAcceleratorTable(_pAccelArray, _nbAccelItems); + }; + void updateMenuItemByCommand(CommandShortcut csc); +}; + +class ScintillaAccelerator { //Handles accelerator keys for scintilla +public: + ScintillaAccelerator() : _nrScintillas(0) {}; + void init(vector * vScintillas, HMENU hMenu, HWND menuParent); + void updateKeys(); + void updateKey(ScintillaKeyMap skmOld, ScintillaKeyMap skm); +private: + HMENU _hAccelMenu; + HWND _hMenuParent; + vector _vScintillas; + int _nrScintillas; + + void updateMenuItemByID(ScintillaKeyMap skm, int id); +}; + +#endif //SHORTCUTS_H diff --git a/PowerEditor/src/WinControls/shortcut/shortcut.rc b/PowerEditor/src/WinControls/shortcut/shortcut.rc new file mode 100644 index 00000000..65f0eef8 --- /dev/null +++ b/PowerEditor/src/WinControls/shortcut/shortcut.rc @@ -0,0 +1,79 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#include +#include "shortcutRc.h" + +#ifndef IDC_STATIC +#define IDC_STATIC -1 +#endif + +IDD_SHORTCUT_DLG DIALOGEX 0, 0, 180, 102 +STYLE DS_SETFONT | /*DS_MODALFRAME |*/ DS_FIXEDSYS | WS_POPUP | WS_CAPTION | + WS_SYSMENU +EXSTYLE WS_EX_TOOLWINDOW +CAPTION "Shortcut" +FONT 8, TEXT("MS Shell Dlg"), 400, 0, 0x1 +BEGIN + CONTROL "CTRL",IDC_CTRL_CHECK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,12,30,33,10 + CONTROL "ALT",IDC_ALT_CHECK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,12,51,28,10 + CONTROL "SHIFT",IDC_SHIFT_CHECK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,57,42,35,10 + COMBOBOX IDC_KEY_COMBO,110,40,64,270,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "OK",IDOK,32,74,50,14 + PUSHBUTTON "Cancel",IDCANCEL,103,73,50,14 + LTEXT "+",IDC_STATIC,45,42,8,8 + LTEXT "+",IDC_STATIC,96,42,8,8 + EDITTEXT IDC_NAME_EDIT,56,9,93,14,ES_AUTOHSCROLL + LTEXT "Name :",IDC_NAME_STATIC,15,12,34,8,0,WS_EX_RIGHT + LTEXT "This will disable the accelerator!",IDC_WARNING_STATIC, + 6,90,170,8 +END + +IDD_SHORTCUTSCINT_DLG DIALOGEX 0, 0, 286, 114 +STYLE DS_SETFONT | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_TOOLWINDOW +CAPTION "Shortcut" +FONT 8, TEXT("MS Shell Dlg"), 400, 0, 0x1 +BEGIN + CONTROL "CTRL",IDC_CTRL_CHECK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,114,27,33,10 + CONTROL "ALT",IDC_ALT_CHECK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,114,48,28,10 + CONTROL "SHIFT",IDC_SHIFT_CHECK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,159,39,35,10 + COMBOBOX IDC_KEY_COMBO,212,37,64,270,CBS_DROPDOWNLIST | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "OK",IDOK,144,78,48,14 + PUSHBUTTON "Cancel",IDCANCEL,210,78,48,14 + LTEXT "+",IDC_STATIC,147,39,8,8 + LTEXT "+",IDC_STATIC,198,39,8,8 + EDITTEXT IDC_NAME_EDIT,158,6,93,14,ES_AUTOHSCROLL | ES_READONLY + LTEXT "Name :",IDC_NAME_STATIC,117,9,34,8,0,WS_EX_RIGHT + LTEXT "This will remove the accelerator!",IDC_WARNING_STATIC, + 120,98,138,8 + LISTBOX IDC_LIST_KEYS,6,6,90,72,LBS_NOINTEGRALHEIGHT | + WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "Add",IDC_BUTTON_ADD,6,84,42,14 + PUSHBUTTON "Remove",IDC_BUTTON_RMVE,56,84,40,14 + PUSHBUTTON "Apply",IDC_BUTTON_APPLY,210,60,48,14 +END diff --git a/PowerEditor/src/WinControls/shortcut/shortcutRc.h b/PowerEditor/src/WinControls/shortcut/shortcutRc.h new file mode 100644 index 00000000..0f244af0 --- /dev/null +++ b/PowerEditor/src/WinControls/shortcut/shortcutRc.h @@ -0,0 +1,36 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO < donho@altern.org > + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#ifndef IDD_SHORTCUT_DLG + +#define IDD_SHORTCUT_DLG 5000 +#define IDD_SHORTCUTSCINT_DLG 5001 + +#define IDC_CTRL_CHECK (IDD_SHORTCUT_DLG + 1) +#define IDC_ALT_CHECK (IDD_SHORTCUT_DLG + 2) +#define IDC_SHIFT_CHECK (IDD_SHORTCUT_DLG + 3) +#define IDC_KEY_COMBO (IDD_SHORTCUT_DLG + 4) +#define IDC_NAME_EDIT (IDD_SHORTCUT_DLG + 5) +#define IDC_NAME_STATIC (IDD_SHORTCUT_DLG + 6) +#define IDC_WARNING_STATIC (IDD_SHORTCUT_DLG + 7) +#define IDC_BUTTON_ADD (IDD_SHORTCUT_DLG + 8) +#define IDC_BUTTON_RMVE (IDD_SHORTCUT_DLG + 9) +#define IDC_BUTTON_APPLY (IDD_SHORTCUT_DLG + 10) +#define IDC_LIST_KEYS (IDD_SHORTCUT_DLG + 11) +#endif //IDD_SHORTCUT_DLG diff --git a/PowerEditor/src/config.model.xml b/PowerEditor/src/config.model.xml new file mode 100644 index 00000000..34668133 --- /dev/null +++ b/PowerEditor/src/config.model.xml @@ -0,0 +1,82 @@ + + + + + standard + + show + + + + vertical + + hide + + + + + + + + yes + no + no + yes + + + + + + + + yes + no + + no + yes + yes + 0 + + + + + + + diff --git a/PowerEditor/src/contextMenu.xml b/PowerEditor/src/contextMenu.xml new file mode 100644 index 00000000..19b66b21 --- /dev/null +++ b/PowerEditor/src/contextMenu.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/src/cursors/drag.cur b/PowerEditor/src/cursors/drag.cur new file mode 100644 index 0000000000000000000000000000000000000000..1258fb79efdb351ff4832c7b7427de42148c0870 GIT binary patch literal 766 zcmbu5u?~VT5Qcx$1QSilM@#H`#n85+6p#8VB9Z|B8jSiwPFK-u?XTaV@Yw zfu^aj#Rm5Uumi9s4LOnmE6#wW7e*BlA1zHL)((L)Q}lh$sD}6#BAO9C`bnp`!?<*3 zuJh8FPL~^G+NH}))+x2b|5qK_DciQC9&PnVurcV-hIx0Lkuvq&YtrhQNbA2O()8Dt zNYj_h@BZ<%+}I6#{}Nr7o=42I!0So=$aM2CZVcBiXC8n&S?fVuO$xH)wU)$?dIksX KIT4m(IUOGlmCRHC literal 0 HcmV?d00001 diff --git a/PowerEditor/src/cursors/drag_interdit.cur b/PowerEditor/src/cursors/drag_interdit.cur new file mode 100644 index 0000000000000000000000000000000000000000..f4ca240aa4b5f3aa6db7d821b8b12a90854c8e27 GIT binary patch literal 766 zcmbtSL5{*O44hIV4tod^64&;~FS<|S2joVd)gSPMh{I}c5d4GQ8ss~p|vqhzkKW2kVgx{iLVxXvauA9-s2uFia0E{&|aa==Vzj8_T9 z@A3;zGxIso9y7S}h4|@i?%c&T450}vvEm=)CZHpR8i8EFA%+{laR&)cI4~v>8ltt& F{sW33;;H}u literal 0 HcmV?d00001 diff --git a/PowerEditor/src/cursors/drag_out.cur b/PowerEditor/src/cursors/drag_out.cur new file mode 100644 index 0000000000000000000000000000000000000000..211032043dbe2d308a9cb57f5152f8a29d2743df GIT binary patch literal 2238 zcmajgF-#*z6oBDJF49C+M6_6nF!;zR#wbX^6ukta&d7X7dIC&`r}t}H8JiIF$Uuz znHatp{bS_A`}fix8EFrUob-(xc8%bXeyRHRrDDeOsqi0|QB_&UCV zFJbqIUHle)6Q9Rt@YHR$@hA90{0=^kbqB%=UhsmKJsIMA_!hp7ui#7gef+N6$QFJR zpT}qLBm4m0$9M4^d=uZqH}F+_8DGQ~@CI-225;~NZ}9fI;X3C!<*IP)IX}V=@O^w2 z-@)7JO>_fYMVHY-9VzJND)gEx4C zH+X~RKsOxdoX2&_M_&&ai@8D_9oCfu2M4LDv4v8HiPt0r3 zcs!Qd+grK5zLu-2E4jS9l(VxlX*Qek?%g|SG#YYzd@R*!RgR91q+Bk`!NGwPi$&Sq z-j+h4AR8MSva+%wi;IiA5&tuSbjps&Bp$2hs7~Ea$K9QSaXNYmwTi~^Wb!eUx_fXI zPU7^~*3%wi$qzz3QoxU?PmlG|v%EFQ@cmG$@i>P4{ns=3ne%)`5uKsKLJZFAH+%CXK+NV!l%o9Pe(~Uj8vp_q$x37pOkmEXZNSN@24hVGI54! zFv}-;X`G8)FTi$z7bacQp4K|lK@jC~*-z}TM9yyHcDMJ(xwQ_oikCClm+BYp*Nvon zl2=*_K-OB05Xx(k0{mEnAmUoxiBkK+srrg7`&o{YS z9ydQ>7$kSGc7Hbon)oIg%^A?Xt*>~vKCPhweRvA&dIvZ|6sh!Nl8Uny z+$R;t+tX3PMl@lFtiN?|R z{@$&($4U;SReG8hiPPV|enXS&>ZExi{--^p0dIbIoz$B1`K?X!x7*YdAuk9~#EU0k o|2>PZn9t%H=CgRq{JF4s>!&rpT&T$!@s{}M=bD(`+4|3a0r&!FA^-pY literal 0 HcmV?d00001 diff --git a/PowerEditor/src/cursors/drag_plus.cur b/PowerEditor/src/cursors/drag_plus.cur new file mode 100644 index 0000000000000000000000000000000000000000..545d771ded230e8be6bf7ae7c2d99b21ca85e3e7 GIT binary patch literal 766 zcmbu7u};H442J)-NI{~)ofsh_Zvk(WkxVEXuN3hxi1APdm@uEyTypJDRB-a&`OojO zeO9EEDmBek8(ryrCEZB62Mu@xl`dGN4lUa@JLBFV;&k19W5v}l4D2EJ_{u#zz!RTh zIm3ugbGRjWI>AXz@Dd;Oig=C}+%)nzzoo;@?5IgjXgpAl-tBnXZ{z4Pt(Gf4~E0o&c#x7xn`yAl!xk literal 0 HcmV?d00001 diff --git a/PowerEditor/src/font/LINEDRAW.TTF b/PowerEditor/src/font/LINEDRAW.TTF new file mode 100644 index 0000000000000000000000000000000000000000..5f57f844711ea918ef2633858600a646a504165a GIT binary patch literal 80024 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

    ~Z!^ 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 Qpd7Y=GdYW_MAlX!D`$~NBuf<%iNqq2 z$hZ4wS30r(pf@@1-5=+^`{0Jz`{V?5OxnPZGG!+Lr&~kVZuQD@QV;|P!w^vv0kasG z$GH9=ea6^qHnb6C?>eb5o2KDRGK4O)>Q{WLXBdIaWaqKg^NmIdK8Y zE3gg=6h#4eC9o`^kfwf#vMk|#Rq%oeepI2VDym^nxRwmoiebKH2vdeAV_>XN9Do1e zL+_Y3b2`rAIE(-O0lBa4;#?9XMV3`(8+!NVuGhZWvt+$I-S#BThGA%$_)2y6;@N9mAmo}y7lF> literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/closeTabButton.bmp b/PowerEditor/src/icons/closeTabButton.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f673c0d4c1b67bd7fd88bf35fad9e09dbe7c7b63 GIT binary patch literal 450 zcmZ?rJ;cZW24+A~1Bkhyn2|vOEZzf^2XmlAM*U4uv%NC52W0IINZTHgustkfeUjJw zB%9F*MxDd)W#{hSXOMKbt?7HuB>aI%_(Q|+hgzYJm4lv2_&novdB$S(kWu^4ix&)P z-VZFJAO8mfyX0r43D31-UP8E>j?Y*OPk#K!U>NeqE%gaR5J+05zJRj@-JkJVoci^P z!7l!BVD7V!g6D842ty{|g_O@zal4aD%?#cdPa}(8L=-*u&v^z{rV{v6-tVcB-(xwa zqd-BR2}w0CVoDKKKvXLGJkkhwsO)kK$c?Rdk<<1HZh~DL!fm>N57gWa1EsQ>U)4>0 z3sDoA|I91>sY3!(nPJESRo6p6six`grmgr;JLOGo+pDztm+@6EV#;5H6h8ONcxoQ` sP{|3TX8E?ywUghbHM|5`8dmf?IRAM-?lX_{r$GPe2Hr1hyA4zW08R7&ga7~l literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/closeTabButton_hover.bmp b/PowerEditor/src/icons/closeTabButton_hover.bmp new file mode 100644 index 0000000000000000000000000000000000000000..44490fd3ec73e06da02b721361c8a6c3d8c5de59 GIT binary patch literal 450 zcmYLE%TB^T6os`v;3xP4%1VhO0>)~v0-_BM8!EvP5tI}KQriFuq6QO5l$8rzxiv0H z{15{gqC`{O%k(&fCcT+^=bUrT%-nG;zu0Y~n4xuw=7gDc+vG@ZnEeqki(JW6U-yQw(@Y;M>bFhO#?SuN9>>m>u1{1>#k;HN&p^%-LzFpHfMQ8TN^y&Z| zEQPTtVjSr*q$ZBqCJo8@9H&v@7a-(Jk#5D7g<}=n8~=rjXd1gEWEHD5M&bo{RcC~6 zN|Sj=RbypU%O)s@l@QMB%+@DW_f@EuD4kh`G4hKDrpO}Kr!yDpIKQzB@dFF9apGBj zqx|$5?FUnrDo7Q;XHB{$kcB{x&U|~1$0wuG+bUO(8#p{cMnOVCC`nvwj~;mLpmm3G X(|9yjM&{V~CN)IT@bRSD{GpzI|CuA7 literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/closeTabButton_inact.bmp b/PowerEditor/src/icons/closeTabButton_inact.bmp new file mode 100644 index 0000000000000000000000000000000000000000..211027e7ceae08f909eb779dc79c64276637cba8 GIT binary patch literal 450 zcmYLD+fKqj6qILwz)$cC`~ctm1OrI4v`tVh#a6n#1gN(*s04{rSxX5fw%y&97#}tM zSUsUlIoUm#nVrne;n81dXEO(|_u=m5x3sgj(e346P=yyA;lyM6Wxn--=Nqk%gpvN?XS`P18YxI9&z+=0S{kN`+-Q-?tq-*VR`4H@-D{| z+)e<=qK;b(2@K-K3&Cpk0TswP90H0fx}Q|?Jfq}wR?+h`kPA{{G!LkzbM7M`0ve*= zdR)o#G=vLO2IMj~3uC2bA05vWGq>cowg!4*hbAxr}*00sz9ji73on86%~8cFl5QkFZVt)Om`vE2t$!zjWapqwkB zJ5kJFuDJ1Xu%%n1t#$yt0Q4*{On~VB|NrTQ)A^OM1yqUz)vHCcyF_$)MD?cv14P_t MJ`e$8;s5`C0Lv1rU;qFB literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/copy.bmp b/PowerEditor/src/icons/copy.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3ca261d3fb5a18a8770872a8dd3a25065c9ab1b1 GIT binary patch literal 1334 zcmeH_zfZzI6vrQkR6UM(nDFGz!IyP$lBzKhXgGD%Dp z`?;ypfCbrV-vtgDi)HGC6FbRBr`~CB@$VStVCifE1$dx>d7Z7 zYb%jRc1!u#{)X|AU+=l+-20L?b-wKa4#&;|Jys7#awuj&E-Qy;s+n-*LI(@TwFgQG zJg8s^8Ti<2Hc+7t3Rlo_#dVFC)`%#;RtF#%LQ#lVhj6A6Ggrc$OAtvUTEdwS`-BNI zoiQ%)3^OO5BP=|EwoiGCz;mvs9~9z z@!ILMgxL|bZq_%t%~7@56)&Bv@0y}E%ni+6BkP~7_cyzIH?rDUFB+C*m&f`0V=F|h zS<4S@&TT5b#!r6?V^A9ZHjKe-v2R>fjJ^=X%H>MqQHXlsvSCzswvO|HQ98?msGmlE E015-e8UO$Q literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/cut_dis.ico b/PowerEditor/src/icons/cut_dis.ico new file mode 100644 index 0000000000000000000000000000000000000000..b7269815b8c93a879af100e8f9076e165a7a7450 GIT binary patch literal 2998 zcmeI!F=!)47>40bcSoEe*lF$N)T~Ks_4cKdRjIMns}-1lI#mh@PA7p1m*$EP!m3hZ zG2K9U_DV3^` z>wdHF!V53Fs*3Rwd>`M%H}N(63I1499pVr00e%;s;%E2>KgJL7AwIjS% zy`Ij`&(&(Rbar;8dcCgG(^FL{6&)QNsZ=Uye}7+ldwbg6-d6gX(YJ5k{*Av=3A^dp zk~}NoSjjUYrYPMAY#8v%x}dv!L?5JKeB^{Avne>SSh#rp zu*)_BapHv(XKC~B3fNZO1!>QdJnBdAl6m^F7Ig{uFg^J2`ZCzz^ROM+PK0UZ_k4C9 zxLIXMWFkwRoGI>Qq zYvkKLKR=EBQ&-0PNT%OV3&#Axx6|)>^V6@|8GWHbyXgNd_?mx}zmi^#q^=NAx@=yL}xpNFGsK6y<@bz{0U)%a7+LI literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/cut_off.ico b/PowerEditor/src/icons/cut_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..b0ee93ebbab66785902926608eb028fbf931b057 GIT binary patch literal 2998 zcmeI!J!qRp9LMpWl2CUjc2|3e7MZTrZl|NHNsFyrtH4BP)1=bkYLY+#k0wJY<LSPyU*m(=$G$HZ~+*I^4Aha@}tG6Q5jaGMR9;0ptE;jJ+ar z*hlu`|MZ`p0rtSZnm*p=Y<^Pv+1iri)~?yt_U}{sd@`RXeec&R(sZnWc zREXH;HuvXJ>sqQ^NadzftSDaMXZRt$hi~Gm*c0+G{t$nFFW`6a)H@pCyZAc3gfC#- zn}ru%c;Qvi58+g!5h568$2DF)1hmY>w@KKvRsvll;Rio7(d02 z@ezK*_R$hQ!w>O2d=p>AZ`eN68*7B`;_LVlzJT8}L9tolXZRt$hi9fu760i8icN}N z;A8w0KgKgT8zv}bB1YscxlS&T3*=1`^ziVY`}=#{-QDT-_EtAHH@dpIQWQnHyu4Ju z-`Dy1xmvB3&d$zMtJQRRda81{tfQkN6^ljf@9%4GZ%^CX+e&{k`r*~9zwv)6VK+UR zl1Bw&Odb*TOHt`Y;J-8VeqB&qXfb@H>itS2olc|SI~>9^0r1ZVlbl$EEl`8!i4xOE ztZA?^Ye_CVAU?3jHnI-Xu%!tTrvgsvz!!Gm3?wF5RS*hiqp~%)KKKSg%L$##hTue} zuUx~;)UJqzF!nx0ecmyAUsGy)VJUzN?=V)ZoMG(_otqVcW7D2*V7| zeD6GPqe}V~1d(;#y`g?FOa|Okg)k*ac7~`aSyk~NZbwWw>qs_G+lWsMO49cb4|C)gV?GE zB>yb**q_6;59g1g|J0o^Khvr2$vI>Gpo_oj#k*g%GkK|8JMVuMe8*4aZ>6UbY3nU# v-mIK`ySUbb>o(80+~T~${qwid3(h;-Z+$_WO!|zfLp1*!gYa#s!^f5C1 literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/cut_on.ico b/PowerEditor/src/icons/cut_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..0d1844376afd7d6e6b5390deee3df5c58a7fda61 GIT binary patch literal 2998 zcmeI!F=!)47>40bcSoEe*m04q=g~F$@ z<(C)I0p~)&UP(WEEN#D(KBrxvenHLY6`xWYn-%|bcGV_GyWRFDK4~hBW6m~U+>ea0 zEh>k-Wk3Ee|LGNA5B#g;{e8~nr?g+Ky^`Eon|*D6KD5u{S*+!c-z!-f4dzCj#HcYc zDi4jqh<$ErZzi>Fr23^)X-cK4k_CQ@@8i4pCccI}rJmrA@Q3&izlW#a!2sXEH}GYA zh;_eNc;ST?UR5pdV|*Xq#W(Ra{3-rKGaca%@gaT>zr@e+34Vkh;v;;7@8MhcI=+H0 z;SJv44c_1l-r(&q`M%H}N(6DgFe1#A+V0njx#X zhhO67_yj+~5AhK`!uRkkd>voGm+W^O-rx=1;0@m3NoYnwH@vP(URRUXRjo=({2ZU) zNBAK=!f)6+5SpQKYM@ zEA@IkU0htK)oSVd{9N^VU1w)!s#GdEK0a2dRMNr0f%fHQXMha@K3ngCb~d69Td)#AK3^>QgtM>*{vKh96RWTVDsn$iVDf=A zMXiS?a^WfQsYP~>b)cesnlN!X;It0>!!DeHU=pl4$R18-WqWWr_yMw!1CmUq;6y&} z;@QJ4+Z0R!FQiGDHV?0WZDn1M_B6<%egrR>r!Q+!mw*q`gAcDSgB?B#+mY==m}Yj* zXXk;NRhmR9(&WjR;$B9UrCX{jOpIbzh@R4k+CiR*eUxyTNIJ$!6nT=|v-ndNUIc{Q z+jDVEcI_Z;9&RS~y}J0+#z}S8ft9eULicGH0w6Phv5Vohmft8mZHsnY;!Ff$yPi_g zo$xdz+sL+kc78ATk6jq^6PbQX%^C9t-%h{l_0PX*C;n2ocESH!@D2Yee=WU?rLA|I smt0dtTQTi6_h@c$-r+iUC%xvp!}ZoD#Ho~z=xitVRUEv1%V=5o6BcA`g8%>k literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/delete.ico b/PowerEditor/src/icons/delete.ico new file mode 100644 index 0000000000000000000000000000000000000000..760a5c0f47e8f979b3523e9dfedc74689242069c GIT binary patch literal 2998 zcmchZKTP9T5Qm3lC8r{^&@4?5Taq5Q5>n9seOe@hlp-iiTtO-#rJzJxoKB}ur9sd| z6d+x(RjL)m2}}57$#P7J7~LIn-}9f~u*>PHduIGR{(W!Wyzz6e$c%iDrKNc>?T-&4 z%k)c2#uNFqATl>AvcmNe_7gTEA32NIuvtq+XP%A7wQVOIXD+4R@6#JW<3CX~R~U!6 zWlrBWt6o16DYR0hsXDIPt;}z$w#P@(I)O2*u2FrA+OlI;>dnMIO8q0_+l5w&OX8d1 z$pjO>U=K}%#IK)3B6+{9TE2LsZnJy;2Y1S2&Zi3`4UJ`br4`YkW zVl!B}kK*3==Dvk}!ZuQC(i_vnX6TL0GQaghv&rpu`9y9T8vWJOzh6{WB)`v-McW^_ znYEeh!t{2Un4RWF&n>gh`}chr{`QLuhAO=WmD7RB{;kU9l}f2gI>tKpB8_X2>X}HT zCQ{y(fdhXBe*xcyufgxZ?qFN+Yw)Y^CHMt+;`Vy*r||pmoA4!Ap^^eG@B%OJvMmn$ z9sC7+8@>j=2fxERxCOrkzY1T1Uw|LNKfn**Z{e@tyYOB34txW?3SWUQ!z;YPE4;!h zyu!b5+;d!WoN?4Rwqt$>{{TOLzlFboH_^M$9q0yh6}kdlCcXoI2Y&(IhOfcz!SBFt z!LPxu!k6F|;ECJo!JoqK!*9Zu-l-0o$AQ0tzkqMU*WmX`qB~S`i)yY>%~h&dqM8e4 zv%){X58!X%ui(4zUHA@s1HKAhfiJ@=yuvHI!YjOz50C4f$92u)I^%KGcwF1t{N}(v zzz^VW;jiGk@b7FNap3RZFW}qoHTXUFceW342hxK-h2MwYgfGFrSD=A9@OSVR@NIZ1 zt$Qr&#|0YjcJ=fDegJ<9e+5r*-YL+4UydGjitS^YSP6TtKu=Fk^7!~D-@bj5uV25) z&CQKmUS3MK+m-Y4bLn(Ca(sL&jYdNb4i2PRt;+81u2d=&Szlk5a=9$a%geI3xF~aT zb29u><>xP7{_Fp#5igawJhyp`q;z(RohvvGjHwuE#^Sm$@ zDsmkDA#%2?K*AvKz!E));kp13XDf&#KxcTE0|=Yx0pSBTie7cHaHEMXVMO>SG`X3z z(57|Ii!3V&#q<6}_mD#;0SJ_jPwJLq(i`byg>Q5Up_V0afVf0?og&6M%k#4O<#mcg zt<)J=VJ1(_pXzD~khQ7tYMEjaAycRGw=|t#GJC4W&&L%jOW<|5P=E7yNu8?EGl7$Q z5+o2i!}EMHGA(c%4<-i(g#C$a(F22be8-N{83<^TFlvH5oC MXWuDDuiq*E02S(wSO5S3 literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/dupli_dis.ico b/PowerEditor/src/icons/dupli_dis.ico new file mode 100644 index 0000000000000000000000000000000000000000..38b4cf6c9630677722ccd4f4f871f0d531eaa229 GIT binary patch literal 2998 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 literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/find.bmp b/PowerEditor/src/icons/find.bmp new file mode 100644 index 0000000000000000000000000000000000000000..cf295f5da67ed0f44ef058ce4c12998f87ff5fd7 GIT binary patch literal 1334 zcmeIyy-(Xf7zXf%C~z(*sey`~5C|@T%SW3+Fo|kGut+vbT{33%c%w(J9y5B(>d~V| zOPM@o%)gVqZ-P3Oz2cgFLud&%|K771`|Lz+Q@2&b#?eJh< ze5&wYgDxL;J*|(#NpGYz_tW;I(X0up=QXxnwkJ(>ChV@)XjbU_)|tEvZp8Hu?`8Of z`nfIZwa>5Lst45ypF6JB>f%tgw7TTyJ&#(g`=?)zKd&x(RqEow>B_IIi>tfuvcp{s gdQM%O>Tdm(E3LkFF7$A)E3^+rj&L3IxBqMS0|eWdPyhe` literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/findReplace.bmp b/PowerEditor/src/icons/findReplace.bmp new file mode 100644 index 0000000000000000000000000000000000000000..88ec37e73cadd0ce5154897d6cf7b6472ba32d59 GIT binary patch literal 1334 zcmeH_KX21e6va%l{8XHW(@bhTUduwN|p3fVq$Pcp|s z=2|e$5jCfa%p>jzR;v{}?*xh%l98c5L_#vM4u&xP6ziOTs423*rnfOwHUhHF32oTw zFBT*tYobCb@gsVYsX6;OvXDw{qB(T1fKen|uwSsJMhoup&Y^ec$W$+J3-`^_4;o92Q@3QUH||9 literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/findResult.ico b/PowerEditor/src/icons/findResult.ico new file mode 100644 index 0000000000000000000000000000000000000000..15b7a9dc25f5bf978e466e3ac7129a5b966ad944 GIT binary patch literal 1406 zcmdUv`CC*~7{|Y4r1i9rr9re%j}|p(78xcGNXh8LfP+Zv$}+>S4a2^Kh#@EliEJT~ zfT<*8?5MyD+X#%q<`r;BKoEQ$L^5HR8D?=h(@*(Be?a#_CU)Vg+27bmXKZpg8LQmd3iV zJSKwdRx6~l6Hv()vGiybT?ZMEE!n;H!#x-F&$TSy+g zWbGC#4maX4RZnvN3q2Vu)Yn$S(}jtevK$0?vydLmhQFI5DvOT5gT+8v0*~b12jxT$ zWVZz*Uow~U5yY7+#Pfp@n-LmGhGk$^feN97x9^g zIAa%*qCz0LT#bt2Y@{ScVYI6Oq5fWIsXl{qMMtrlX%EfJb*QF?pt`49w;RfZ2M`}- zB7(aY9Zgk8;B(;T<%;I>CE#(qA*elz0~hRahhJJj*iH}!uqD5_U{RU(n}_4W4;3=UnRD1or8y`!_Ut1CftrMris z>gpRBtDBlGUb@`evZ0lt&YV40@$31@s^2dBUR_gL_*2n|;*%vmpDHaaD=$C&%Mo5i z=FzO|ACGZ!j_2m(7krm%xQEh=(hrA*@xu8Lkx|hxv2h;p35k36`TF?> zusMNTcf%lBaL6u}^KO?tuHU)2d(b?+ynQIUufN%DPv5bVLHpK$>F7k6f4=z(i!EPn zwY0Kc{gsU^MXg)^!H1?FeM~dkuuZQf={>XJS$+NIR<3&f1!A?6V*Q){s$B|sprc&}`H!}*Agl!b28JvjHvj+t literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/find_off.ico b/PowerEditor/src/icons/find_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..0e3555e18a9004fb2dec42c04104854255effce5 GIT binary patch literal 2998 zcmeI!F=!%L9LMpWn}uAn$+f15&4gQ0MXpWuN@Hb{*xL$etYWhkB7}f07AeCP$8n66 zO)#CLP}m~XR6)2!Aza`vL$+DCW&ihmV>DyXEw0((?mzyWnfL$9o9COSiImU_rBXl2 z#h)*vE%vFDJClC@L0Vgpe&RSq{z4}7l6R?soyO$q=~;y$$Cb)t$2*7WcDw9d!J?PU z+!4vXn*1&g-`E}0XCn_&vk0cR0W?j42qIKRKbQOO1O+jdC4^8#JRP32D z9h2v?&RsSKQu$IUoJrY|l+Gy_;rsX&zJV{{^VkD&AHR#=!F%{5o_^bHd>voJXYd|2 z`exyU7hZVfG{X1sEqnuC!sqb^_T?X_&ojq zzmMO=@8CUr5>LPFHolH8;xl*;FZ}b_Vb(_YKE8!-;7j;C{s6y^-(@y;m`#t_OyWcQ z5Fg-s_zvF3`}iilj4$A`__X_t!yDf4hBv(78PI?MUGlijcw8kOS1u=o_#r;P_wXIO zk6*HUG{X1sEqnuC!sqczmJj^~YUAtpB0hun@XIDBuo1qGZ{ZtwX4>-j#S;`*h#%qu zd=KBjGdW8pC}1MmWSuOM8PX${P0+)`gKlqcb#rs0>+5S>U0vzo;zGXf>-_v&&1O@z zT21A0Sw}}lDijJjJUmo3o7LXlp3>>Gwzjskv9Y1GwKau*n|^)&{$Ko^x@R?gGw#1B z_>A|jUu|zM>B9XezJ8Vbc}aa*UQ&;h!v({Ll|Ow77YT`b)49okF!o8tr<2gOE4xqO zV)iM%ooDwKM(*RBI=9uHg|(%a5R1t=1^J?j!J2j=(YT{OU>f z(JjVNL|4wPj`!dir^%r!O~PI6!WHN4{TxgY`)O&u2M3~t;pS8}<-HLUUunH+{ewEhA)i2V@Xa02# q8Sh83%W;J^4p-T)bH4dedPDs!j_wk4yF&M?W|eib?k4wpihlqx+vZRJ literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/find_on.ico b/PowerEditor/src/icons/find_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..d33b4c15fa3aad9a28e5c4dc98da588dd1769cdc GIT binary patch literal 2998 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 literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/indentGuide_on.ico b/PowerEditor/src/icons/indentGuide_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..d87f8139bfe5cbfe157f0347435b163c39389ab8 GIT binary patch literal 3262 zcmeH~F>b;@5Jkr#5=|s`Q92M+`WyfXuD}(1jkrsfbL1F40C&Jgprk-dKAvd&v+G?O zQbmgKn!mF%?~fN3Mx?-Jxs>ksd=zKyWMS#R(e~$2rQ<$ zRQkGCVGGug@m>`t!e%kz(!s&+EdWpR4el1(?bckPE-3KRqBo)xlMHu@)oL~FLKZ20 z3}=gR7widk)y`;t7>;}4DKsMBo5k?GRLV!N{{hW_K`^i|7u(eG1k*u_u5QxBX;J6>jofYF@KJGxg)=jqdk(}+7F?LujAdYk-~BuB{49L1mwYKfVG?$m5K~9^T8A<6(6J_8S$#Bg4GlxACDo3 zpaguj$V2k0Zh8e zYg#GlMhdNEf#;{Zh|JF-vlISS96@g}8t57^$T_}C%onZ58tZS!(=*C1GQ;yXSFKCc IX5nvJU!5D|e*P?fl3g7iH#ko1O_Kmg6o-GXu9U4~q!}Aqxl8IcS<|F;a>>kOZ6y+kMIw>4NFpIz2%oEcaOn=~i{(z?0m(W#3y&>g&m~+E2=H}p6#*!}$b@16EowJm| z^#_X^qx|aDdcGgk^VLGv?|%Dp&KS2x&i*=Mjx)*&T@OxY9dS)rd#-3h8KVhPH QEp)ga=Td3oCq!2J29Lb&lK=n! literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/new_off.ico b/PowerEditor/src/icons/new_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..67c294517274d8b9b9d7d1567182ae4b51697371 GIT binary patch literal 2238 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 literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/openFile.bmp b/PowerEditor/src/icons/openFile.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4607c7a3ac108a40096a7493c2dd809d1a8ba529 GIT binary patch literal 1334 zcmeIwy>HV%7zXgyCB+S2s#PTgrG|bG(b5wrrcEg{k!%)lF2xWy^{yaQ8L`5Cc_rdF?QPz9NJnPIIE?3+CA{; z4OKJima2J5b&+D75-(=7TrNqK8Obsy#jQE%dI9%Pk`^V+I42`Oa>}ZTI2Zx4qByT9 zuWG7l5H)5s4KhK4T+pR8hXNLGFDNbr<+UKK1R016NjD2gX({QBOPoo}L8F%n?*^er zX@!}hsMZui3RAchn(p8aq%egUWRTk~(IJO9EWl_mxFZebhPX0RX+r{(WejOBz>BO| z?f%i@H~1g_f!)1-vg^8gaWo!}MpswE^Yfp+>%P4X(Y}BCdU5vU7y7#-3`0A(yg0Lc z-}dnI^!@9d?KeJc>`x|1l0;2npE(EDC&wQ?vq=+w;2b35@h5*B<{T!YarDCpdc9t^ z+XWluyx_40fELfj2&+}de-m|9<=M%7@Y9%_+tvXna#i%RU;cg6>vOxBX7YPYv%aEoE@{~x4#E5RFs>+$N zps+;@iF5;#C&WM#!E7-AQY+s6KRXEt*f-SHYdbu@_p|-kM3Hi=TU&~kzkZT_;pkUt zi~3CE#2;CjKgPRclUq7glaSBNX0l_;p@zeuhBre+-~Ln>nfen`D>PL{rozDF1tz)b z+(`8csd6e6Yf`?XaEc$}d-yiKhA(3esD1n{eh2U2H}H(x@8eteD!zdCuyTbLUU=bE z(iA_&_wa3e4PV9|;P>&n_#M25-@r%s2|mP+@B@5+5AYp)9bds0@p-)A4R3hE8{Y74 zy@8fszJ9rPj zfoI%)AK$`P@ddnxPn#WPZHgb`d-yiKhA-m}@cYc>F0;AAYaP_!hp3FW^0V)&zw%#gFkld>hY9TN$4|L7_$X2|mP+@B=)PlQBUd z6VazyRFx`F9+fpg4-XHzzrWY@^|h|9u5@{Msq^!51wo**vom!%9i5z=RH?_XLuIL}rA78)nf868^ap!eA_x8F&*7#D~r~kb? z$BC9y`w!XpQT@1`}=&6-W}8aHeX7QecD&^<+S1Z zv@ho?X`>OhFXizaxw|?(Zm=ZnuX#lBn$Fu7IfE~!^Y*2DF|r%I(RCO9dVQ`vId78s zk-PZid^MeQ&+jkFNEdlLYJ6TlTJ$c)kLGdrO*-qJBJU`0XQh zsaCElzWG^ulBVR3$;;__-IDaU?PE9IMDt`df8?sVZu4eI`cs0LOGbXzwiv~oH#?QS zpDu=ZdthdNQ@@+Na8^y}2WpL< b7;9_N&mSqiX+D`g@U`=s8E3FH>Z93z7QPo@ literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/open_on.ico b/PowerEditor/src/icons/open_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..44d5a342ac43a83ed981ad59f7bf6b7f95d72026 GIT binary patch literal 2238 zcmbW(F>K;y7{>7jwNg6ywo{3aoW)TyhCOLV!o-rWGagbFHkPAHMvxdXMmL)if3_izK!>yS+9uEM{cJwl5mJtIXGh8M_b<{%j(($d zs6VKj_#;c}=VX^|a!bc*5%Rg!N_T8I)NnY|@P4THpT88vrvB8_j!gBDsWdPJp-HZ~ z_fqpps+~*ahE%L5n&HRz9=?Nb;H%hU>Ii>;-^T~|Jf3m;eS8~V$CvN{R<7{E3opDX zn&HRz9=?Nb;H&s!{1N^DzmE^_d3=nY;v@VBKfs6h5Z}c&@ilxIU&I^U@P;?M;SKNB zd)6z~bJhlHCGjzSijVLk`~dGp57Aw86J0}>(M86e;m7zMzJqVztN3I55&i(bj}P#9 zJmdEJ_%^03YH* zd>7xu*YIV05pQ_I8{Y7SH#`?~&+WS6cAay(8r-f*MT+rLe1sq22lx=b;qlQ7KgRd) z9ee{{#cz0g7&lTM-^SPRC47M2G(nNg@MC-r-@!A}R>iNMpvYqU6d&P7_yL~D*)Ty7 z6Va#IRGlhO0kvs@o}Qlc`1q*1yF1<7-01rHT9=oX3d2wr7Z>VwyE;2NQ?uFB>FKFz zwVF;&PE;*-Cb>OZ_D#M#otU{zkK06Zt;Y;^SYgTdfg#waw+c94=;In zn|uA++q}OqC;gPq`;+zkE~Q=G+B{8fXlJ>Z*O_Gg2PgZl|swQspW=Z?k1er@me%H1b#hrI^%1iyf z>0+3-2WIv!^{3fO&g_|bpjtV5QO=&J2dbsq3qK>iXZ6h9Rh-oWdsoA(TGCI{7C$kz ZwxkbS_6L)GH~q@LozG^R!L}&h>_2b%SZ@FT literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/paste.bmp b/PowerEditor/src/icons/paste.bmp new file mode 100644 index 0000000000000000000000000000000000000000..88d79d87ca135290ac47a8e440f6251c59ab2e4b GIT binary patch literal 1334 zcmeH_uW#Ex9K~PMWT{$3+2;NJrOs-mB}%PSm6D|cTO3qNX{9JG2n`H0G&M9dG&M8~ zj1**e@Sv&TK|}AIThKpYpilbvec$^Yxs&b1xP@BdCh(Kf%SReGepoaftp4hm2+v05 zI}jxEmk@zwja|6G;c$SUi%7GDh&_nJgG_zoM5X~ffZB&pS%mMK82xRGOHX@3Phk5A z9I^~jtiu$g)a=L}Wxhw0W{7qfs+<%VoKRpH2_$=glw?A1M+)6bEMtkaCXo@YF@2v#jB;&VBP6^W3tmi!S$!U)+{)Gag%3 z*X`@A%l*xiMb|Y=^Q&vVJ~5o>ROec+j@yQFeLbCayPeMI>5G$g+qnC4S!*~m^i|%@ i@2*yh#p=qQztQ=}C*%F<_ICBo_kC2^Mka* zIh%FQq+h?0*4L!(7-#7}&@=kTqg2OETl((lvpPY>^?G{Zk)e9M9%mP@=kY!^`DEdR z7hZT372yZ?Hol3k;!F5L{DFqr!|&pK{3brekMJSBkMH6Ge1LD^Yxpw0fY0F#Z+OES z-tdNZ$B^TK;bxkuA$550y;-%Pgh}ySMeqMA^rfrM>Th;rcX6D@iBgc5Al6` z7a!mQd<$R0m+=LB&V9$>4R3hE8{Y6NXvl&txLv2*t}3^ySd?P?2p{76_%1%cuh>3{ z@B@4s-^5q(CH#u*L*7swd;?#>=kY#%Re?f_@B@4s-^5dCE8*WRP-roJgb(q3d>2n~ zRum|t5FL7hUZLmdK7Cbz9v&WadwZ+v>uX(IUFq`jQs?LA3W7jqXJ=})S~@v7QLR?f z@$s?B<+6^Bj#MZVw7Nx}Fwnt%6Vn4LSD zd?D;|NUw9hgp*>YGa#l*^CtJgr)?T_DbkgDy1&1lh8HtHxvIlL$g2lo$?bsWA?0YZHDt$1L}T-eX+nHHIGN4W4h`a3=2IetcBswn3ca+iD}tm}{liyAr8rl%AHv#L!WZY~pPN37c4&EjF9WP|+Cd zSPMwDu$sz{tbxQ_$3z=8XZ-K?&B!9kxXCtK+|KZr2mjCf=e_?tMx~TqD3f_DxBdG< z+TfVUxKGkQucYNA=@0rD+F!JkUh*#0u+uF*d-|zHkbbQeA9$y$Znw+P1uS~W%=KvO z?ko59d;4EkfHm+-xA}F>;%BS9d~i!r5BjWY_gb{hyMwO6&mR?pruNWO4@~8rDc3Q1 zKI`1I=0K{RN~I$yUy-r}1tWYP-@-TW6?_r9OWVP3;WzOfeicvNb{k*Em+?8ghmC$& zc;ST?UImTteS8bwz*q1^{4Rb+18w0q@g9B^AL57j0N=xR@IKzhH}O?`37^Mj@rF0N z;SFzi!@GUJe#(BtUSTgpKEx040ltUt;9Yhf-9%T>C3GI0CI1ND$G7ked<9>`@8Wmx zTlh`9hhN2$x826q@nw7t@8N}iTpg-5!uRnld;?#>7xBCJ9sCy6+@zWw)m+7g_#r;P z_wXIOkN5FSd=+29=kZzhjKdq=@P;?M;Th0?0iANYj<{VFZdaioh4>*p!1wSSypK;< zJ{sZs_!ho_ui%ULgylotKy7>-U&iO~9zLl+fsOEed<);eQ)w&W7Z)h75I@8R_#VE4 zr#J}(3MfRIR;QI|IhsdHD$w=ywXUwNba8Q^^Ye3^ot^3A-hLs&1O@Fhli?G ztJ>e+SE*Fe-rk<_`MkEbx0TIiwXw0GwY4=ZFE1Lx)9Y!C_EEEFz015a|qVdmz>K!z}!o5_8c3=v=!bHkj5CsQzAq**vU zc^hYV299Z}q25w8GubF0*+J1t$B(xKH>zFK#kYt6QA D797~H literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/paste_on.ico b/PowerEditor/src/icons/paste_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..9747508073a10c0ca5f733461e5819bf9700b8d2 GIT binary patch literal 2998 zcmeI!F=!%L9LMpWn+3N@F2xlI0c|E+8~fz0G*&i=y{(YO&PrIwbqW?K!xqc3jFn9= zotHx4id2I|7}%f?wj5G2x@|fW;4)xe=Yi zz2%;Mw*Pen*aJVb&F*tHKdt(9>Xsy?#_VhNShUYOVMo#5pACm+=Ms5&lr2_VIgo55I+v@B@5+@8a8dAMfKE_zJ#=&*3w8!yDf4 zhBv(7-4SwJa-4CLIr6cO@B@5+@8a8dm)%D<&=qtMokM5HKg9R&O?(|+#uxBM_(S|Y zeh=^AxA5d`weU5337^G#c;V-(L)C`(9=?gMpE6JN(uX)E9t7bvg@Kfnk0F20SY zI72@2MlaE`bdSEQK==3ey1Tp6&CQLjudj7=b)}1o3;DjU^Ye2x8V#MEo~lx* z=;Y)?#bQy%$H&U$aymFTP$rYn?(VL(x3{&vzOLwB)5i}VzT^K?iruubrB;f5U#S(M zPg?<881UMB{|K{lS6m%u(1PS~ zvEvEc9M5x)QgSyUZj)#XSe{$jOzCGp9G=@k(_r$!mSz~=el46r{mnR6ysp<7So5X> zPYa(1alrvkVK>F|kXc=rYd5Ff`|(4wFZ@pVlb$epQ~W)fRjSy@w2S&76Vk(EuVkS9;po;*2O z-d&;GFgR3S^7Z}SyX&QCZn>U6L)Y8_ekj>z8fcdbjk4*d%0#-daopHot^?+MgZVRX zg82*T3uIXa9xTBl#R_@+3m$I>7x~tOAb9LS>^$UqA3_sA90Eup3`5Ehh($ literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/playRecord_m.bmp b/PowerEditor/src/icons/playRecord_m.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bfb62cdd81ee9599f5a7a89be8c07e127bd8ea31 GIT binary patch literal 1334 zcmeIwA#B1x6b9g*ty_+&o{(tVSX_{MoE^c6F;Q{ZI{F5F;yU+v1gBB?B6l)*HjSm$_sPGLc z`hX@XTGDfgvMizF6?DqhsIo8UY(oN6+W>~>EQHyGsP++z6~i22)Fep~$|>a(CeKjk zThzr4^>L3{9Y~IEU7%^2PWKPGJMhnUK>RiGa%i)>IKWwot4CqAYf@a_4lUQcX@AIE xznjeZ?7_ZEiu>7oz`Ro*y^Nli+drPn1#^A+Dg<-=nG$o|#&iGm{pVGiegIR|&{vQUN(eQeUK*T$oPghVj3Y8| zjiWd-2ayxrg)uU&j6u%KA~)8$?YaWbX3Lk)T01uw+3klPzEoeZqWZv}?i05c(x{a3 zIc{T&UZsLh2og$_I{w3%Mx}+XQEBJrRoeLwFwPxY_Z3T_tCJ2BOyNL4|kjF zqu7wdhL=gc18?RW^1-R&BZ~PPV%plT;48^qtCX+FIsS?wejKRuJ3n72O?_N5R!(2} U;YaJve^g-EC@+!YFUL~v4Vf6PsQ>@~ literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/playrecord_m_dis.ico b/PowerEditor/src/icons/playrecord_m_dis.ico new file mode 100644 index 0000000000000000000000000000000000000000..bc02bb8b53a626b6befd645374d534edf338aaef GIT binary patch literal 3262 zcmeH`!41MN3`N~L5;w##N5){nvPOnr1Xf@NHV9v_WTLnvjw>Vtb(_dd>-VjnlxV^g z0_BK1q64xMM!+~@OmxJIz`HH}+JW2ZXxo=kx~~XyH^i5ZjhYVre3@~xP*=slhhs5D zql%A@Do9vVjC`>j3HnFXHAh#)&KE;UepkiLXWOg(ncq+u;`7J4f2O@_4o9o+nE#>mykwo=ZozPnto;E>q6toH}H8+eRH>ewtbs_#)0~rJc#z69JSsPfOKVG literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/playrecord_m_off.ico b/PowerEditor/src/icons/playrecord_m_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..3d2f464c7b1085a576fde8a135f0ce6fc2038643 GIT binary patch literal 3262 zcmeH`%?-jZ429i05;w%LNA6vKY1k}Uv8w#fr^*^^f^Oz`@>(bNcQn(?E0vP=gXqjpLquL5H5kL uuH;vcS;)>;KaT1%b!z0NUN2t%20njN-(KvWZQu5vaX`<>ooN5b)Orse5nKKM literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/playrecord_m_on.ico b/PowerEditor/src/icons/playrecord_m_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..78a92116f11e8e3ccd94056eeb2e4dda964c4219 GIT binary patch literal 3262 zcmeH`!41MN3`N~L5;w%LNA6vKX|hu{V3-cW2I)@?R!B?YI6^|u;6$c{_pL`E>hS7& zTGs7AbV7H*?y;}f9i4Gv;oiRf+JN)EvGV%7_ftb*wkp1SSQ%>J4-=u5RZKDPVQg?d zL?}{h{Ba5qniM5pw4=fN;JYzYF{Oh46cY1`DSG}x`|JG7&!klGp(XLdWL!t_Vw3V* zHS#lLjxh7rWK1q&OJnB8Hr~lWij5CAd(M!}ew1Vzf300qZ#K1lV(pv2%?2eEv;sXK{YkzMns1Abn2mM8{9=G;ap{Ie-lS literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/playrecord_off.ico b/PowerEditor/src/icons/playrecord_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..494a980bf08522fde4591677a11d7cfb7dce7ddd GIT binary patch literal 3262 zcmeH`!41MN3`N~LQg4W3j@-Kd(=Z2XWCMoD3f+MX%x@!cXo7KUxRAPWR5jB3?zclU z;0b}&xF3j)csnBl@`4=bgq`Syvpu?YAh|=fkC|sjpt^qeuRqlr*5nWP@j78;A&p8a zAMH+Ykx;4__{hb&n4Mbf7!uzWCLGDRZpAzsS@OmJ@D77Y1}^glLuzs|Hgsspgf4iU*=Zt39DG8 An*aa+ literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/playrecord_on.ico b/PowerEditor/src/icons/playrecord_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..3a5eb58a8a34ca3bbea306fc64a3cfcebf672178 GIT binary patch literal 3262 zcmeH`!41MN3`N~L5;w##NA6vKX)*_EbOVOTFx|lXG>Ai^7{?YDQrAwaMta}`VxdK-uT`BJ@OUH)YLoN{iVQR(I5 zch8aaDhB?NvV>B_#*YglH7XvyM#ayURs4MX4rGaXt~`91T&CB?*N{E@mK*hnGxQI5 v?Q>1G^{*!z_^l>|_g(%7oYvL|{P*EB-M;!$2Ig4*#)18qtVHKu)?V)g7I)eJ literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/print.bmp b/PowerEditor/src/icons/print.bmp new file mode 100644 index 0000000000000000000000000000000000000000..488abf8303b0c9d35c8bf305211ffab89e2aee94 GIT binary patch literal 1334 zcmeH_zi*pB7=~ZVB_tA7Vp>{i<(C~Ij9nc=D_vE5=T$#djHQ&R7C*bzeP$cakM0>_Ft2oyy@T|g8i zin2sWG>4Mbh`K~oRcPvpX4wbSbxln)HI78nG}OdVa{T1;4gSl2KvmV=M@R;`)(a@U z|MItouF-$A%+a{bsAJthx2#*!H2T_Qx7)WY=(aszb{l5ecE@1s);s%vv97`S$YX81 zN6s~qb2d9?%DFyZGvgz(sixksi{KCC*CbG;`cQo`TX!c;plA{qRG_vhEszVa$B^!vy4N!9yrSCotIt^Nbe4&U4W literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/readonly.ico b/PowerEditor/src/icons/readonly.ico new file mode 100644 index 0000000000000000000000000000000000000000..b545cbc8b113cf65f93b29c53c76c100a727f1ea GIT binary patch literal 1150 zcmbW1v5JF06h&uYKOoiCTkdD1Oc5+C$cPy zcDtR>cDp4hUDrvKrfFmt204yHhr@xot`njMTNs7}U(+;czu(jKdZjpy1znaUEeVS} z&m-)CI8=TZ23it$-}fnsB9WKMFL`55@`xAb0>1D2IexKVOr##PR z9{H-=?ejgps;ZeE$MI>tu4_>v$Y1h!FH*=+N{-1M@!ay$GztHeW1FYJH%&A9t2}&` z8qNkai+V@hzry3p!P~Yi_$nzO~X`ALexw0JB@4GvXR2??UI`H9QrvM5YL9jSoi zMAfRMYWZK5-Pr{K$%(n|EM;3LxJzy(v%Adu%wu>vh#b&QP9$o7{VMVsProxx7(W;X z!X)kXm*}>-9DI3}TY`MPyo7m@DAR_x9|qok6F_-@&)>HGBnM#OLr=_)Gjb{tTbQ zAK}Scuj9-30zQpT;&)Yts&(*fd<|d07x6j#75R>;s+pvkM|g#I@HW1MZ{RJw zg|FgE_&h#?PvJFQ<27F6HD2S{&>OGoiPv?{>nifPvRM&@cknj8g>T?3{GQ_@9ef*K z!&mS{d=9_o_>k9@I=+lA;M4ddeqVuX-NCo+5UDWHNGbaUrQxN={Et<@oqm4i67S{iEfNpFjB@-*Q6C_nMnIz2=b~ZAHsG z^!>^Ejy4Hrb6ObqlSQ}py(I=?HJgj?`{RUmb~K%Er}OznTu1H0uHwp@#OqgKz0TGh zc)?V;@9!V^*WnmALs$KG@z3<@4Q%HBjK@EAAz-RHu7RTeQZ9J^w!|!iDn&~fA_1|%NKBm6J7lTzBj^4+v>y9H4$H&V> zqSvMM1`FbznnWOuFMW5I=sHd(F*FO+Ohtz_j=O3y8uU7j(;b+&KMg!{{}T6>E6_9Z zUZA$)$_MnjP84@Nk8`)NJ_tN_H0*bx_;|V8+@Gt$sq)5rMZ&Bbjm&jp{d68GG7O^q zF9wuhD=ssWVX-jt!`{k$+5c4L2AC-Sh>zb%+@qK-1)GY@=hMLVCbSV%TurNWoAJjt SWHt@MK&c?$LW^eq$IHJbniuE6bJCXQnA{!TAHfFwrE>X8l=)RCU$f*>B7j$$jHdb$jHcgBO@b;6C)#E z$G(HsIP@cU$&dHm|1Ker+kUTGsMh)dSWwsh)xc%F(Wp!HT7(Zb~u_9>;vRi4QL& znGc`K2@BvSBqbTi0|ZHkASHQ-Fo_Tp5keAWF`|N$G2)z2WrztY6C`*74TY}JRHu&b}NRpL_qKwCKlh2Q`Hc?eop@h#% zS=Uvm^CgO+Akh4zYTC^UKUlAO!%!A~1J&Vio>%EiHw>vda6RI|N;OSG?p<}elJvj> sP5*eO$S`zWdaeRhH|s!}^SQm64e$EBo;)~tEyaV^YWMh99=ns~2fKy6X8-^I literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/redo_dis.ico b/PowerEditor/src/icons/redo_dis.ico new file mode 100644 index 0000000000000000000000000000000000000000..2c3ad7238351116d9677b108438c4470c6084a00 GIT binary patch literal 2998 zcmeI!Jxm&59LMpW)x=Jut1cyJ&UBSs+Yy;ql%18tAjW>zu_;$xS_ZBoj~Stn1)2YMoabRr$ZZ$@PuOO{2VPl&KlTD@K;XIuD}Q zkh0rSdRz_&h#?kK--u-Oj=bFTC(d z%EQ<3C42#I<5T!${E`}4z|Z3?{0!d5H}NjMhOgiqyn`>|v-mVVfsf%0-rx=1;0@m3 zgQLN*&9Tm5b0qJ)k8k2#d<|d02eUiqB07ssqZ8;D^LzL@zJxE}ZF~y9j9!@@D;p+ zcko4g7N5o^@Uh?>hc|eGH+X|Lcy6e{4Q=zd)_Ghuk1Ls!e0&q{;%oQ{-ob|~A9?sX zzJxE}ZF~wJvV54=RT-bhXYg^ng%3-RYdm}%U&0sgWZIUX_xH8CyQ`g@9c^uG$#EQQY;34lENX3SP1$T#tE;O@ zr_)+lSy3X9(Bk5vVzHR!=H@gzJF7?}BLCXx>*nTb`JHO91;&-O$7rxuLQ40L?Koz< z*E#gYjb9y2w|F~-mb2qaKPQ literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/redo_off.ico b/PowerEditor/src/icons/redo_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..b8776b47b663cc61bb3b4dff991032e11377b434 GIT binary patch literal 2998 zcmeI!KS/{~En)S+EM*SIuLE_6-y*p5l2ESf!Qz~!JrmIkd6mjrHb6o*pEWy&IP zOD*J}gDy8oz>&Bx4j0Fv>T0^6Gxir_xqgfgqeI~jBOEAJ7f?4 z%cIT!d*F|j`}>^DPiZVoElFak&AzsudHcLS>?`{6L1ARn9T~MkquRiz&@*y;_PGsj zDAf<8>aJ9BrCeFz7$4v}_%`0fSFo!@5ue9r@eV$P=epf4zJ;&h3wQ@Rd9v`r3opFN z8sh_e2j9lK_zHd%U(`@}d=~HEQ}_r!!iV?)zK8emKHkIE@l|{YpTirx!5h568@$2W zI;0*_cd0J5Jn<2Jgb(opd=GE0?xQ_)9bHA2&^fL@#s~NgzKwVB75pl`h|lA*cn6=t zbKPzi-@@1M1-ye7el|N~ZHy1_9ef+_;w$)7d=Z}~n_05ykj)f6!jJGFet_@ceY}tN z@O69@U&80?I}UH~25;~NZ}8mEkQ+K=xprADm*py#r3gR5hxh@$hxhR@+ec%3fbZbj zco$#6$7~<28>)+M;cNH;-oeKuC^TbyfbZbjcrtA&`1uJ6O@treL;L{W!;_qt1cfA` zOSFg@Q6L;5EuW6?CQjoEdX!7 z*wUPU*lCu|g82FE35cKHnScl8C*Wp&dmh`d;Me?IaQCI=_FUi@Gun8w`EG0LuK;)V zJKg$ylhcDUZTl-`hVFIwnfLm$9q)mCU@dRUf2Yj;lk$Ust4qQqUJ#43amLsQ5t!@6 n&pa~;V;Vd=eZ4hb^@`WzbMu|^75!_*%_jn90^)=?Bksyid?Mp~ literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/redo_on.ico b/PowerEditor/src/icons/redo_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..db7c85ab1b6d02e47ad0ebcbdb9a9fad52f353cf GIT binary patch literal 2998 zcmeI!KTH~77{~D+>d=Ych)YSDBVD;2+Yy*pke!vp|=R2`?1w#kb1lQa9~eW!{Lyl9Wb+xjIlL>&34({|MH?U zz#4eg@^qcE_$lqJg2tUBv*#oqXZlN3K3fg7LOPn+3Azkj*SU#!v7OeuN+31AKt@@hyA< zU%|Wf9fvn~gEx4CH+a6#m@jn7?KI#{^LgN2IO0q`R)HM{zNxGvaiWI(wWalySn32GPB00%| z4fhRq5^m_X$igiY$w{F#+G3gL+=q&M6huWk<~yi(hk}$10rDh3sYwH@vj83`l8{-5 zG>%ZD5z-{4#;CFwd6u9cC8?C&Q*6r=KFO3qSSgfMfubs@C8~xBbw%n5d0nF*^^t_P z`MtmDpS!%?;{UmY_}4reXPr*x?DPbO)|fwizrX+SG;C@A_Fen>;o|d`i=VRb=G?e? zeBeCF6CplyjcfC2I2;V*x!o3`JGXAk$$)+!<+Bi$V}CLnx0xY(ddHZ!mJTjWA$pEE zG4I@4?VY24FYW%RW!vVI-^8O%Q~nvdPTkEV2@bMItM)NMt2R)s;vj z7KyB6=K^WFzhOJc@1FB1 z3lr=08i{L?8JQ#T=7_y7>csyh4$^=u7sv=(y2wHoITyK zgUz1~}smG&0e iNRs*fHjkxK<7St2UA{Jq-Sgi>nkP(iiaPwWCLmS~Y6as8ypz zj{;8`HEQ&#QKLrnp4_4TLLmn~-QD-Sw>&ieHF<+plP+K~sekF9cUW`|)_!Fs@#-Uz z^&^>MyO|^PmdGUj61&}wzCs?XkOjZ#B$U2JLG~mMnI+L0Ww4=duqQ<pa4SgpxweW6onlMT~5l zFq1q%nQiG?)MTHh%%n)+R~Z757X{+FKwa)pS0$>tL|Iq#3N>k3YBWuaebb;M4N3Vn z(qDOfga7p(P+Gn8PDi8B>F@}Lemr~rHlKfgHaeH8dNLSvKRum)zCHh`b*3c(}W{xxT)*c<;Vd Y6x;nrXNvOGwk*pu&8zX)&@UC`52jA#QUCw| literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/save_dis.ico b/PowerEditor/src/icons/save_dis.ico new file mode 100644 index 0000000000000000000000000000000000000000..272535730d830b9b1605b7d84ccfa1f6d459518b GIT binary patch literal 2998 zcmeI!F-+rD9LMn=$4PX8t}w9#btOB{5i+qr_N+)O*|IbfVL^o7bax`F-9?{P!auE$N*$H@}zP;&;*( zkDHtRne^*-((1DG1LvF6kJOUhbCjCc*_Mr-J!=wj-fU(M968nX^)-(^u=Gb}{)}Sx zFZsj&+kd(Ptbu=Zn_uTFezxZOSGQ#8)j8|h|KzRn>-%fD-+oc(Oudn*6`D>4rv1LD z6tK>Hb?&9cl~g;IDs`!RsBnxQ;=A}ZzK*YAkEjFu4t^V7!ms0*x7WkB@F)0vdL=%|>v)GB z;Y0iY-^T~|0N=qk@HKn|U-sW|c*7gs@P;=$ALyPBbj9sD=XTY(U5AH~!;kPGet_@e z1AM{q(HK9(ckyj}9bd&4EFb0#)x)>&C-{AQ318Hp(8l;7zKd_;>9kex`3(xq;Yauo zKfw3#G^e0JA&ux!E$W2Yr%F^&gB~9r_3-eZySqEx-rnlw=0=y7mkNSF7Z(@mbUHda zJ5!_4(CO)^YPFhY;0(Cbye;U)6XA1{L{ZvQ#WBz6>ZMB z>10wQoQs_kc`is?9MAGako+FGIGN>d-=8#!Trz#h-^6J;`7_T=CydYDe?Ff2nJ1*V z`P8|mEQREZk7D=a$EFkHepPnfi@^_1G%Oz@=TA|jc RJ<7~2Q@oph*U$Wi^c8s$17ZLG literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/save_off.ico b/PowerEditor/src/icons/save_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..d2f4fe9b5092e4d79eac8f0ea8a19596550e407d GIT binary patch literal 2998 zcmeI!F-S9K9LMpWuP@k1yXurB($(y0N6nN)vu6zmk}bnElVmcG7aZjsN-4>dMdB75 z66oM`lVo^F?v)k-cNh?%<^A{j+?m$sU7=k%w0HiKOMajKb9YZ3qtc4rDVO_NZu|M2 zw9Rua=Uz!aekHB1O5bptqrRn9^qxnlfn97#_u^H9kmE)pdE${n4F&_AU10H#%-j*h z?%r|_|8M{48DI_ktK0HAXYsQ&-oN-rR$d&luH8@CIvh zP5BP%+*Nxl)vu+>g;cCbg_8U!euVGhTlgBjj6I?b@w@mPd>+4vXWU*7e~z!>5Abgghxk6egYV$m_&UCVFX9V$ z!yDf4hBv(7-9Bc&X1`#sv6o^W;U{<>Kg9R(ZuAbijjp3B=pwqn_*47{-^I7^HGCO= zgg?aZ;&%&tO@dMiXY*-_!gd-wlY3_f_#hc z6TFWf;`?|eCu4$qCZb23Q&sAK%2Qbr^ziVY`}=#{-QDT-_EtAHH@dpIQm50=<>jT? z?Y7R&&Q!10b#ii|N~NOX<6{+zMeXhFsZc0rdwW}3TU%ORUsv?2>HCi#|LNbUc{F2D zWo@44&1bVL;dxEZ6L~5KPn*p}{uYG41gFh#k-t7aX%L)-^XL3k9H+BC^3-%je{%li zc5<}PQn<#yL^Ngf6>^P2OlJTMEieD97f`bmS}Rqvm9R+{u@ zr!KdU8%P;BdCQC|$V>^|-0@%GrOfPU-|W+dS!2z~Q)baB#o63hf8#%--vPJ5vjqSE literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/save_on.ico b/PowerEditor/src/icons/save_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..79a8e55f03ae20a0640733b1c8ba1d77c8f657b4 GIT binary patch literal 2998 zcmeI!KWOV#6vy#jULK^A($ztrEDl}cJxNE$lb6K1S3?$WUg{~M4IVOvH$1!^4KqQDg{#mUsHSlKpBYQlVWsv{yN{ob$QoN=G+;q%D2W{{FXe}sU5SD)G>Id8YqH(oi_Xf)#8B`o=pnL8sm z+_&7z|KmU10rtSZIyUz?o1fACxb{f4*3Q}2?kj7bk7gsqzx<>qHVx*cPGo9~P357f z7_!e@^k!1)R;ph~m8MjxDq7$t_&&aiZ{lm%GvX9~gg?X=@dZ3}2LpTu-@upgMQrku zg%@6U;Z@ZFKf(9$U3?Q?!=K?#HPaFP5MRU>@G*XlkMLvs5Fg@0d=KBk*YOp632%7A z8{Y7SH@rJ$9Jd@-98HdD;$!?AAK}ONA>LIF(LHnvT}M~YCF(Em6MP@v#W(Ra{2Bff ze}q587x4u=bq51{2j9S#@kPAwZ@WX+7WfIikMH7}_!|BUe~Le%n}>9>NH+`k7(d5H z_%VKn5Ah+shi~EQ_zJ${e#hYrZ+OES-tb(|j0?Kuab5Aanmn#*Rf_R*e1sq4hxibm zvwgI{Pw;(w7vIF!@HyLux{(I>4!(ge&+`=jX8Q5dr+@l)Du@F%Ro?J@KVamf zec$ta<$)mJ@|OAc6@tPv@PbwT?E++{QwlHhZ_;V@Yd$j@Fh5;?Grg=#`K)~4`!Cc@ z7SGB*c>c>Wn>qg>VE(c|=6v$2@|k(+r;AUg1^@l^yYobF@L0~TlcsJi&lgrWtSHRzV@(-(Qpd@eJ`s&hym(F$f$b4ge zZw&ITKS_%NpK2S~WWIgPo9}I|zLuYwO|^ONt`zl?`DCZlH?{xF=VjCR`B|4YcLN!f z({Gt^1-V%g@9y}o@J7z;^~CJ+u33A>zG&NCwPT;PYi*r;k$!k3;=dpKw%j7Ni5+5> RI3dj9ZGzR@s=xCe(jUE?6Hx#F literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/saveall_dis.ico b/PowerEditor/src/icons/saveall_dis.ico new file mode 100644 index 0000000000000000000000000000000000000000..31b5ff15d973518f2366e53b8ab5bc03754925cd GIT binary patch literal 2998 zcmeI!KWO7-9LDj-mxFf7bxoG@;&5xcC++BX@{)M>YRKZv%Lxh@ZSasW+)zr9CojR- z+zd8!NEc1P!(r><77Q{mgo8qV{l1d?FO8u$b!er$mh9*AzWV9ao5WH^uawPxBe(tb zN;=?}&ANBePhU&BJJLJOv$XGM8NKFJ^0137>AiU85pwQ%$$?i+)$8>*y1?QenYl9> zyZgw!{J;IDXMi>EuWp;`oW;-PyNis5QYzM@d`ZC=Kft%~O?(Ys#-7qn@JIMVd=9^dXWUK)-@sS#1$+)0 z|7PKZ7hZUkG{z6`ZG017!@aI%`~cs^H}N%m8GnjD!5=Z3hsoYC;H&roK8N2nL4l3&1AH6b#52=Y#=ks4fz9wE ze1PxcyLcvN%LD~XM2FU(RcQrUj<#)r9v>g|@bIAf`+MEp-RbuBR@c|p@_k=dS66Da zTDrKnP`zH)`T4mjm5R>J&QvTGb$ooRd_J#(g9GjF?`wB=SF=A%KYaM`#s8<~vni`- z%NDWCr_(JWiYAjN68TFY`aN9be*>gp$N;PU>xIPWbeT&Vh0I;w>6HHQ^GrIUa8CbZfHYqf;%>v`?&4wiDZT9CLdi|K@spI;-JcsjE!0hO zl7DhFC;76F9i!50xom98a1Z*vXDg{r_`P1 zlSLuR+}&R^cezdCXOrB>GB@(M%frb;t3o#OD4bd}(OMxJd1w|Ynm>iBLe_KAFk~{< z3t8o98f_Gk#LU0B2NXYuI8O^nV}4(G0`3h5m#2j+Vu^c-wdGF1BHnWM@UsNk;7ytkO literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/saveall_off.ico b/PowerEditor/src/icons/saveall_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..37b78b03d105304af3232217421794cd716b1467 GIT binary patch literal 2998 zcmeI!KWJ)a9LDj-n+xrf+cjCPi=k`WlXf&tE{VHqAQ0Rfyh0&3DHzBY?odk6$t9T0 zW>DymE@uiEE_!a-f^Z~4xKQY?-}n6SPa2_j>d>C!t4E*D`@X;Po@1hv(krFYU&(F1 zy^?l#O{d*E>Bldn%?;^mj?=VnX(_$tS*l@^E$W@Ts}XWst3@w7bEtm5&#Mb8e8|il z(b(Nb?&<&SKfMCn1OMu_dY^Oiv(;WNU6Rz&G5585ymX)U@B5nm{DZuysXHAK>@!yZ8)#3(vUSF1~?3#^>-EyztLghgBQnhxiV@i7(@e_(S{wevj4MWi>Ob z<`#a6AK^Xx0N=y6@ojtyU%{8~d3@IWjl&z>@P;?M;VI~zg08t-7hJ9~m#a{aruY%w z!w>L1d>g;!_R$zW#CPybd>LQFuep5~*HahYz#rpt_zZsC0(myZ5Ahv*6VFOp5&!Z6 zc{at5@E(4E@8MaTH4Egi5M5e>c1+9BGPHFI^!WIwhldB<-QDT-_EtAHH@dpIQoG&O z<>jSXt(MNt&Qz&XbaHZ{QmLe)qa)?>dF}7-E1S(~XJ<#-+uPdQ+|=|B)A#S+fA;^W z*>u9)v}UWa%_fsIA~>zrt5uP|1cKlFMgBKH>ieg`Qvc;b!gMmvrIkWvuJ2?*|8Rb3 zrI1;*`V^)~{;ZJmdi9CEjzs;R6>>hKe>6axFA8y|;c_>*?|-aD=buazounH-N{QY1 zx$)yd-7-h{$Er)C{z)OxMR0kThTx_C3`)l!n2#S9lJs}O27x^}K>uhe4(557`hJ{; z^EjB~uCE^`%1>1f!E)}-FPOR9>a2cJ$h^Oi&s=_9uWM1rY99C#tJcL-Ng*q_Z|18y zTP|cdC-r@~wOtgl$m29vDI|(ne+!t?U5F@;3yEXCuLSN*oX3SEvBWurTa?FBE#mo+ z%h#uF{J4;LkJW>DA*&xR-X(=BKKTbn_UWzJhcC=(8}_GC_DOp4LE5OfpU2VWUisy$ hH?+5(*}lQQ literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/saveall_on.ico b/PowerEditor/src/icons/saveall_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..66543c5084c039ca2cc5035add430f0301b28a32 GIT binary patch literal 2998 zcmeI!KWL&!9LDj-&B9&v?zV;(UK_);u}|(wV`Y=r+X`vyY*si(sbG;ZY;hciRyM(O zUJ8XPa?Oj7V6iCVu9OsE;oyGzo%f%*8{xLP;%?rIzWRJ-=9h7@tCZ6#6$)?V+Mlna z1D*>7_e%QZTgls#zT>_?|AC&xONRhm+%s&I*);s^LHzKO44Pw6N4Bm5!0h|lAhcR0j%@C|$!U&Ka# zS$N@v7hY8@@l*T&-^DlaHT)_5L~|YC5Aj8O9>2mb@F9MJAL0A>KE8)<;p_MczJxct z;SFzi!yDdRbFLe%ORgqYHS#O`0w3Zh_z~XC-beS)Ep#1SL6?|+iJ#&J_%6PQui;Pe zC-@`$A-;&uLQF3;+4}HYO%;Q)1 z1wO=2@FRR5-^cgxEqonc!I#{>ad^WU-tdMuJO#}u=!TE$l8>v&$5pLLEBpc<;wShK zzK`E=e6++*@dJDp-^ADOJB|7@9K0fN<;X!wIce=g3)%EqY`u)DHuCCPU z^>lG@p;oJ<^Ye4n>vf%-ovBi(==k_prBX=;2M5~U-HYh!{(mZ11)QcG z&8G#lm*XJtJm1$25aeg;{EHb#XEP>PkKZgLPP1IvDkK@p_-K7m!A2p0?>{q=>C^SM z3%U3FXO}|aVV@OpA22?iAjyGgp=^Z96I1l7SfQho) z{eEuye9t_$`wnd8mgdx=bs^dKG&kQ9OQnTuLQ?$2PA?rLzgLEO^ z6_T`j&zP05_gjKoGpA~S=EL?UC6$dlXM%^l68 zSMDRsOJL#2n=BguUg+3tfX?r5dBax_6yHjX zaQ-elf0sp^PX_{%4u}x+{r6Gh8 zk|AuM6(r(^4C;d@^&$5q@{@%L5|lds9n`Zh}yyQr%vMP*`rFP#p~s{!p4NC`*M0 zdMzSaT)%aZCS-b)H9bmU6kHYwZ2*e>A)Q&!+oH80&M~acGPvNR5U-F)i=3CjdY|3z zl&~x*mIHQc%!soNG~3ba@KQ@N&c%+j^raoode{qKGkRI;%A_2=oVAU$;i)y)89Oqr zrEKhkEIZZgE{V(gPwdoB_ACVcouwGds+w)<%S$YkZDr8u!XFH~4;_I_wukQ2)GMEw ztvyXM?mlzp;&zy}v*+dJ97tXYvyOLodsPmO#v`=2TIZ-yh|?=wj@QNBJE{uA!@%4~ zVH)-@4Qa00L}#_gSsjBlaafmt^}Db^f|?Z6?Pjh>n5rZ!1U%!pBVzLabs?w^!JF{? zh0-$GV*A)U@v3sfpzQBZJk(}t)H`dG;aJDV9KaKRrNlVJVBj<1ir) zP0GqI%G-vOe_&6-Ku%c3QK?3&HFR|i4-U@L|LS@g=EGER)VZsTcdE0noWFKn1w2jP zuz81ACX?y)dcsFOO**QQi8Yr*w;KAM+*RO3Six2XP*v=T9G<81fgdCii3r!~bcWuS z3#Czb3~ZNT`iDQf>Ar^N0Sf??o?bPFp^A^RLv7$dK`{6Wf`Wp?VzE>zZE9`*R(}95 zi}119iumd0DKZ2k0%faghF9#>fWS%2QzbJInu)H49QZk@5}4I H?NImypvUYo literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/saverecord_dis.ico b/PowerEditor/src/icons/saverecord_dis.ico new file mode 100644 index 0000000000000000000000000000000000000000..e6fc91d768b26dead171e5534befa75662130ded GIT binary patch literal 3262 zcmcJPJ&xNj5JsuWO@MSkx^-pb7TLm;51>N6L~2Wba}ozu75E}j5%>TG(rdf)0jxax z!_E!}L7^097Q-F>y%~O_6+*_}avARS{apwjh(6&<{29-}N7@j+GWUONwOVa9o84~b z)BKoXexr}U%18lUrUiZ9|4cIq@l3_So=ztP48G!T|LM-==XnkjvTU4hg^e7=>W6$d z94?oO_;g9}SAKo0+on;X!7Sp73|xHRXgoGKp`y#4$2rk~d1hEH;%tNY+o_A$&@@X_4ou88R_NDqvOxFiVhFytcFc4t^tB z*?jOlU+{T+bQacH;GWO8j*wowubj}JpZv|&xg!a+7p_j!1!XTSt^Y$o;N$=RnJTGZ@c!35UMPM pFJPWuQS<}j;eCoe{m=Lw@2?@l7x)vt@2?r^FYs@D{|7PQh))0j literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/saverecord_off.ico b/PowerEditor/src/icons/saverecord_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..847e9a8e972f2e96e1ae4628930b27b93f79230a GIT binary patch literal 3262 zcmcJPu}<7T6h+6?79gdID3Dlfm5zcBfWp796+eMQu}!3<&lk9W6i^_MGN}+X6g0FT zDkxJ#3KdBEa_q}KX1&G?&NBF!H{?juMfHnR=hV*Z~et5t(Rz6msvSb{EBViR8y&LI(*GNN0P=*IW8$7F4H13%Gy z`B5tCBmXrrT`)+@@L5ukOrP>=WVg)+e}-SdyYZ>Buzm+V!=JA79quFlSaY%x;H-1zSm@uyvYxFmXF=3OC5j|p!7~3SH J`aR;i**|`^csc+8 literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/saverecord_on.ico b/PowerEditor/src/icons/saverecord_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..3556f501c4dc7c2ec758ef9e0c3eb1454a20c586 GIT binary patch literal 3262 zcmchXu};G<6h&VKln#-ogoN1Ikv$(khki?ECMKlv19Z>C%2qz43;YEVQajKA5H;7n z$%|8x;DmykXF0Kb-hJ0;L?ZmgV{z?15jn-^95F^r5Rsgr7rDXQAGb7{PN$M)ewvvv z;g`R$GM*XX1-M>rg)wFoc0opk$s31FR|OvrmG27a&vzVW_$sWWmQsJ3&9W6% zLaJ5Hp8hoR2aj(@&!0?Gn}vLmxj?O`_s6m54~EHdJ9vCYil!{&E1CM4VxLcyRsL|X zP9C=LldYmQOYV=eU9-^q3g3fcsQOQ?UWT{pWcfPqQuwv_`up+A6m@5ze0oBEI_U@B zrdVuPB1LMi{^%3FIZRQ$pUwUNUP~rW_2U*~_TlBJ|Yz4!HFCH@HTBv5}l znX}3#*@q)bi~o2W0-tTb3W7OH+|Q!)oWAG0ihriEu{;Uf#1Ex}0%$Lh)^zLN7=bVJ9% zcmAQs6yoy_OZNF7gYk+a%$Ep+Lrd6%fAeLxBu6^c`R}riCiM#q)3W;!E-qd fi5=GM#R&Hoh&jUSBtpc95n^t35!{avcgB1HXoIx7 literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/showPannel.bmp b/PowerEditor/src/icons/showPannel.bmp new file mode 100644 index 0000000000000000000000000000000000000000..f0d57fcccfadb995fd5ab04940c0882d484de148 GIT binary patch literal 1334 zcmeIyy-(Xf7zXesEyOe;EwrTtS`bMARYgP!g(wjeq&SKS1O^K{c+Hs6qgRg}J!bXj zF{7nS9y5Bp)uYE7-RGQ^k3XRjuk`bK&z(QyljZJBYY|1Y7J%;@t^8HO(tM#bZ^coK zDYOlQj)B0jFi~6!QDKPbbc)y;(g-u3#)^%E;;{n}Q0O8KJcx;pEb?LaAw)dERS=;z zPS6YmI?6;qq^hUrl0nUgovvbbvdNvL@F)~&E#q3owG1Qb&X~!dA-Uv{l`xY>0r`TR zLXugAT&im&9I_G#n;de<5)vb_$t90M)l-Qv1r$+CvrIxzE;+}2@zNYVC0WjSc9|n3 zndit~yzIe$@C|6J!9X1!>vH4rA*?Rlmdl^EKE5jc9jjW!WZkcCZyc)un1AahKR3^R zY<(NdbK|Jd&@WDRwm%==L#vwCwSKR0vAMgqyLVS&HcyWF2m066O{ZhNR{8Frf7Uy% z@3-5`?|9ckH(%;| L3+i%ee*5+ZKj2MS literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/startrecord_dis.ico b/PowerEditor/src/icons/startrecord_dis.ico new file mode 100644 index 0000000000000000000000000000000000000000..0feb7145144f169d8bc2b00f50182a6fe42ee008 GIT binary patch literal 3262 zcmeH{!41MN3`N~L5;w%LN5)_@CMauk2u5H9c3^|>gpp+>ZDYqj$Bg%EBPVs(w5@vp`oZ|q!(GQN_B^I)g; zq*)61pcFegX%9nDiZVX4U|*cLB}F|S0$&7t$9{#ADb}vP@o~T_{r@nUZo#Da)Y4l2 znWB76!F1C{>PO34Uyu|g?TL!NZ2bmN<{VicM+m7gf=mab?f%ob#J?}l5XXy=1~F9Q4+F7a%N+Vyun6o@VV|6n#hf?4rV zOSSsrm5J|983#SJkJOKpw`|bw;?>DWQvAC02Z%72$nuy%pTOS|bbeW-E&9ZDQX8-G U<09$t4=9jU$b)GAO;7VZ0hEcR0RR91 literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/startrecord_on.ico b/PowerEditor/src/icons/startrecord_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..dc3c51639883baaf9398b7ca845581f1c490b485 GIT binary patch literal 3262 zcmeH{!4ZNm5Jf+CXS_KcIeMo7tDz3tpaYAc7(0lcEVE`3h_KO%CTy4`f%n7D0?_bi zTljWA04HV__Llw1-r&qLaN}HUf9*i;Tw&zxbIy$g!L?O>#=sJPLSxq?Z2XzrjnMEz zsfvL=kvz8RoyIH#L=rasFizxtcm*#fiDEtp{36H?;gT;(>|KB5(}A$1{~yk#Td-(8 zYiY0ld_?#n!Hw4VNc~88%L`IMn~X%oZ(F}Ygt25Mvn@kymY1|gXPH6Laz0ObWpP5=M^ literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/stoprecord_dis.ico b/PowerEditor/src/icons/stoprecord_dis.ico new file mode 100644 index 0000000000000000000000000000000000000000..7e5478b09ba32c523265a041f7258482ad9ada1c GIT binary patch literal 3262 zcmeH_!41MN3`KwMNZb&|92tYrn4qlDAvyvpumc-}CvpjiY7j{!5dN*JHkQ8KXG;TD z2zqGRNITvRL?DjDpgm9NM9%fs1TM|8@x>Ug4Wc{uH~4)aAA4TKzkJX?{w&pa9_yP_ zFMk@Fo<+I7{&OZuxqq5nnlJn_Jo6fSD3Pl#e^#_sul>PiN$vYzIM|;6T#*WxYEF4Yo-D literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/stoprecord_off.ico b/PowerEditor/src/icons/stoprecord_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..3116a3af6dd9eadb97f7c68dab0078bb533c3f1f GIT binary patch literal 3262 zcmZQzU<5)11qLu!!Nb5H24rafu>ue~05Kzj1dwE4XaLHMf)O18XD9~vgYW zK-Z0$k0<;FVff&WFEqc9;eMd`z(h4O%@`8_rKn{-(1tTJjgb-1I_jGL|BNvl0WBIe z9};(v_yvYPJaB*vnuHI~3M54B@CPPRbU>~212hL0pgjGfnSh^5M*hWbAe!u``Dg)x i#w8|v&{H8Pe1hiVN{6H3Lo@`?Q^yAe27X#%bo&6cXRDO} literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/stoprecord_on.ico b/PowerEditor/src/icons/stoprecord_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..c6278ba9d5f5a880c5b55b52e755e2e9d2c5695f GIT binary patch literal 3262 zcmeHG+YN&-3_SiT@rU}E&;GMOr^y^$gAF=NhG7HuC=#NkxQGO)RqdQn9@05EA3((s z0-kX{0S#vtW?){K70&zuH=cR?wE|Hj6SjOJk}|-%Ilm#`7wTj8OTA^s{mD;Lp-pc9 zl;ZD_wDAQ)xuX2BlL@Tl{A2IN{!;%*98QkVhb87Ht3NHej8gs~&syaBUoqIr9sjRQ js7{?<38I!;^jZ3F`_4!HH6Qx^k1C+O(F667sp~xe+{@yT literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/supp_off.ico b/PowerEditor/src/icons/supp_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..9b977e08428fa267758b26174315f62bf8928eb2 GIT binary patch literal 2238 zcmc)MKS(o47{~En@W8jy?geeMSxIYp^~#tkjiyfFy5PJHe=vztE`&D*}S%cKst|I5s!s%kQ70&$P1C zP3n)-jOe7)fAE*&l$mL(PLTV0J-KkEsa~(A-c3*OpT8-JO`V~s5t%A|Q@(2oLX%u= z-AJ_yseB?8s#30~XoMf&+xRBFiZ5XgsQdUG{5C$oui?qt>EIjq3O)Jal%pMD0&~`hxiEJ$9M5Adx&nKYv?k%fXLQB=kSI%yx|RRc*C=x8(!B1uj_=@RpoURi&Bgq;v;+?-^GXc1)q;b_yN9+ zZ{n-?5`MwwL*7Uod;?#>=kWo4(FR2}!VmCmd=t-3TM7U121OR*hxiEJ$9M5;&Vmh! z*oY3bL9I~p)PTBZgPxwAba!{B>+5S>U0vz&@>1vL=L*A6r>CcCwOTqpK31(()6vn9 z%H^^S4-Zu+6tug$t6VOpt*tGsudi!mWkvD7reDv__&Kigg}8a$#eKc5$>Epc?&izm ze8>F#<2MC~9~X-(#T3r~*OPU>tz7YKGCWU(?-~PlV-!741u@q>Gdu<391~#U;bRc{ zCvjtw$V}WnMY_y1fs1DUcGLUf7o41CfGq%iZol|%f_qZCnv}^DmJZMQ^zVSvesxUX zf^$>&WNADBlMHSK7rq~lPcx)o9G;{nOOoD$X*d~v?J|FfUhzsk%fsev|G$FwI zu={iDe&!r{_#piKy3D?^s9&fVvp3n7SMAkbwED+STKa2KnLGY{c#<~$kyc-&W$Mxk reKAYErS@po>7%*Kb(Q;#TWOE@&p3NkhO|r6WqYfyn)NoAYg+yT`i?Ja literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/supp_on.ico b/PowerEditor/src/icons/supp_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..658ba716098f3d715931a2b8263b252235b06992 GIT binary patch literal 2238 zcmc)MF-Rj@6vpu{_`t0ci(OCxu^D-->2+TjQ>D@LX#=v5F3sjOzAk|jma@h2SSD2( ziCwTrmMyG?6e6r7i}hf&%ac9tfA368)MVSe!^zCt^P4kw&WxaxVcXu8AD>=HZ#eps z*e3oWGGda^_`~m#pUm8`8YDSyG?E>^9ID^%tAEp1{N-Oov8g*YH6v4XU@G)XL1>bT z_Kj4(kSeEAu_on9iYE9WzJqV!YxpwukT}5a;dk)?eiKjKZWrIgSMddWfRzip@WKnP zk|y{ezJqV!Yxpw$5PyK*!|&n){3brekMR+HfbZc$e28!3>-Y-3h|l8k@-ALAqZ0N=yA>LI#~uA?jHB05j~34Vz0;9K|_zKlP_AK>@!yZ8XV ziKlM2i*Mqq_yRt_FX|3mo8X7|4!(u2;mi0#`~ltEqno>QGoYKB_!vLNNB9B0hY#@~ zzKyTrEBGQlk2k#G4R3hE8=eK-@VYK|U8lUR8n3HVl4ATAAK?f19zMh``Fu3N5Ahv* z3tz*R@k>4*>PG6~oA@fefDiD?8WhGro!u42|qOj?qtN!>zN?urdGe-5Ow*6$sgf+vuVI!>F5mDsd3*wwPRb|g>1|Swq!W-{n6ASwc$#(~ zS$z6vzKf$-8j$tEUzRp!K0U4A^U2TCw5#B&%D0cN%Fmuc~d z`LqKI(!X!Y?5mmmLuAZ;%Km=P+s1dTe}1QxZ`;b;@$bXEl=~sAKS-;@%6H~smV8U} lIc_k=;VS!e&U3fYTk`L5_Mi-9SBO>n*;qI0=eXBw{0}&&#mN8w literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/suppall_off.ico b/PowerEditor/src/icons/suppall_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..a3649742fe4644b80583451844144c1177aca436 GIT binary patch literal 2998 zcmeI!KTIP>6vy$O&nJ-z(n51IMzpwxTnVn+fP1%=XxzCuSClw%L5Z%2qR6h?AXCMn zu%jrV+6uWq_6a3Y1S_sNDVMx_-|Q|n7yG27Ns-Jl-aqd%Z{LoG1u3T&+T8q7-hO@| zZL#0n^fT$ZFQnDHw9WA*{WU$OmwZZ1Y}S&|*;$hy$IWK4Qb?+Xo?@h}uSMeo$5pQ_I z8{Y7SH@t6SwoA4%wmMrm_!vLINBAMWkN4~ybQ|43SJ5SOk^EEq2;arG@O69ze~3T8 z@8Wmx1^hamyuBX&6ko&d;|qAh>7UYPw6%KKD|I+HbIY%kGi|N)6LC|uCK3kb#?`I-h%7CBvTUGC8f|y^P8=itJ#}lwH{Fm@r_6%_x zp2Ww7ND{Xc@Dyp8X#zLf9()3!=1_K0IdS_H;GH6~0z7@l9g6qS8Au8U84{3<4!4+1 zq@}~R!@ZNyKF?_Zez#EF{QX(@X#pP2;z@y=vkn1C0rT+x`z3=6|^)jYpX7PeUd3&a2HqS^P{ zc+KpOyxGT`h^e@v-sKCFH;{$CUwrbwx8$L`Div$@Zl%q@GhOO>Wns>)yBC-^?Ti*Mp<*kjre{s6y^FXDIb%pN!#ljgJG{d?JQJERp({SFb3U#nA6K<11^7AM$B*$t zyoX=2e6+w%@O^w2-^ADOYnBgreGTv(d;?#`7xC)~8a}Vx=v0`RH;;SczCE%sieKVJ?-x9YIAc_!Jkg=-@W_x|5JGu(^t3r zSH*Oy{CbgNdkpMOE*C#AJSW4eRf_Od0_%({qqKPiSGz@QBf;6zP z(ZJ{!1EvtaN1VW-ISVd9Ql=CLgG-Q9idluDZE}w?dulj99s#apEq=pvJO&nC#<_^o(^()KJxyMpK8nZ3B)kOia7IOij*?rN~yQ3D~@}ZKZuY+Qx)W4JQD25)Kzgbejy%hF351 zOjs;2o7QRq$;?xIJTIGJ>Tc?EHG$O4e|qZNFMLnga_;Y}bDuIU`%!N*f$~4zY2(*7 z%Kj#0f0wo%=s)t6*;*iN+|iFD(TnS?_+FOY+y>3=<>`O;B)z4%zm##V&2vT@&fW1$ Fw$IIIOltrD literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/syncH.bmp b/PowerEditor/src/icons/syncH.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ba588b882e365a5f517b5201fbba3a23f7b7bbd0 GIT binary patch literal 1334 zcmeIuyKkFN6bIlRX%N(X*+E2gQ^{!@t0b;crKv2Zky?igm8@Dp9=$Sp^vKHSk@2pK zjEqR0?#Re^*E=#Y(sQAY4E+N-SY`Ky{_;fnak zwmx`cjXWZ3joogCf^EQA01=ZU1dq3fq6i|5P-YRrh#`(+up~i3Sdt=5QwW|S%QCED z4$e82EJvQ_=mrIfqQGS&a7|oBVu3kXCISH$5JJ@wD>6?d{7hm^HeAx4axM`PDJ9&r z#40OkU&7}lg1n?1<)TDc(wtZD^9pOSA$~zM*^q#QDvJtR!eoW2QnQ+7HA1pgWQ~Y0 zk|<@3l<=xXUAJ<&)9?B*|GmrOE&lIY7)`u;KO7EEjt7IcZGU!m^Ua-oI-3pJ{@lI3 zy`5Y+)4}s6dzz+=-7nvr*Hh=_Soc(n=U21K^QrUor0qX17K{7)AMV|-?N1L5E-pTd zyWKZt^Zui4sr;g6n0iNjef!As`aR2N_uk01t)68a8J*_6=Z*TdZI84+eLMa~-+35& X#ly zM?tbkg{Nr*?~M#Ak+q0yu~3p7R;Y*Qu~*{%ZlG;j^3Xi#4WS~1Jn8+r7``}~N3ip| zeNI3~;;F?cGaw`t*5Z;AkdSyf|6-yszDRm2v-g#$oF}~lRQ_`&=gAq9vQ=&%>juc- z2~VE%2jHhJPkR5+sq2B1kCNoPH4IiHpPG`xHenE^d_J)j( zeN$8U%2dvi-hnx}@jU7MOa8kXuzwuyho1GWN4@DmuewLa8moGD4!?D%zxD$c_!u8( EpC4Kb=>Px# literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/syncH_off.ico b/PowerEditor/src/icons/syncH_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..e1bc73d4398066b3b9eff12125daa95ffcce7e2f GIT binary patch literal 3262 zcmeHIv5LY#5FN3#7AvvzGxV3t57=4S+1dq(-w^$bSZHxvVP_N~B%rKsvbxMcE{-S% z2fNvwyu5ky7#10c8hCm=LhR6@MbsvuJ`N}v;4sf?jGSNp?*8YRG#Bexr1yKWHHCH1@S0bAqA2F^Kk%MW^_v1L$O(6=bNZVmPHa3 z7I0(?J_ldM9840SO0R_YlJ4BT{>1JR;F@j`o!+HTTW0SjQfd2t8qH&UP${jfy<~pF zdZlzgmHe#1dS#7?Px%{o=?0X;6P|jdY(PJC^-AeqId!GL;Yy{S&wf6;Ur0Uh^SSoaR2}S literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/syncH_on.ico b/PowerEditor/src/icons/syncH_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..f9a50dd47556dc4552438ee2da3eb0a5d61a5b54 GIT binary patch literal 3262 zcmeH{v2MaZ42F#mY6ga&N>xWj9)kz#z{ZF~AE0aJ<^lQ+734~d?LXu^k0H02|9Su^&s9G_l+^eCc@MTH-B%=SDlj>R;AAVm{p`@3zr!0{u>-g0 zKxVt)X;WyL-K literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/syncV.bmp b/PowerEditor/src/icons/syncV.bmp new file mode 100644 index 0000000000000000000000000000000000000000..81533af0f39576e74b89efdfebfca4d5f29db2bb GIT binary patch literal 1334 zcmeH_J!{)g7=@2or^<(DMT1KMZXJV4gkVFs!5K%yTKu#n9 za>5H3bw-`w3}G0O6Fejj!J-Hek&B3Wj5v;w@fb;xK#By@kb`rM2@?=Pz;sijX^M*= zLys6RBFtbDlPH7BGh~_S5>vvCC7eWJK`gnXol;16gp?A4IL9=}Y0u&C9InV|qfF@? zU&9e=EQlrHq|}Ke;S!$8Yz?1aQh7mMz$1KxED#Wkh!lB&nBeOIML|j5R^=m)-{61! z1A2KEpW5yA<$0_1VdK4t{c}7T^hT|XUyr}v-+#O94qMMFPc;qw@sD5K(_z;>e>PXw z|9w09ay{(cUGA3tbvBzlJWR)v_Fm~9Pfl)bKKGA~-tU*LSq+shYr0W-rD>hb=gnGU z>qf`28ns5_OgGEjn0K0%Wp%WFUcR0`(W~2i;}yM1XR0#{VE+|1>JoB literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/syncV_dis.ico b/PowerEditor/src/icons/syncV_dis.ico new file mode 100644 index 0000000000000000000000000000000000000000..cdbab9ad04b66ac355d07c8862400e901bedde1e GIT binary patch literal 3262 zcmeHHu?>ST5PU>I6NxTL2W9#UKxSYeJWgs)z$hMpk^wR~& z59^6C{_2`|zR=@DbS9!J4=&N2$5LNH@!C&>F-B{xl!`eG1a^WD1p+7i!+%-wKWyp$ z_+!_QE4OWXd&SDR_LU$~WBCB2kfrZPgt-jRXCJm_ z_((j*_y2e>BRQZeL*S(E90<>lr4TszA8_9FE3c)b{<(JydU6n0_JUd>1ePrhNv3LS aVn?5;+~j>R6s8=@q56h5H&bW3***ctiv#Qc literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/syncV_off.ico b/PowerEditor/src/icons/syncV_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..693b28c8c0cef4a0d97bd7710ed0e87b2b2c32e8 GIT binary patch literal 3262 zcmeH{L2AN46o#L;a3i=YT~(L8g?c4DfS$r51WC>i@fOLV1y4{@Fc2Xc|LKsI2m${` zyXeB`48!=%|6YEFU!;f6WFnYfWjhpk5s`NcY{?A6?Yn1<-~Po@9zV}%l*bFE8x!mW zO-D?y>KAF4$4jz*9#;Kx5}kIeJ`a2S3;a*Q6W6~9Zu(C{L;p0~=qFKb@rQ&PeYC{+ z^K*Y#_}+i&{@4CfaHH=mrH(j#8diV!D-C~0xT+s_1ouB)dz5pN~Wn?DgIKdFH40qHA`RKJ&B78NUaA$Vddw!=^|y!TKtuNHoFi5_}}01P^No tQzV*TEn$j86RaivWKoWbDLeMPb^p-c53<2wRE)CmZ_Zt(<*Hg;s~fk`UUUEe literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/syncV_on.ico b/PowerEditor/src/icons/syncV_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..c457d602e7c1ecb994129227eb0977a997b2793e GIT binary patch literal 3262 zcmeHIOA5j;5FHU|7X=kT+|{MGs0S1D40;LIdI8U1FW}aNP!~cg{w7Y16|2ru5W%KR z$miu{@;WmmD)G~96SplIdqhnl>Tu;L>T)&nrVM!PCyE~gmMvIBvcjYEc8b^ZsyVk&fH2%PeB{#S>j$q#Dqx9l(SrzoA@+We5e zd^-z)Wvhg|`u|eo&s)VaqyNmG838`+?)*5=)>&y#UX*7}z>% literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/undo.bmp b/PowerEditor/src/icons/undo.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3ed55cec391a5707504234b3b3edf540ea7e00e7 GIT binary patch literal 1334 zcmeH_y-&hW6vdAsf*(XwOwcBXUyYzuq0tJ#U^$yp&PY%NB4;SN~xH)z!tuN{X&M>G(bL0?hye(hI4f zi$UaKu~@*3CUD~kCK@rtH2TCRnZ{&J1T&dRYCNN#(NoDxYeE$sv&T#l`jkpM;loQv z>cb~9MHK-&8Ng3S8X!?Hjz9ghds0k9KkY)-h%c1fd8FBdr%jNQ)|2O!vf1tv8)NNhY`)g0vZ5)<2H&Lps z#`=bB+m>aSjosQCult7M*!F{EU6_Y8z1TO5o$7Y^z`QkgiHUs>}QONseb!Z5tIGqin+{Q8Th^*0~?$ zmXzO@GTTxzC&g28TznH>!I$tkd>Xq-tl*dMi+Bq^k7wR$6<@?>@d>^=kRI#Dt<*RE#VjO7JeS@;oEoz-@w=KHr~dU@p*g(pTx)U25;~NZ}0|h z@c!0f+h^Nm%dw?yyoYb&9ee{{!~3(_=rTHw&Y+X%IP<&sCcc6%;dA&jeigrhU&1fq zE&M#5d8<`?5ue2;@D^V9->XB_TznH>!I$tkd>X%sU%@X?%|)tdQO$Y0hi~H@d;?#@ z+jtva#^>=Fd=ek`pK*ADH+X|Lc!TE)wfI8&T&`^{SB}e-N=Y8Rjd$=3d<}2oLza(R zd=p>6m+(1!8XvNJnAcGiU&Lqe3A}|5E0AMcd=p>6m+(~Dr18N8a*T&>;~jhhU&B+J zkODarqDmBrERi5ABCJ5;@mQTsM@L6TIy^ko!NGy{_V#4kwsv-QR4$jbxw)x)KCkul zb!9Rct*xyonM`VVd0FvzT(MY83kwUHo12sO&FJIq?sNT}I_8!LY5pDKc0!U2bCKMW z-lV*H((O;kw~r&I*Wr26S7*cUyxZxW4MySllU{!?x(LYs8teAYN8b2pe(c?jot_T^ z(-#vyQyO24hS&XG=eW(!TEOHN-thd7>BzBr8S?JY;Or`L;xhZw$$5H^KJA94rNQ;Y zwAAl*CaeiQlfNwJlkdme%lm#{FYucO%717u;GdKYW4;g{i1$R{aa?iUC7Q%mfy*^z ierU#gSHxWFB~QuM9N%)j!MHIdLTnLDqDx#6586-7APido literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/undo_off.ico b/PowerEditor/src/icons/undo_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..ffdbe8546b0af95e298d414b8bfb7ec7cd341de2 GIT binary patch literal 2998 zcmeI!F=!f59LMpWNucdwyPBmg7rMqhX-DJalDNAHS%eNQk=Q6*6dW>!4yBZHatUUt zBt@Zv(@jArcn~^DvJ_JK@AsJmVtSXYw2;2@e|OLS=Pu9xd#8~ST2MOuOs;)fkXAUR z)2=6dd@Lmwr5Bv1iC08IOYEg8_NHB3ebcLwP}3}z*HKTvOSaMv(8<# z$5Q1;D(*|UvXsdy2=POF2j9Y%@dfNAv4LO1ui`y?3eSDJU3?Q?!e{XwcJ^f9g%@6U zFXIdNP5g$&TEnm6J$wp3#ZT}7et_@ceY}rv<16?gK8MfX4R3hE8{Y7S zciWilh;5&(%$A?|DSm?(E0hf&d$zsdU~qSXr$xgV;vqI%J+R892}_KZmV9et5T_GdwW~O zVo_ULTgv5fT3=sRCX><1%8Hhkmz7K=HN7;wfA{Xe{!Z=kOvE(z$n4f)lDy3$ zlb?{@i_g!}_4vHInwgAkvveaiEq8U}ZAAY1nprv`-?+}Zt0U9*j7e%V>U(={YOi-E zW_%yqZGSW^-TSxQSne6x)ll8Y?+$vd&j*|9|JI56*mEeNEOYsPu@mu6$|tk0FU>~8 xXQDqJm-H`)kT~h@Sk*l*3Hzx<`=LknT~9ear_W{DF{_!`2@w((#3ga7{Q{xo;bZ^+ literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/undo_on.ico b/PowerEditor/src/icons/undo_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..832c8ffb106ad4d206debe9a702a3a8b263acda5 GIT binary patch literal 2998 zcmeI!F=!f59LMornm{|HW;9D(E_Bu1w4-ryN!(q9EVsEtC}dP{$QUw|QqIXGn5mK! zg$_-laPBw%qi-ZPiIquh(x*yi--L*W>IGHham;)d&uE$-VtA zk9q~z1AnzF?sGOjrM`0Sku2S-v#;GNZlCu?Jw>11DU3{=iK!8qs(n+TYw`m2xr^3F zs+~xc1F7gsxst*uet>V|n|L2z#%>c^_&h#~_wZ>v<90gu2EK|f;63c@lZ6*vc;Qvj z6hFYX@lCvsFXOlITN){k&*D9N8Xw^&_z>U6ckux}z_;)`=kSI%yx|RRc*DD6 z#BsuLz~OV0W-1^`~cs^H}O8cjNis@;q&+`-ovNy zjN9qp8~7@|fcNmi|GGM?+7v&)xA9H9k1yl5@mu&jtC?jrJytV~kMI+Gi0|XO_y8Z^ zTlgBjf-mB8?mG@|c*7gs@P=nXBPMjh<2vAR`8=*tNs90je2DMkyZ8W~uzfVe5Abb# z6Yt~8_=N4lxS=}u2EK|f;5~fO0);lk5Abb#6VFOp86Uqup+)!!KE(I&T|A4Eus|UT z(IFZ{l_(G%k+eXUmzTP@xX}6exrW1`PESvDe0;1R2y}ROs8*|`{r!E_YBlZd?y6F$ zXlG|f#bQyLo14nza@yF~(E9qiR##UQU7Ow>9X;CrQ|>d7P+ZDw(WF9dG#V#mU0>3R zzY`YlEd5}9oJy@NbXjOHcxvr|{45=p|9Q>zj_ZGWEioN8=6q&u%oJrj=Kkha=aoO2 zmLB}uZW0en?PiW{=JVOcRk*RZ%Xin}Zu>4v?Kk}w?7z~8`H}L$?DH$LA@PyuEygwN rD`HBV_4cgpzR{NKyO!;np4wME=lp^;-Lz-+#>~!$DRD(y6Zgsww}Hy6 literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/unsaved.ico b/PowerEditor/src/icons/unsaved.ico new file mode 100644 index 0000000000000000000000000000000000000000..919f73ce4ed8ad3735a4b920795fdc9de023d276 GIT binary patch literal 1150 zcmZQzU<5(|0R|wcz>vYhz#zuJz@P!dKp~(AL>x#lH~{6)L2~l_|E{jL|4U0h{m;t! z5Cd~?T>FoXxwy{!7ZSSi-_-Q7-R-7@5}#7m;MLxA)1|? zpZ~{)L8=@bKZ5mx+<~rt^X8ZT@nMjDZ}0d2v$LOr{e`X{pWPriZ2H%(MYtcVfB@m? z`SX8q@q4)aF#Vt~K*zzs-~VI7$ohBf`h%el*_`0u{}^UeSAU1wzkffby@d3)wS57n z6;SxW^n>CBhCyKr!!R)z4e}4N{^Q3<3qO#5`uqRF?MK%SvIidk`3;n2LFpZo?#a;) z3UiQtQ2HlTKPbLI7-V;3-=AhZ;rg?<2~A1+9td=+gW7(|SKv7$l`N>DKZk*JAW z3;{J!VlXx_LQF_JfF6tl{D`6P&2bE zKHTr`#`Sv-aP`^+T<+?@#jaa8-_e22&Stb-=|)?7JI=HcoIFiXcbLFgOHf=zkYgjT z<$l76Q$uKO>4B%^60%(c=3D|3N04bD&}9;6^aRP8c_`Hc3gsLW2{TYB-ytq`8gc9d zSOtNc{f@120+yYESo{IPFhXm<>rcq#qX-Tf1sgw%@bF;-G5v^?_0qmxoI6{Cx~5j_ zt#5*(%8kN`8n|38xXNCkr(WrzbBMVB60f~u;P^ltlzX?*Q6he`N`Vxpl zB8Y@^PnlIVlV+^RS_S^K0{pjsth_4bZ>c>{eZ0IZhCg4+f*t#-EAo>9jGvqDfW&^# zZjJ{d5G*Xm2pA@WvoEm4v&pmdOKkC}R$&5~_9t((u>$&wqc@)zm~T4`1yn$lj^)?Q zN?crE(QKhi&!wt0XhX)Fvh o)a!E_8{7_=%8-DKYJHY{K|CH$!_h;o(%t)LJiqcK{x=fiH)8?O9smFU literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/userDefineDlg_off.ico b/PowerEditor/src/icons/userDefineDlg_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..c1bc22d649cf17428301b3046d812b46f90c5c61 GIT binary patch literal 4022 zcmeH~F-}535QYaZp)mrT9WNBd-k#?rxPn(8v3iN8ptSQC9Kb_RSXfF!EQssBjQlS1 zV0V3jmFvzjGduhJ%fK^1q$O=BioW>q+7`LOYf<<} z=;>`#VH18;=?hl4GM~@!>NnhGigVtB;m@c1@<0Bx14A_3xi@MqH;M1q4SXVqmxJBd z4Uh=--4cl~M!{ewMnRu?fT3VF_PJ9G>Ea8Pu-)(Z<>sCho`KVj$z*bL0d^2%@Q)=y zEFJJiqtP$2x}q&9LfLgc+V?f0WM_X$`Q-#2TK;_rV7f@H$^FoR8XD zseF~dih&Hq-r@#HpcKn>gFhx;fo8>3wLk2?`FtN%PP`k%Xh*H~i!Uw15{j z4tBL6=6T7)vdmx^vVd)GCPbid$fv^(nwcEOU>PRQzT7=>M&25M#(5Uec}R$G;}|W2 zW$0$2Gbse1kzk0s5ojFeZoX!=5NJj#!lzs_A$FCVq|;0&iLDp>NT_~1Ka(SrPm5GW zgd(RJY}JJtKyr>yD5v=7HO{Sv&MkU){Ce&kzbfX^{SfKmmrkdGLC{;vScy2xD%62h Qf?0xHLZgHhYyn%BpT@p_3;+NC literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/userDefineDlg_on.ico b/PowerEditor/src/icons/userDefineDlg_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..ce653b93dc2b6d8cd485fbe6e68b46d7c6446196 GIT binary patch literal 4022 zcmeH~u};G<5QeWUQWr#mo~94M6sga^02><*zyoxryh8_s80k_mR2;u; z!p?JZ!3>j@%O$RAfpsTlWnti@LTdVNe_DYFiq8Bgnj0P1`<$qNd80}KgeU&Vf-(GWLS!zkb9=lYyEo`GL()BB?fte8z#Wblt9 zAy_dqe|{ieXuh%Mw|@&h&5v~8`;b7S;5U~j0FfnpiQdk((h)E5t4bt$>kNk}a2Nr8 z9Zljk$F?CSIc0vSM0O7ByO;Ni#q;&UD`vA4VA^}F`e=SpB9jBGVPdv-#oL;X=L>L` zZw?%fs?03-Mq>XUS0;A|T6_&J*QW!}*`oMW4QZx6Qh(?3U2JEK9gr%viaE#d-9|VP z4&nQXm65>tO+j#rR&I<82Ka^`W$z}`$d_}<2Q85pBcAWj-sX?eo$nkwvyM-5Hr-CP zZGk(6qgBVBuGsWOApji-adDnHzW#Zwep$y0f#zt1_#%um=-x_5Dk+#|qmxiG*3W1o z4 c)#y1RgC8|=W&i*H literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/wrap.bmp b/PowerEditor/src/icons/wrap.bmp new file mode 100644 index 0000000000000000000000000000000000000000..adc317817a578c73185cf5f2809b681b84a8a2e4 GIT binary patch literal 1334 zcmeH_uWy4u6vw}8Z6AaExUK6-vySb88UH{NEON;V5{pD4vB=8FS|k!lf~u^X#3GTC z><(sHvdJl4^11K(-g|eKT%P;BnWBr$1b7u0`$2))7nEMQRptU!Rlyj8VHn_?!?tZW zjsw?qQI;i&_zj-t2^AzB_5$Dc5d;CkFvRCBL=;7+(g?MnN@LVnj4DfnCPKHU^DUbE z15F{>p)OK1dr5}okm2i)qitK{;w`Bo;~$JO@INy^f5ijQYPDP}<}!#3i-_}=XVYA- zALsO>S-NF*MszKSm_~O;*D=zLJPo`)ot&R3Goniw`n`VAKd@I9v+f86m44&)=DKhB IrGC2o4f7e-Z~y=R literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/wrap_dis.ico b/PowerEditor/src/icons/wrap_dis.ico new file mode 100644 index 0000000000000000000000000000000000000000..972af962b781c3f8c14b3dc150f19fd3011cfeeb GIT binary patch literal 3262 zcmeH|u};G<5QbebupqG^HafEN05GHjBo9!e_5ol?)>M_?4LWy)1@Qo(*&rSY6H_9Q z1*U`!jk**uAk6Q$YSXlJDuOp$o#oo+@6LB;hmZ<>)hbEb%@!d$80|x+ z5^Mi$5&_1T(pZ46)CAy3G7NlQ(J7K7@q@s1d);nVV&Zm`Cn$< zGP&oJ(kP0`a3p&v_2MW()kt(oE{WnS36XCX{_DCfa_yxN6Lzz`98$Q7Qqc{=Op}6) zBPm(97#Bh$3gB}SIK?FIlhov_NC<^X!US%d2o$pa=cg$2LA3(TSU;_IIvquZj*m~; z?Y84M?}LE~6X$1VSJ&5J7$WZ~_=wEoTt(TP7c4W3J#)q9|0n zgyJ(1hA+^`K}2D%*=J3}QH%!`a9ldW(1qKJoSZqy-z+?eW9o4@UUEDgz%F_&P{Qsy z{WLfcJWt`c%ec`3z79c!4r8xy>>1LBP{;#gpJc9p*(EYdD(rikvajtvrt{f$I_OtKVZlaXMU%jq;Y0oLOz`Ipyow`Z2)FQ7++1&e=fB^uN za)DtF{rl=d5FF1A?i*7NVfmuL(b>nvUQURU0z&sUY>;q~&mMYy=G{XLjFXOz=!W4Ed;l5v8%yxIFAE4L>6ph&}cCQ&dfv38&VsZn+#`4$45oaFa3VsYUZ;Nw6MKKQE^WX{HRbcA3X$rt4Jr#E z-Nhbrb|!2m)7hnU-Bv~549d~Vf+yc)`S*g56b`bVu+Z+mCN%gjkn9^dXC)575e~p@ zT~ke3*7sMqoW}$>Gw;YCOXhLIjP%uUi(CV4m^p`6T7}(MZNnGK>Vb*fQE#Z%)GJ`9 zQs2g~Sy^S_yLOGQ+70!N`oL$JbKT#+RQq^T8|bSg`peENbtceRSxe?4G0?a0162FK AssI20 literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/wrap_on.ico b/PowerEditor/src/icons/wrap_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..29535fbcafbf44b7003ec469dd0d76455ee4e07d GIT binary patch literal 3262 zcmeHJL5tH+5Pn6Pq;1+X6~vo8diMwDukxn5pwOat+C>xuQ4h)_p8|MlU$q(1tD5tQ43ta6{SD)uNWWJ_esed2fIaBGa;fIX3j;wC2htE6ap=2*_eC zwJ>GA0D^k6t=!X5hgq@9FjsH5;H6%oYR$su8#>DyZs*JaF6@uOS1#s7V*^~=A4NB0 zICymUcyQjFi&bFGD9#_Pq88g|c)U|`sfV$H$%ZL`H*O^y&?;^UE$c~v`Gz-6IAnXo zY0SylzYO@}6a}Qv(~r9to5`|?S%Go1lBbxam=>y!6qt2lV-ZGLqrnqYh-<&0(0>jyMe~xe?KzsRK4P?%Zf#BY=Ec_lI93lS05x+Rn zr(xo~m3lQm*)tEi+>7f85dVoBVqqZPk1@2R`Y>5B^cXjoamRmc5H!zlEolk_8BktLW4_4~+ApN|DR#!H3)%|la zA3!9lC~Z+n>(DB+0)0oRMW{C!T_=>182znOsH0S&b!ZE}u^e{SzeCpOS8|zl$OXhR Sj|e?8R*~8M!bA?*iP1l=CqGgE literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/xxxx.bmp b/PowerEditor/src/icons/xxxx.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ae0e7e86669012d0bab6e82fc9619d83b1495da8 GIT binary patch literal 822 zcma))p>D%46h$-b2L|^Eqb8L?S6B@N7B(=@tc8Vvfu$)k40ILbu#^Rc77iA6$8nT- zsXNuWwvy-L>*uHU`L%eBhOuD%V7`s>C3+v?(YWt^+`8MD%|OD~*dmU^v97A`?bh;XYJwWJT6iJ2<(EI5`k>&mtljThGW7YNIl&pP^_UOw zMqIG>rU)Ng zH1X%N^?&qI7w4|Byf}ZK$0~RbLwW$7&UuojEb#QtGdwj%m`iEkQ80}u2u!L)Ve;HI UUXs|BrdC0*wO;Gv(bRSQ0~AUT0ssI2 literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/zoomIn.bmp b/PowerEditor/src/icons/zoomIn.bmp new file mode 100644 index 0000000000000000000000000000000000000000..eb649e196fcfa9fad5c40dbb7da90d0dabd06a48 GIT binary patch literal 1334 zcmeH_J51a_6h$ut1c`tpKSF?fHeakH$ct7R)<~AH<0wK(Wy`Ynd$JBwlQrO&)9znZu(@2UEStGr&%{bc zu(Ar1BrZ&{$UsOM6EF;prbE*-$HZcA zqYjXCaJtDbG?19Okc$&Zjj!K#$2EY^E^Rur|KlBpzYmYcpC?E$JyIg^T(-VGlGeCS zBKWxbMyZyO)^|JJ{eq3opFz z!YiWzzKd_*Yxn{_i{HiXsHZLb2HwHP@jkwf_wXHj3-97xd>voJ=kRHK5^wMZZ}0|h z@CI*>9>+Py2}gk=6L=rr$9wn=zJ<55yXZQ)h|ZzY=p^$G@LhZZU&9yhS^O@32fu~i zz&rRjo_U*1d=;O^r|=G5_}T8zwE@11Z{TbA0zQl1#qZ#^=;j99bm(Rr@8kP;58uJJ z@GjoP*YQPs4xh#+?ROmB;0@m34c_2cP>%(j^KqT`-OJNOo! z<}7HCMiYUxS65fMyu8%K#f8q!&g8nTPESu&uh&(nR8%Y$ zwZFfwTrQ`*y*;JVX>D(BE167cZEa1ftE*aBS&{$E=>5BQzv*|X@|G?3llpV{FsQ}z z4`~YZHmJ!JzFLkiudi!Z4JuRi9SW)47eqJOoEmv4#i4YvJgEMVU2+XY7N;9(xT|LFIg_1#P@ zUkV#E2Ib0ZJO#?-hw&JcgPIoy;2@~^F(9g`wT%vqnH^d(pBN>Ev~;i0;T>bd@MELH lFH560dP4e)^u@jO`c5L1`PH~n%-l1n;pwLI%$W8I^Bv$ZUmgGe literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/zoomIn_on.ico b/PowerEditor/src/icons/zoomIn_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..66a55141b2cd566ac82f1fa3a583652f788bf625 GIT binary patch literal 2998 zcmeIzF-#h59LMn=wMjd8mi266S`M!H}DmF5r2T+ z$M52|@eba`Gj6+$uj9-39NxhTKfgMx+6dprx9|;o1z*G;;P>&ntmZbW>9CqM-p3E| z9=?a~;9b0nZ{n-?55AhzphwtEB z{F3dX5x$Ra;T!l0zKCD4eHhnM8(+tl@j1MMU$#J=8R7f*7QTUJrA-mPc!50QqyAU8l=*j&|r}3v_pPr<gr0DmzO#}KbPyeIy*a4v)Rq#D@yF?~UWPS0!#9>~ZEb06g%zopJc#Wb^02Jr*S-|RUk zIEc-spjKBSkj#TP$|JCmh&4_VPxAmU#Y83YProYvK7mD_A51X5g2#Dy{qgrb^Sez< zKVG0Iu^XQbd8o)9yB?=rzfVGh;iD;Jp-_@8h*FYm48qrNOE8nz%E`&u%F2_qm6erErcRzb zSvz^Mvb?o~EGRsC$*=GI{`byYI{4^TQB-#WuxL8?rhorrvB zp9}$G2m^-MY=$&uFx&uX5}-W}sfXxKBaFNVG9h?`lu#lInNx1|U5<*JKCHy!=u2KYi zPJIsJK*7)y+J-{kQSf|%DfodxBoRKD6k!^QF`sla;Wsf PZ>`lXTe`0O*stLW;abv` literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/zoomOut_off.ico b/PowerEditor/src/icons/zoomOut_off.ico new file mode 100644 index 0000000000000000000000000000000000000000..012b59a702bd4b32d3f859bb58ecfd5a54287e09 GIT binary patch literal 2998 zcmeIzF=!%r6vy$On}xk*v)7ttZ6@52Dv~z2D~**+Vs9&?v5L)Eh!6rAEK-Ioj^h|B zn_xOOg~Ao7rV18^LbxDWzA+WWJS) zKVC_jyk;`)O8WI1X?;!lj`IxpBbm}`o~0Ug9zO>Cb?&k~lB!oy>0HWJq-;UK1V6-g@GX1=U&J1e`}ke_Hr~Uh@r>K;;+yy~K8N?P z(SH_Rc;SUtK@@ z@P;?M;SFzicZ@i$IL83|F)A$fS z#s~NTzK8emKE92w;!F5EKI`^4yx|RRc*7f>35}T06}Ri0+g0Iq6$(;_AL9f30N=y= z_=M%734Vz0;9K|#zKBm)K8zcvi*Mq~_#EEDCp9Rr34Vz0;9Gb)ZAJX*1_c)4$M^t0 z!1wSpC!s+Bjp&k1vP|Ykk4$RN!^4B_?(TGZd#jt98(m*t>+lx9PWATZ_x(6IV{}B-Ur;#QIY?sXi|!)c;vo(ad*tmIj}m z&I3SoxqQF452xB%QT}odP8^7LW_o{Iub)NHXq-3@>t|GEXCltdW*}bY-E0(Jz-g?k z=`rP}x*LHHh()a4{I}|h39R~jH^KQgcv*MtS^V5Hzx&wqS;fymy|G-5fqMOA`3cmc zSXGX|aTKe|fO*8`HlOuuW14SJ_L1uvHMXnI%X_Z0LqwNumAu6 literal 0 HcmV?d00001 diff --git a/PowerEditor/src/icons/zoomOut_on.ico b/PowerEditor/src/icons/zoomOut_on.ico new file mode 100644 index 0000000000000000000000000000000000000000..102072166802c509a7f0716fc71a0683921e9f0a GIT binary patch literal 2998 zcmeIzF-+rT7{>7@$4S=#bF2o5%VN}uiHH^2F=WaD*|SDs$(E&=7!xT2Bf6ogDrd@q z!j>{5QU@mM29%*nBvh8jVmhhl-u@lq2!~i5s_KUJHD6-i^UHT1ufG^6r#H&yHx<<% zZ=_w`^ZDpX`sEvGV@>*&^E~4RMow>em73V3;!h`6O+wC_&G?O1PBj<|c#i^`|Hv#l zV{khbc{K!IW9Qr9ObzW@e_Q2AL9G?Xm%gnK{wDSjTCM8z^i-u%Nk>OVDijLZ-QCsJ)|NIlHWdD8`sw4xul{#xww)?=YPx35 z=8M`+hg{8^RK3n;=~{sA9M{>~TU;)mM6r92na6Qv{v2oJNt}`Yvsm+$9~>-AKHEtO zK)M`1EbhaO_EyAhQrp`RNOxxTu<1DK^K#ueNcD3b+o!13*JF^*`LxA(40cknW}C#% zc?4KNs#5u" or "\|" on RT 102-key kbd. + +#define VK_OEM_RESET 0xE9 +#define VK_OEM_JUMP 0xEA +#define VK_OEM_PA1 0xEB +#define VK_OEM_PA2 0xEC +#define VK_OEM_PA3 0xED +#define VK_OEM_WSCTRL 0xEE +#define VK_OEM_CUSEL 0xEF +#define VK_OEM_ATTN 0xF0 +#define VK_OEM_FINISH 0xF1 +#define VK_OEM_COPY 0xF2 +#define VK_OEM_AUTO 0xF3 +#define VK_OEM_ENLW 0xF4 +#define VK_OEM_BACKTAB 0xF5 +#define VK_ATTN 0xF6 +#define VK_CRSEL 0xF7 +#define VK_EXSEL 0xF8 +#define VK_EREOF 0xF9 +#define VK_PLAY 0xFA +#define VK_ZOOM 0xFB +#define VK_NONAME 0xFC +#define VK_PA1 0xFD +#define VK_OEM_CLEAR 0xFE \ No newline at end of file diff --git a/PowerEditor/src/langs.model.xml b/PowerEditor/src/langs.model.xml new file mode 100644 index 00000000..76ed65b1 --- /dev/null +++ b/PowerEditor/src/langs.model.xml @@ -0,0 +1,209 @@ + + + + + + + + add for lt tellTarget and function ne this break ge new typeof continue gt not var delete if on void do ifFrameLoaded onClipEvent while else in or with eq le return instanceof case default switch + arguments constructor class dynamic false extends implements import interface intrinsic newline null private public super static true undefined Accessibility Arguments Array Boolean Button Camera ContextMenu ContextMenuItem CustomActions Color Date Error Function Key LoadVars LocalConnection Math Microphone Mouse MovieClip MovieClipLoader NetConnection NetStream Number PrintJob Object TextField StyleSheet TextFormat TextSnapshot SharedObject Selection Sound Stage String System XML XMLNode XMLSocket Void abs acos asin atan atan2 ceil cos exp floor log max min pow random round sin sqrt tan onActivity onChanged onClose onConnect onData onDragOut onDragOver onEnterFrame onID3 onKeyDown onKeyUp onKillFocus onLoad onLoadComplete onLoadError onLoadInit onLoadProgress onLoadStart onMouseDown onMouseMove onMouseUp onMouseWheel onPress onRelease onReleaseOutside onResize onRollOut onRollOver onScroller onSelect onSetFocus onSoundComplete onStatus onUnload onUpdate onXML addListener addPage addProperty addRequestHeader allowDomain allowInsecureDomain appendChild apply applyChanges asfunction attachAudio attachMovie attachSound attachVideo beginFill beginGradientFill call ceil charAt charCodeAt clear clearInterval cloneNode close concat connect copy cos createElement createEmptyMovieClip createTextField createTextNode curveTo domain duplicateMovieClip endFill escape eval evaluate exp findText floor fscommand flush fromCharCode get getAscii getBeginIndex getBounds getBytesLoaded getBytesTotal getCaretIndex getCode getCount getDate getDay getDepth getEndIndex getFocus getFontList getFullYear getHours getInstanceAtDepth getLocal getMilliseconds getMinutes getMonth getNewTextFormat getNextHighestDepth getPan getProggress getProperty getRGB getSeconds getSelected getSelectedText getSize getStyle getStyleNames getSWFVersion getText getTextExtent getTextFormat getTextSnapshot getTime getTimer getTimezoneOffset getTransform getURL getUTCDate getUTCDay getUTCFullYear getUTCHours getUTCMilliseconds getUTCMinutes getUTCMonth getUTCSeconds getVersion getVolume getYear globalToLocal gotoAndPlay gotoAndStop hasChildNodes hide hideBuiltInItems hitTest hitTestTextNearPos indexOf insertBefore install isActive isDown isToggled join lastIndexOf lineStyle lineTo list load loadClip loadMovie loadMovieNum loadSound loadVariables loadVariablesNum localToGlobal log mbchr mblength mbord mbsubstring min MMExecute moveTo nextFrame nextScene parseCSS parseFloat parseInt parseXML pause play pop pow prevScene print printAsBitmap printAsBitmapNum printNum push random registerClass removeListener removeMovieClip removeNode removeTextField replaceSel replaceText reverse round seek send sendAndLoad setBufferTime set setDate setFocus setFullYear setGain setHours setInterval setMask setMilliseconds setMinutes setMode setMonth setMotionLevel setNewTextFormat setPan setProperty setQuality setRate setRGB setSeconds setSelectColor setSelected setSelection setSilenceLevel setStyle setTextFormat setTime setTransform setUseEchoSuppression setUTCDate setUTCFullYear setUTCHours setUTCMilliseconds setUTCMinutes setUTCMonth setUTCSeconds setVolume setYear shift show showSettings silenceLevel silenceTimeout sin slice sort sortOn splice split sqrt start startDrag stop stopAllSounds stopDrag substr substring swapDepths tan toggleHighQuality toLowerCase toString toUpperCase trace unescape uninstall unLoadClip unloadMovie unloadMovieNum unshift unwatch updateAfterEvent updateProperties useEchoSuppression valueOf watch endinitclip include initclip __proto__ _accProps _alpha _currentframe _droptarget _focusrect _framesloaded _global _height _highquality _level _lockroot _name _parent _quality _root _rotation _soundbuftime _target _totalframes _url _visible _width _x _xmouse _xscale _y _ymouse _yscale activityLevel align allowDomain allowInsecureDomain attributes autoSize avHardwareDisable background backgroundColor bandwidth blockIndent bold border borderColor bottomScroll bufferLenght bufferTime builtInItems bullet bytesLoaded bytesTotal callee caller capabilities caption childNodes color condenseWhite contentType currentFps customItems data deblocking docTypeDecl duration embedFonts enabled exactSettings firstChild focusEnabled font fps gain globalStyleFormat hasAccessibility hasAudio hasAudioEncoder hasEmbeddedVideo hasMP3 hasPrinting hasScreenBroadcast hasScreenPlayback hasStreamingAudio hasStreamingVideo hasVideoEncoder height hitArea hscroll html htmlText indent index italic instanceof int ignoreWhite isDebugger isDown isFinite italic language lastChild leading leftMargin length loaded localFileReadDisable manufacturer maxChars maxhscroll maxscroll menu message motionLevel motionTimeout mouseWheelEnabled multiline muted name names NaN nextSibling nodeName nodeType nodeValue os parentNode password pixelAspectRatio playerType previousSibling prototype quality rate restrict resolutionX resolutionY rightMargin scaleMode screenColor screenDPI screenResolutionX screenResolutionY scroll selectable separatorBefore showMenu size smoothing status styleSheet tabChildren tabEnabled tabIndex tabStops target targetPath text textColor textHeight textWidth time trackAsMenu type underline url useCodepage useEchoSuppression useHandCursor variable version visible width wordWrap xmlDecl + + + abort 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 is limited loop new not null of others out or package pragma private procedure protected raise range record renames requeue return reverse select separate subtype tagged task terminate then type until use when while with + + + 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 + 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 + $ ? @b @f addr basic byte c carry? dword far far16 fortran fword near near16 overflow? parity? pascal qword real4 real8 real10 sbyte sdword sign? stdcall sword syscall tbyte vararg word zero? flat near32 far32 abs all assumes at casemap common compact cpu dotname emulator epilogue error export expr16 expr32 farstack flat forceframe huge language large listing ljmp loadds m510 medium memory nearstack nodotname noemulator nokeyword noljmp nom510 none nonunique nooldmacros nooldstructs noreadonly noscoped nosignextend nothing notpublic oldmacros oldstructs os_dos para private prologue radix readonly req scoped setif2 smallstack tiny use16 use32 uses a16 a32 o16 o32 byte word dword nosplit $ $$ seq wrt flat large small .text .data .bss near far %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 + addpd addps addsd addss andpd andps andnpd andnps cmpeqpd cmpltpd cmplepd cmpunordpd cmpnepd cmpnltpd cmpnlepd cmpordpd cmpeqps cmpltps cmpleps cmpunordps cmpneps cmpnltps cmpnleps cmpordps cmpeqsd cmpltsd cmplesd cmpunordsd cmpnesd cmpnltsd cmpnlesd cmpordsd cmpeqss cmpltss cmpless cmpunordss cmpness cmpnltss cmpnless cmpordss comisd comiss cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtpi2ps cvtps2dq cvtps2pd cvtps2pi cvtss2sd cvtss2si cvtsd2si cvtsd2ss cvtsi2sd cvtsi2ss cvttpd2dq cvttpd2pi cvttps2dq cvttps2pi cvttsd2si cvttss2si divpd divps divsd divss fxrstor fxsave ldmxscr lfence mfence maskmovdqu maskmovdq maxpd maxps paxsd maxss minpd minps minsd minss movapd movaps movdq2q movdqa movdqu movhlps movhpd movhps movd movq movlhps movlpd movlps movmskpd movmskps movntdq movnti movntpd movntps movntq movq2dq movsd movss movupd movups mulpd mulps mulsd mulss orpd orps packssdw packsswb packuswb paddb paddsb paddw paddsw paddd paddsiw paddq paddusb paddusw pand pandn pause paveb pavgb pavgw pavgusb pdistib pextrw pcmpeqb pcmpeqw pcmpeqd pcmpgtb pcmpgtw pcmpgtd pf2id pf2iw pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pmachriw pmaddwd pmagw pmaxsw pmaxub pminsw pminub pmovmskb pmulhrwc pmulhriw pmulhrwa pmulhuw pmulhw pmullw pmuludq pmvzb pmvnzb pmvlzb pmvgezb pfnacc pfpnacc por prefetch prefetchw prefetchnta prefetcht0 prefetcht1 prefetcht2 pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pf2iw pinsrw psadbw pshufd pshufhw pshuflw pshufw psllw pslld psllq pslldq psraw psrad psrlw psrld psrlq psrldq psubb psubw psubd psubq psubsb psubsw psubusb psubusw psubsiw pswapd punpckhbw punpckhwd punpckhdq punpckhqdq punpcklbw punpcklwd punpckldq punpcklqdq pxor rcpps rcpss rsqrtps rsqrtss sfence shufpd shufps sqrtpd sqrtps sqrtsd sqrtss stmxcsr subpd subps subsd subss ucomisd ucomiss unpckhpd unpckhps unpcklpd unpcklps xorpd xorps + + + addhandler addressof andalso alias and ansi as assembly attribute auto begin boolean byref byte byval call case catch cbool cbyte cchar cdate cdec cdbl char cint class clng cobj compare const continue cshort csng cstr ctype currency date decimal declare default delegate dim do double each else elseif end enum erase error event exit explicit false finally for friend function get gettype global gosub goto handles if implement implements imports in inherits integer interface is let lib like load long loop lset me mid mod module mustinherit mustoverride mybase myclass namespace new next not nothing notinheritable notoverridable object on option optional or orelse overloads overridable overrides paramarray preserve private property protected public raiseevent readonly redim rem removehandler rset resume return select set shadows shared short single static step stop string structure sub synclock then throw to true try type typeof unload unicode until variant wend when while with withevents writeonly xor + + + and byref case continueloop dim do else elseif endfunc endif endselect exit exitloop for func global if local next not or return select step then to until wend while exit + abs acos adlibdisable adlibenable asc asin atan autoitsetoption autoitwingettitle autoitwinsettitle bitand bitnot bitor bitshift bitxor blockinput break call cdtray chr clipget clipput controlclick controlcommand controldisable controlenable controlfocus controlgetfocus controlgetpos controlgettext controlhide controlmove controlsend controlsettext controlshow cos dec dircopy dircreate dirmove dirremove drivegetdrive drivegetfilesystem drivegetlabel drivegetserial drivegettype drivesetlabel drivespacefree drivespacetotal drivestatus envget envset envupdate eval exp filechangedir fileclose filecopy filecreateshortcut filedelete fileexists filefindfirstfile filefindnextfile filegetattrib filegetlongname filegetshortname filegetsize filegettime filegetversion fileinstall filemove fileopen fileopendialog fileread filereadline filerecycle filerecycleempty filesavedialog fileselectfolder filesetattrib filesettime filewrite filewriteline guicreate guicreateex guidefaultfont guidelete guigetcontrolstate guihide guimsg guiread guirecvmsg guisendmsg guisetcontrol guisetcontroldata guisetcontrolex guisetcontrolfont guisetcontrolnotify guisetcoord guisetcursor guishow guiwaitclose guiwrite hex hotkeyset inidelete iniread iniwrite inputbox int isadmin isarray isdeclared isfloat isint isnumber isstring log memgetstats mod mouseclick mouseclickdrag mousedown mousegetcursor mousegetpos mousemove mouseup mousewheel msgbox number pixelchecksum pixelgetcolor pixelsearch processclose processexists processsetpriority processwait processwaitclose progressoff progresson progressset random regdelete regenumkey regenumval regread regwrite round run runasset runwait send seterror shutdown sin sleep soundplay soundsetwavevolume splashimageon splashoff splashtexton sqrt statusbargettext string stringaddcr stringformat stringinstr stringisalnum stringisalpha stringisascii stringisdigit stringisfloat stringisint stringislower stringisspace stringisupper stringisxdigit stringleft stringlen stringlower stringmid stringreplace stringright stringsplit stringstripcr stringstripws stringtrimleft stringtrimright stringupper tan timerstart timerstop tooltip traytip ubound urldownloadtofile winactivate winactive winclose winexists wingetcaretpos wingetclasslist wingetclientsize wingethandle wingetpos wingetstate wingettext wingettitle winkill winmenuselectitem winminimizeall winminimizeallundo winmove winsetontop winsetstate winsettitle winwait winwaitactive winwaitclose winwaitnotactive + @appdatacommondir @appdatadir @autoitversion @commonfilesdir @compiled @computername @comspec @cr @crlf @desktopcommondir @desktopdir @desktopheight @desktopwidth @documentscommondir @error @favoritescommondir @favoritesdir @homedrive @homepath @homeshare @hour @ipaddress1 @ipaddress2 @ipaddress3 @ipaddress4 @lf @logondnsdomain @logondomain @logonserver @mday @min @mon @mydocumentsdir @osbuild @oslang @osservicepack @ostype @osversion @programfilesdir @programscommondir @programsdir @scriptdir @scriptfullpath @scriptname @sec @startmenucommondir @startmenudir @startupcommondir @startupdir @sw_hide @sw_maximize @sw_minimize @sw_restore @sw_show @systemdir @tab @tempdir @userprofiledir @username @wday @windowsdir @workingdir @yday @year + {!} {#} {^} {{} {}} {+} {alt} {altdown} {altup} {appskey} {asc} {backspace} {browser_back} {browser_favorites} {browser_forward} {browser_home} {browser_refresh} {browser_search} {browser_stop} {bs} {capslock} {ctrlbreak} {ctrldown} {ctrlup} {del} {delete} {down} {end} {enter} {esc} {escape} {f1} {f10} {f11} {f12} {f2} {f3} {f4} {f5} {f6} {f7} {f8} {f9} {home} {ins} {insert} {lalt} {launch_app1} {launch_app2} {launch_mail} {launch_media} {lctrl} {left} {lshift} {lwin} {lwindown} {media_next} {media_play_pause} {media_prev} {media_stop} {numlock} {numpad0} {numpad1} {numpad2} {numpad3} {numpad4} {numpad5} {numpad6} {numpad7} {numpad8} {numpad9} {numpadadd} {numpaddiv} {numpaddot} {numpadenter} {numpadmult} {numpadsub} {pause} {pgdn} {pgup} {printscreen} {ralt} {rctrl} {right} {rshift} {rwin} {rwindown} {scrolllock} {shiftdown} {shiftup} {sleep} {space} {tab} {up} {volume_down} {volume_mute} {volume_up} + #include #include-once + #region #endregion + + + + 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 + + + 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 + + + if else switch case default break goto return for while do continue typedef sizeof NULL + void struct union enum char short int long double float signed unsigned const static extern auto register volatile + + + and as assert asr begin class constraint do done downto else end exception external false for fun function functor if in include inherit initializer land lazy let lor lsl lsr lxor match method mod module mutable new object of open or private rec sig struct then to true try type val virtual when while with + option Some None ignore ref lnot succ pred + array bool char float int list string unit + + + add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_subdirectory add_test aux_source_directory build_command build_name cmake_minimum_required configure_file create_test_sourcelist else elseif enable_language enable_testing endforeach endif endmacro endwhile exec_program execute_process export_library_dependencies file find_file find_library find_package find_path find_program fltk_wrap_ui foreach get_cmake_property get_directory_property get_filename_component get_source_file_property get_target_property get_test_property if include include_directories include_external_msproject include_regular_expression install install_files install_programs install_targets link_directories link_libraries list load_cache load_command macro make_directory mark_as_advanced math message option output_required_files project qt_wrap_cpp qt_wrap_ui remove remove_definitions separate_arguments set set_directory_properties set_source_files_properties set_target_properties set_tests_properties site_name source_group string subdir_depends subdirs target_link_libraries try_compile try_run use_mangled_mesa utility_source variable_requires vtk_make_instantiator vtk_wrap_java vtk_wrap_python vtk_wrap_tcl while write_file + ABSOLUTE ABSTRACT ADDITIONAL_MAKE_CLEAN_FILES ALL AND APPEND ARGS ASCII BEFORE CACHE CACHE_VARIABLES CLEAR COMMAND COMMANDS COMMAND_NAME COMMENT COMPARE COMPILE_FLAGS COPYONLY DEFINED DEFINE_SYMBOL DEPENDS DOC EQUAL ESCAPE_QUOTES EXCLUDE EXCLUDE_FROM_ALL EXISTS EXPORT_MACRO EXT EXTRA_INCLUDE FATAL_ERROR FILE FILES FORCE FUNCTION GENERATED GLOB GLOB_RECURSE GREATER GROUP_SIZE HEADER_FILE_ONLY HEADER_LOCATION IMMEDIATE INCLUDES INCLUDE_DIRECTORIES INCLUDE_INTERNALS INCLUDE_REGULAR_EXPRESSION LESS LINK_DIRECTORIES LINK_FLAGS LOCATION MACOSX_BUNDLE MACROS MAIN_DEPENDENCY MAKE_DIRECTORY MATCH MATCHALL MATCHES MODULE NAME NAME_WE NOT NOTEQUAL NO_SYSTEM_PATH OBJECT_DEPENDS OPTIONAL OR OUTPUT OUTPUT_VARIABLE PATH PATHS POST_BUILD POST_INSTALL_SCRIPT PREFIX PREORDER PRE_BUILD PRE_INSTALL_SCRIPT PRE_LINK PROGRAM PROGRAM_ARGS PROPERTIES QUIET RANGE READ REGEX REGULAR_EXPRESSION REPLACE REQUIRED RETURN_VALUE RUNTIME_DIRECTORY SEND_ERROR SHARED SOURCES STATIC STATUS STREQUAL STRGREATER STRLESS SUFFIX TARGET TOLOWER TOUPPER VAR VARIABLES VERSION WIN32 WRAP_EXCLUDE WRITE APPLE MINGW MSYS CYGWIN BORLAND WATCOM MSVC MSVC_IDE MSVC60 MSVC70 MSVC71 MSVC80 CMAKE_COMPILER_2005 OFF ON + + + + if else switch case default break goto return for while do continue typedef sizeof NULL new delete throw try catch namespace operator this const_cast static_cast dynamic_cast reinterpret_cast true false using typeid and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq + void struct union enum char short int long double float signed unsigned const static extern auto register volatile bool class private protected public friend inline template virtual asm explicit typename mutable + a addindex addtogroup anchor arg attention author b brief bug c class code date def defgroup deprecated dontinclude e em endcode endhtmlonly endif endlatexonly endlink endverbatim enum example exception f$ f[ f] file fn hideinitializer htmlinclude htmlonly if image include ingroup internal invariant interface latexonly li line link mainpage name namespace nosubgrouping note overload p page par param post preref relates remarks return retval sa section see showinitializer since skip skipline struct subsection test throw throws todo typedef union until var verbatim verbinclude version warning weakgroup $ @ \ & < > # { } + + + 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 + bool byte char class const decimal double enum float int long sbyte short static string struct uint ulong ushort void + + + azimuth background background-attachment background-color background-image background-position background-repeat border border-bottom border-bottom-color border-bottom-style border-bottom-width border-collapse border-color border-left border-left-color border-left-style border-left-width border-right border-right-color border-right-style border-right-width border-spacing border-style border-top border-top-color border-top-style border-top-width border-width bottom caption-side clear clip color content counter-increment counter-reset cue cue-after cue-before cursor direction display elevation empty-cells float font font-family font-size font-size-adjust font-stretch font-style font-variant font-weight height left letter-spacing line-height list-style list-style-image list-style-position list-style-type margin margin-bottom margin-left margin-right margin-top marker-offset marks max-height max-width min-height min-width orphans outline outline-color outline-style outline-width overflow padding padding-bottom padding-left padding-right padding-top page page-break-after page-break-before page-break-inside pause pause-after pause-before pitch pitch-range play-during position quotes richness right size speak speak-header speak-numeral speak-ponctuation speech-rate stress table-layout text-align text-decoration text-indent text-shadow text-transform top unicode-bidi vertical-align visibility voice-family volume white-space widows width word-spacing z-index + active after before first first-child first-letter first-line focus hover lang left link right visited + + + + + access action advance allocatable allocate apostrophe assign assignment associate asynchronous backspace bind blank blockdata call case character class close common complex contains continue cycle data deallocate decimal delim default dimension direct do dowhile double doubleprecision else elseif elsewhere encoding end endassociate endblockdata enddo endfile endforall endfunction endif endinterface endmodule endprogram endselect endsubroutine endtype endwhere entry eor equivalence err errmsg exist exit external file flush fmt forall form format formatted function go goto id if implicit in include inout integer inquire intent interface intrinsic iomsg iolength iostat kind len logical module name named namelist nextrec nml none nullify number only open opened operator optional out pad parameter pass pause pending pointer pos position precision print private program protected public quote read readwrite real rec recl recursive result return rewind save select selectcase selecttype sequential sign size stat status stop stream subroutine target then to type unformatted unit use value volatile wait where while write + abs achar acos acosd adjustl adjustr aimag aimax0 aimin0 aint ajmax0 ajmin0 akmax0 akmin0 all allocated alog alog10 amax0 amax1 amin0 amin1 amod anint any asin asind associated atan atan2 atan2d atand bitest bitl bitlr bitrl bjtest bit_size bktest break btest cabs ccos cdabs cdcos cdexp cdlog cdsin cdsqrt ceiling cexp char clog cmplx conjg cos cosd cosh count cpu_time cshift csin csqrt dabs dacos dacosd dasin dasind datan datan2 datan2d datand date date_and_time dble dcmplx dconjg dcos dcosd dcosh dcotan ddim dexp dfloat dflotk dfloti dflotj digits dim dimag dint dlog dlog10 dmax1 dmin1 dmod dnint dot_product dprod dreal dsign dsin dsind dsinh dsqrt dtan dtand dtanh eoshift epsilon errsns exp exponent float floati floatj floatk floor fraction free huge iabs iachar iand ibclr ibits ibset ichar idate idim idint idnint ieor ifix iiabs iiand iibclr iibits iibset iidim iidint iidnnt iieor iifix iint iior iiqint iiqnnt iishft iishftc iisign ilen imax0 imax1 imin0 imin1 imod index inint inot int int1 int2 int4 int8 iqint iqnint ior ishft ishftc isign isnan izext jiand jibclr jibits jibset jidim jidint jidnnt jieor jifix jint jior jiqint jiqnnt jishft jishftc jisign jmax0 jmax1 jmin0 jmin1 jmod jnint jnot jzext kiabs kiand kibclr kibits kibset kidim kidint kidnnt kieor kifix kind kint kior kishft kishftc kisign kmax0 kmax1 kmin0 kmin1 kmod knint knot kzext lbound leadz len len_trim lenlge lge lgt lle llt log log10 logical lshift malloc matmul max max0 max1 maxexponent maxloc maxval merge min min0 min1 minexponent minloc minval mod modulo mvbits nearest nint not nworkers number_of_processors pack popcnt poppar precision present product radix random random_number random_seed range real repeat reshape rrspacing rshift scale scan secnds selected_int_kind selected_real_kind set_exponent shape sign sin sind sinh size sizeof sngl snglq spacing spread sqrt sum system_clock tan tand tanh tiny transfer transpose trim ubound unpack verify + cdabs cdcos cdexp cdlog cdsin cdsqrt cotan cotand dcmplx dconjg dcotan dcotand decode dimag dll_export dll_import doublecomplex dreal dvchk encode find flen flush getarg getcharqq getcl getdat getenv gettim hfix ibchng identifier imag int1 int2 int4 intc intrup invalop iostat_msg isha ishc ishl jfix lacfar locking locnear map nargs nbreak ndperr ndpexc offset ovefl peekcharqq precfill prompt qabs qacos qacosd qasin qasind qatan qatand qatan2 qcmplx qconjg qcos qcosd qcosh qdim qexp qext qextd qfloat qimag qlog qlog10 qmax1 qmin1 qmod qreal qsign qsin qsind qsinh qsqrt qtan qtand qtanh ran rand randu rewrite segment setdat settim system timer undfl unlock union val virtual volatile zabs zcos zexp zlog zsin zsqrt + + + as case class data default deriving do else hiding if import in infix infixl infixr instance let module newtype of proc qualified rec then type where _ + + + !doctype a abbr accept-charset accept accesskey acronym action address align alink alt applet archive area axis b background base basefont bdo bgcolor big blockquote body border br button caption cellpadding cellspacing center char charoff charset checkbox checked cite class classid clear code codebase codetype col colgroup color cols colspan comment compact content coords data datafld dataformatas datapagesize datasrc datetime dd declare defer del dfn dir disabled div dl dt em embed enctype event face fieldset file font for form frame frameborder frameset h1 h2 h3 h4 h5 h6 head headers height hidden hr href hreflang hspace html http-equiv i id iframe image img input ins isindex ismap kbd label lang language leftmargin legend li link longdesc map marginwidth marginheight maxlength media menu meta method multiple name noframes nohref noresize noscript noshade nowrap object ol onblur onchange onclick ondblclick onfocus onkeydown onkeypress onkeyup onload onmousedown onmousemove onmouseover onmouseout onmouseup optgroup option onreset onselect onsubmit onunload p param password profile pre prompt public q radio readonly rel reset rev rows rowspan rules s samp scheme scope script scrolling select selected shape size small span src standby start strike strong style sub submit summary sup tabindex table target tbody td text textarea tfoot th thead title topmargin tr tt type u ul usemap valign value valuetype var version vlink vspace width xml xmlns + + + + + code components custommessages dirs files icons ini installdelete langoptions languages messages registry run setup types tasks uninstalldelete uninstallrun _istool + allowcancelduringinstall allownoicons allowrootdirectory allowuncpath alwaysrestart alwaysshowcomponentslist alwaysshowdironreadypage alwaysshowgrouponreadypage alwaysusepersonalgroup appcomments appcontact appcopyright appenddefaultdirname appenddefaultgroupname appid appmodifypath appmutex appname apppublisher apppublisherurl appreadmefile appsupporturl appupdatesurl appvername appversion architecturesallowed architecturesinstallin64bitmode backcolor backcolor2 backcolordirection backsolid changesassociations changesenvironment compression copyrightfontname copyrightfontsize createappdir createuninstallregkey defaultdirname defaultgroupname defaultuserinfoname defaultuserinfoorg defaultuserinfoserial dialogfontname dialogfontsize direxistswarning disabledirpage disablefinishedpage disableprogramgrouppage disablereadymemo disablereadypage disablestartupprompt diskclustersize diskslicesize diskspanning enablesdirdoesntexistwarning encryption extradiskspacerequired flatcomponentslist infoafterfile infobeforefile internalcompresslevel languagedetectionmethod languagecodepage languageid languagename licensefile mergeduplicatefiles minversion onlybelowversion outputbasefilename outputdir outputmanifestfile password privilegesrequired reservebytes restartifneededbyrun setupiconfile showcomponentsizes showlanguagedialog showtaskstreelines slicesperdisk solidcompression sourcedir timestamprounding timestampsinutc titlefontname titlefontsize touchdate touchtime uninstallable uninstalldisplayicon uninstalldisplayname uninstallfilesdir uninstalllogmode uninstallrestartcomputer updateuninstalllogappname usepreviousappdir usepreviousgroup useprevioussetuptype useprevioustasks useprevioususerinfo userinfopage usesetupldr versioninfocompany versioninfocopyright versioninfodescription versioninfotextversion versioninfoversion welcomefontname welcomefontsize windowshowcaption windowstartmaximized windowresizable windowvisible wizardimagebackcolor wizardimagefile wizardimagestretch wizardsmallimagefile + afterinstall attribs beforeinstall check comment components copymode description destdir destname excludes extradiskspacerequired filename flags fontinstall groupdescription hotkey infoafterfile infobeforefile iconfilename iconindex key languages licensefile messagesfile minversion name onlybelowversion parameters permissions root runonceid section source statusmsg string subkey tasks type types valuedata valuename valuetype workingdir + append define dim else emit endif endsub error expr file for if ifdef ifexist ifndef ifnexist include insert pragma sub undef + begin break case const continue do downto else end except finally for function if of procedure repeat then to try until uses var while with + + + + instanceof assert if else switch case default break goto return for while do continue new throw throws try catch finally this super extends implements import true false null + package transient strictfp void char short int long double float const static volatile byte boolean class interface native private protected public final abstract synchronized enum + + + abstract boolean break byte case catch char class const continue debugger default delete do double else enum export extends final finally float for function goto if implements import in instanceof int interface long native new package private protected public return short static super switch synchronized this throw throws transient try typeof var void volatile while with true false prototype + + + ? and beep big break call cd cls color cookie1 copy debug del dim display do until exit flushkb for each next function endfunction get gets global go gosub goto if else endif md or password play quit rd redim return run select case endselect set setl setm settime shell sleep small use while loop + abs addkey addprinterconnection addprogramgroup addprogramitem asc ascan at backupeventlog box cdbl chr cint cleareventlog close comparefiletimes createobject cstr dectohex delkey delprinterconnection delprogramgroup delprogramitem deltree delvalue dir enumgroup enumipinfo enumkey enumlocalgroup enumvalue execute exist existkey expandenvironmentvars fix formatnumber freefilehandle getdiskspace getfileattr getfilesize getfiletime getfileversion getobject iif ingroup instr instrrev int isdeclared join kbhit keyexist lcase left len loadhive loadkey logevent logoff ltrim memorysize messagebox open readline readprofilestring readtype readvalue redirectoutput right rnd round rtrim savekey sendkeys sendmessage setascii setconsole setdefaultprinter setfileattr setfocus setoption setsystemstate settitle setwallpaper showprogramgroup shutdown sidtoname split srnd substr trim ubound ucase unloadhive val vartype vartypename writeline writeprofilestring writevalue + address build color comment cpu crlf csd curdir date day domain dos error fullname homedir homedrive homeshr hostname inwin ipaddress0 ipaddress1 ipaddress2 ipaddress3 kix lanroot ldomain ldrive lm logonmode longhomedir lserver maxpwage mdayno mhz monthno month msecs pid primarygroup priv productsuite producttype pwage ras result rserver scriptdir scriptexe scriptname serror sid site startdir syslang ticks time userid userlang wdayno wksta wuserid ydayno year + + + not defun + - * / = < > <= >= princ eval apply funcall quote identity function complement backquote lambda set setq setf defun defmacro gensym make symbol intern symbol name symbol value symbol plist get getf putprop remprop hash make array aref car cdr caar cadr cdar cddr caaar caadr cadar caddr cdaar cdadr cddar cdddr caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr cons list append reverse last nth nthcdr member assoc subst sublis nsubst nsublis remove length list length mapc mapcar mapl maplist mapcan mapcon rplaca rplacd nconc delete atom symbolp numberp boundp null listp consp minusp zerop plusp evenp oddp eq eql equal cond case and or let l if prog prog1 prog2 progn go return do dolist dotimes catch throw error cerror break continue errset baktrace evalhook truncate float rem min max abs sin cos tan expt exp sqrt random logand logior logxor lognot bignums logeqv lognand lognor logorc2 logtest logbitp logcount integer length nil + + + and break do else elseif end false for function if in local nil not or repeat return then true until while + _VERSION assert collectgarbage dofile error gcinfo loadfile loadstring print tonumber tostring type unpack _ALERT _ERRORMESSAGE _INPUT _PROMPT _OUTPUT _STDERR _STDIN _STDOUT call dostring foreach foreachi getn globals newtype rawget rawset require sort tinsert tremove _G getfenv getmetatable ipairs loadlib next pairs pcall rawegal rawget rawset require setfenv setmetatable xpcall string table math coroutine io os debug + abs acos asin atan atan2 ceil cos deg exp floor format frexp gsub ldexp log log10 max min mod rad random randomseed sin sqrt strbyte strchar strfind strlen strlower strrep strsub strupper tan string.byte string.char string.dump string.find string.len string.lower string.rep string.sub string.upper string.format string.gfind string.gsub table.concat table.foreach table.foreachi table.getn table.sort table.insert table.remove table.setn math.abs math.acos math.asin math.atan math.atan2 math.ceil math.cos math.deg math.exp math.floor math.frexp math.ldexp math.log math.log10 math.max math.min math.mod math.pi math.rad math.random math.randomseed math.sin math.sqrt math.tan + openfile closefile readfrom writeto appendto remove rename flush seek tmpfile tmpname read write clock date difftime execute exit getenv setlocale time coroutine.create coroutine.resume coroutine.status coroutine.wrap coroutine.yield io.close io.flush io.input io.lines io.open io.output io.read io.tmpfile io.type io.write io.stdin io.stdout io.stderr os.clock os.date os.difftime os.execute os.exit os.getenv os.remove os.rename os.setlocale os.time os.tmpname + + + + + break case catch continue else elseif end for function global if otherwise persistent return switch try while + + + + + Abort AddBrandingImage AddSize AllowRootDirInstall AllowSkipFiles AutoCloseWindow BGFont BGGradient BrandingText BringToFront Call CallInstDLL Caption ChangeUI CheckBitmap ClearErrors CompletedText ComponentText CopyFiles CRCCheck CreateDirectory CreateFont CreateShortCut Delete DeleteINISec DeleteINIStr DeleteRegKey DeleteRegValue DetailPrint DetailsButtonText DirShow DirText DirVar DirVerify DisabledBitmap EnabledBitmap EnableWindow EnumRegKey EnumRegValue Exch Exec ExecShell ExecWait ExpandEnvStrings File FileBufSize FileClose FileErrorText FileOpen FileRead FileReadByte FileSeek FileWrite FileWriteByte FindClose FindFirst FindNext FindWindow FlushINI Function FunctionEnd GetCurInstType GetCurrentAddress GetDlgItem GetDLLVersion GetDLLVersionLocal GetErrorLevel GetFileTime GetFileTimeLocal GetFullPathName GetFunctionAddress GetInstDirError GetLabelAddress GetTempFileName Goto HideWindow Icon IfAbort IfErrors IfFileExists IfRebootFlag IfSilent InitPluginsDir InstallButtonText InstallColors InstallDir InstallDirRegKey InstProgressFlags InstType InstTypeGetText InstTypeSetText IntCmp IntCmpU IntFmt IntOp IsWindow LangString LangStringUP LicenseBkColor LicenseData LicenseForceSelection LicenseLangString LicenseText LoadLanguageFile LockWindow LogSet LogText MessageBox MiscButtonText Name OutFile Page PageEx PageExEnd PluginDir Pop Push Quit ReadEnvStr ReadINIStr ReadRegDWORD ReadRegStr Reboot RegDLL Rename RequestExecutionLevel ReserveFile Return RMDir SearchPath Section SectionDivider SectionEnd SectionGetFlags SectionGetInstTypes SectionGetSize SectionGetText SectionGroup SectionGroupEnd SectionIn SectionSetFlags SectionSetInstTypes SectionSetSize SectionSetText SendMessage SetAutoClose SetBrandingImage SetCompress SetCompressionLevel SetCompressor SetCompressorDictSize SetCtlColors SetCurInstType SetDatablockOptimize SetDateSave SetDetailsPrint SetDetailsView SetErrorLevel SetErrors SetFileAttributes SetFont SetOutPath SetOverwrite SetPluginUnload SetRebootFlag SetShellVarContext SetSilent SetStaticBkColor ShowInstDetails ShowUninstDetails ShowWindow SilentInstall SilentUnInstall Sleep SpaceTexts StrCmp StrCmpS StrCpy StrLen SubSection SubSectionEnd UninstallButtonText UninstallCaption UninstallEXEName UninstallIcon UninstallSubCaption UninstallText UninstPage UnRegDLL Var VIAddVersionKey VIProductVersion WindowIcon WriteINIStr WriteRegBin WriteRegDWORD WriteRegExpandStr WriteRegStr WriteUninstaller XPStyle !AddIncludeDir !AddPluginDir !appendfile !cd !define !delfile !echo !else !endif !error !execute !ifdef !ifmacrodef !ifmacrondef !ifndef !include !insertmacro !macro !macroend !packhdr !system !tempfile !undef !verbose !warning + $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 $R0 $R1 $R2 $R3 $R4 $R5 $R6 $R7 $R8 $R9 $APPDATA $CMDLINE $DESKTOP $EXEDIR $HWNDPARENT $INSTDIR $OUTDIR $PROGRAMFILES ${NSISDIR} $\n $\r $QUICKLAUNCH $SMPROGRAMS $SMSTARTUP $STARTMENU $SYSDIR $TEMP $WINDIR + ARCHIVE FILE_ATTRIBUTE_ARCHIVE FILE_ATTRIBUTE_HIDDEN FILE_ATTRIBUTE_NORMAL FILE_ATTRIBUTE_OFFLINE FILE_ATTRIBUTE_READONLY FILE_ATTRIBUTE_SYSTEM FILE_ATTRIBUTE_TEMPORARY HIDDEN HKCC HKCR HKCU HKDD HKEY_CLASSES_ROOT HKEY_CURRENT_CONFIG HKEY_CURRENT_USER HKEY_DYN_DATA HKEY_LOCAL_MACHINE HKEY_PERFORMANCE_DATA HKEY_USERS HKLM HKPD HKU IDABORT IDCANCEL IDIGNORE IDNO IDOK IDRETRY IDYES MB_ABORTRETRYIGNORE MB_DEFBUTTON1 MB_DEFBUTTON2 MB_DEFBUTTON3 MB_DEFBUTTON4 MB_ICONEXCLAMATION MB_ICONINFORMATION MB_ICONQUESTION MB_ICONSTOP MB_OK MB_OKCANCEL MB_RETRYCANCEL MB_RIGHT MB_SETFOREGROUND MB_TOPMOST MB_YESNO MB_YESNOCANCEL NORMAL OFFLINE READONLY SW_SHOWMAXIMIZED SW_SHOWMINIMIZED SW_SHOWNORMAL SYSTEM TEMPORARY auto colored false force hide ifnewer nevershow normal off on show silent silentlog smooth true try + + + + if else switch case default break goto return for while do continue typedef sizeof NULL self super nil NIL + interface implementation protocol end private protected public class selector encode defs + void struct union enum char short int long double float signed unsigned const static extern auto register volatile id Class SEL IMP BOOL + oneway in out inout bycopy byref + + + and array asm begin case cdecl class const constructor default destructor div do downto else end end. except exit exports external far file finalization finally for function goto if implementation in index inherited initialization inline interface label library message mod near nil not object of on or out overload override packed pascal private procedure program property protected public published raise read record register repeat resourcestring safecall set shl shr stdcall stored string then threadvar to try type unit until uses var virtual while with write xor + + + 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 + + + and or xor __file__ __line__ array as break case cfunction class const continue declare default die do echo else elseif empty enddeclare endfor endforeach endif endswitch endwhile eval exit extends for foreach function global if include include_once isset list new old_function print require require_once return static switch unset use var while __function__ __class__ php_version php_os default_include_path pear_install_dir pear_extension_dir php_extension_dir php_bindir php_libdir php_datadir php_sysconfdir php_localstatedir php_config_file_path php_output_handler_start php_output_handler_cont php_output_handler_end e_error e_warning e_parse e_notice e_core_error e_core_warning e_compile_error e_compile_warning e_user_error e_user_warning e_user_notice e_all true false bool boolean int integer float double real string array object resource null class extends parent stdclass directory __sleep __wakeup interface implements abstract public protected private + + + $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 + GlobalFontDirectory ISOLatin1Encoding SharedFontDirectory UserObject arct colorimage cshow currentblackgeneration currentcacheparams currentcmykcolor currentcolor currentcolorrendering currentcolorscreen currentcolorspace currentcolortransfer currentdevparams currentglobal currentgstate currenthalftone currentobjectformat currentoverprint currentpacking currentpagedevice currentshared currentstrokeadjust currentsystemparams currentundercolorremoval currentuserparams defineresource defineuserobject deletefile execform execuserobject filenameforall fileposition filter findencoding findresource gcheck globaldict glyphshow gstate ineofill infill instroke inueofill inufill inustroke languagelevel makepattern packedarray printobject product realtime rectclip rectfill rectstroke renamefile resourceforall resourcestatus revision rootfont scheck selectfont serialnumber setbbox setblackgeneration setcachedevice2 setcacheparams setcmykcolor setcolor setcolorrendering setcolorscreen setcolorspace setcolortranfer setdevparams setfileposition setglobal setgstate sethalftone setobjectformat setoverprint setpacking setpagedevice setpattern setshared setstrokeadjust setsystemparams setucacheparams setundercolorremoval setuserparams setvmthreshold shareddict startjob uappend ucache ucachestatus ueofill ufill undef undefinefont undefineresource undefineuserobject upath ustroke ustrokepath vmreclaim writeobject xshow xyshow yshow + cliprestore clipsave composefont currentsmoothness findcolorrendering setsmoothness shfill + .begintransparencygroup .begintransparencymask .bytestring .charboxpath .currentaccuratecurves .currentblendmode .currentcurvejoin .currentdashadapt .currentdotlength .currentfilladjust2 .currentlimitclamp .currentopacityalpha .currentoverprintmode .currentrasterop .currentshapealpha .currentsourcetransparent .currenttextknockout .currenttexturetransparent .dashpath .dicttomark .discardtransparencygroup .discardtransparencymask .endtransparencygroup .endtransparencymask .execn .filename .filename .fileposition .forceput .forceundef .forgetsave .getbitsrect .getdevice .inittransparencymask .knownget .locksafe .makeoperator .namestring .oserrno .oserrorstring .peekstring .rectappend .runandhide .setaccuratecurves .setblendmode .setcurvejoin .setdashadapt .setdebug .setdefaultmatrix .setdotlength .setfilladjust2 .setlimitclamp .setmaxlength .setopacityalpha .setoverprintmode .setrasterop .setsafe .setshapealpha .setsourcetransparent .settextknockout .settexturetransparent .stringbreak .stringmatch .tempfile .type1decrypt .type1encrypt .type1execchar .unread arccos arcsin copydevice copyscanlines currentdevice finddevice findlibfile findprotodevice flushpage getdeviceprops getenv makeimagedevice makewordimagedevice max min putdeviceprops setdevice + + + + + and as assert break class continue def del elif else except exec finally for from global if import in is lambda None not or pass print raise return triple try while with yield + + + ACCELERATORS ALT AUTO3STATE AUTOCHECKBOX AUTORADIOBUTTON BEGIN BITMAP BLOCK BUTTON CAPTION CHARACTERISTICS CHECKBOX CLASS COMBOBOX CONTROL CTEXT CURSOR DEFPUSHBUTTON DIALOG DIALOGEX DISCARDABLE EDITTEXT END EXSTYLE FONT GROUPBOX ICON LANGUAGE LISTBOX LTEXT MENU MENUEX MENUITEM MESSAGETABLE POPUP PUSHBUTTON RADIOBUTTON RCDATA RTEXT SCROLLBAR SEPARATOR SHIFT STATE3 STRINGTABLE STYLE TEXTINCLUDE VALUE VERSION VERSIONINFO VIRTKEY + + + __FILE__ and def end in or self unless __LINE__ begin defined? ensure module redo super until BEGIN break do false next rescue then when END case else for nil retry true while alias class elsif if not return undef yield + + + + - * / = < > <= >= => abs acos and angle append apply asin assoc assoc assq assv atan begin boolean? caar cadr call-with-current-continuation call/cc call-with-input-file call-with-output-file call-with-values car cdr caar cadr cdar cddr caaar caadr cadar caddr cdaar cdadr cddar cdddr caaaar caaadr caadar caaddr cadaar cadadr caddar cadddr cdaaar cdaadr cdadar cdaddr cddaar cddadr cdddar cddddr case ceiling char->integer char-alphabetic? char-ci<=? char-ci<? char-ci=? char-ci>=? char-ci>? char-downcase char-lower-case? char-numeric? char-ready? char-upcase char-upper-case? char-whitespace? char<=? char<? char=? char>=? char>? char? close-input-port close-output-port complex? cond cons cos current-input-port current-output-port define define-syntax delay denominator display do dynamic-wind else eof-object? eq? equal? eqv? eval even? exact->inexact exact? exp expt floor for-each force gcd if imag-part inexact->exact inexact? input-port? integer->char integer? interaction-environment lambda lcm length let let* let-syntax letrec letrec-syntax list list->string list->vector list-ref list-tail list? load log magnitude make-polar make-rectangular make-string make-vector map max member memq memv min modulo negative? newline not null-environment null? number->string number? numerator odd? open-input-file open-output-file or output-port? pair? peek-char input-port? output-port? positive? procedure? quasiquote quote quotient rational? rationalize read read-char real-part real? remainder reverse round scheme-report-environment set! set-car! set-cdr! sin sqrt string string->list string->number string->symbol string-append string-ci<=? string-ci<? string-ci=? string-ci>=? string-ci>? string-copy string-fill! string-length string-ref string-set! string<=? string<? string=? string>=? string>? string? substring symbol->string symbol? syntax-rules transcript-off transcript-on truncate unquote unquote-splicing values vector vector->list vector-fill! vector-length vector-ref vector-set! vector? with-input-from-file with-output-to-file write write-char zero? + + + ifTrue: ifFalse: whileTrue: whileFalse: ifNil: ifNotNil: whileTrue whileFalse repeat isNil notNil + + + abs absolute access acos add add_months adddate admin after aggregate all allocate alter and any app_name are array as asc ascii asin assertion at atan atn2 audit authid authorization autonomous_transaction avg before begin benchmark between bfilename bin binary binary_checksum binary_integer bit bit_count bit_and bit_or blob body boolean both breadth bulk by call cascade cascaded case cast catalog ceil ceiling char char_base character charindex chartorowid check checksum checksum_agg chr class clob close cluster coalesce col_length col_name collate collation collect column comment commit completion compress concat concat_ws connect connection constant constraint constraints constructorcreate contains containsable continue conv convert corr corresponding cos cot count count_big covar_pop covar_samp create cross cube cume_dist current current_date current_path current_role current_time current_timestamp current_user currval cursor cycle data datalength databasepropertyex date date_add date_format date_sub dateadd datediff datename datepart day db_id db_name deallocate dec declare decimal decode default deferrable deferred degrees delete dense_rank depth deref desc describe descriptor destroy destructor deterministic diagnostics dictionary disconnect difference distinct do domain double drop dump dynamic each else elsif empth encode encrypt end end-exec equals escape every except exception exclusive exec execute exists exit exp export_set extends external extract false fetch first first_value file float floor file_id file_name filegroup_id filegroup_name filegroupproperty fileproperty for forall foreign format formatmessage found freetexttable from from_days fulltextcatalog fulltextservice function general get get_lock getdate getansinull getutcdate global go goto grant greatest group grouping having heap hex hextoraw host host_id host_name hour ident_incr ident_seed ident_current identified identity if ifnull ignore immediate in increment index index_col indexproperty indicator initcap initial initialize initially inner inout input insert instr instrb int integer interface intersect interval into is is_member is_srvrolemember is_null is_numeric isdate isnull isolation iterate java join key lag language large last last_day last_value lateral lcase lead leading least left len length lengthb less level like limit limited ln lpad local localtime localtimestamp locator lock log log10 long loop lower ltrim make_ref map match max maxextents mid min minus minute mlslabel mod mode modifies modify module month months_between names national natural naturaln nchar nclob new new_time newid next next_day nextval no noaudit nocompress nocopy none not nowait null nullif number number_base numeric nvl nvl2 object object_id object_name object_property ocirowid oct of off offline old on online only opaque open operator operation option or ord order ordinalityorganization others out outer output package pad parameter parameters partial partition path pctfree percent_rank pi pls_integer positive positiven postfix pow power pragma precision prefix preorder prepare preserve primary prior private privileges procedure public radians raise rand range rank ratio_to_export raw rawtohex read reads real record recursive ref references referencing reftohex relative release release_lock rename repeat replace resource restrict result return returns reverse revoke right rollback rollup round routine row row_number rowid rowidtochar rowlabel rownum rows rowtype rpad rtrim savepoint schema scroll scope search second section seddev_samp select separate sequence session session_user set sets share sign sin sinh size smallint some soundex space specific specifictype sql sqlcode sqlerrm sqlexception sqlstate sqlwarning sqrt start state statement static std stddev stdev_pop strcmp structure subdate substr substrb substring substring_index subtype successful sum synonym sys_context sys_guid sysdate system_user table tan tanh temporary terminate than then time timestamp timezone_abbr timezone_minute timezone_hour timezone_region to to_char to_date to_days to_number to_single_byte trailing transaction translate translation treat trigger trim true trunc truncate type ucase uid under union unique unknown unnest update upper usage use user userenv using validate value values var_pop var_samp varchar varchar2 variable variance varying view vsize when whenever where with without while with work write year zone + + + after append array auto_execok auto_import auto_load auto_load_index auto_qualify beep binary break case catch cd clock close concat continue dde default echo else elseif encoding eof error eval exec exit expr fblocked fconfigure fcopy file fileevent flush for foreach format gets glob global history if incr info interp join lappend lindex linsert list llength load lrange lreplace lsearch lsort namespace open package pid pkg_mkIndex proc puts pwd read regexp regsub rename resource return scan seek set socket source split string subst switch tclLog tclMacPkgSearch tclPkgSetup tclPkgUnknown tell time trace unknown unset update uplevel upvar variable vwait while + bell bind bindtags button canvas checkbutton console destroy entry event focus font frame grab grid image label listbox menu menubutton message pack place radiobutton raise scale scrollbar text tk tkwait toplevel winfo wm + @scope body class code common component configbody constructor define destructor hull import inherit itcl itk itk_component itk_initialize itk_interior itk_option iwidgets keep method private protected public + tkButtonDown tkButtonEnter tkButtonInvoke tkButtonLeave tkButtonUp tkCancelRepeat tkCheckRadioInvoke tkDarken tkEntryAutoScan tkEntryBackspace tkEntryButton1 tkEntryClosestGap tkEntryInsert tkEntryKeySelect tkEntryMouseSelect tkEntryNextWord tkEntryPaste tkEntryPreviousWord tkEntrySeeInsert tkEntrySetCursor tkEntryTranspose tkEventMotifBindings tkFDGetFileTypes tkFirstMenu tkFocusGroup_Destroy tkFocusGroup_In tkFocusGroup_Out tkFocusOK tkListboxAutoScan tkListboxBeginExtend tkListboxBeginSelect tkListboxBeginToggle tkListboxCancel tkListboxDataExtend tkListboxExtendUpDown tkListboxMotion tkListboxSelectAll tkListboxUpDown tkMbButtonUp tkMbEnter tkMbLeave tkMbMotion tkMbPost tkMenuButtonDown tkMenuDownArrow tkMenuDup tkMenuEscape tkMenuFind tkMenuFindName tkMenuFirstEntry tkMenuInvoke tkMenuLeave tkMenuLeftArrow tkMenuMotion tkMenuNextEntry tkMenuNextMenu tkMenuRightArrow tkMenuUnpost tkMenuUpArrow tkMessageBox tkPostOverPoint tkRecolorTree tkRestoreOldGrab tkSaveGrabInfo tkScaleActivate tkScaleButton2Down tkScaleButtonDown tkScaleControlPress tkScaleDrag tkScaleEndDrag tkScaleIncrement tkScreenChanged tkScrollButton2Down tkScrollButtonDown tkScrollButtonUp tkScrollByPages tkScrollByUnits tkScrollDrag tkScrollEndDrag tkScrollSelect tkScrollStartDrag tkScrollToPos tkScrollTopBottom tkTabToWindow tkTearOffMenu tkTextAutoScan tkTextButton1 tkTextClosestGap tkTextInsert tkTextKeyExtend tkTextKeySelect tkTextNextPara tkTextNextPos tkTextNextWord tkTextPaste tkTextPrevPara tkTextPrevPos tkTextResetAnchor tkTextScrollPages tkTextSelectTo tkTextSetCursor tkTextTranspose tkTextUpDownLine tkTraverseToMenu tkTraverseWithinMenu tk_bisque tk_chooseColor tk_dialog tk_focusFollowsMouse tk_focusNext tk_focusPrev tk_getOpenFile tk_getSaveFile tk_messageBox tk_optionMenu tk_popup tk_setPalette tk_textCopy tk_textCut tk_textPaste + + + + + addhandler addressof andalso alias and ansi as assembly attribute auto begin boolean byref byte byval call case catch cbool cbyte cchar cdate cdec cdbl char cint class clng cobj compare const continue cshort csng cstr ctype currency date decimal declare default delegate dim do double each else elseif end enum erase error event exit explicit false finally for friend function get gettype global gosub goto handles if implement implements imports in inherits integer interface is let lib like load long loop lset me mid mod module mustinherit mustoverride mybase myclass namespace new next not nothing notinheritable notoverridable object on option optional or orelse overloads overridable overrides paramarray preserve private property protected public raiseevent readonly redim rem removehandler rset resume return select set shadows shared short single static step stop string structure sub synclock then throw to true try type typeof unload unicode until variant wend when while with withevents writeonly xor + + + always and assign attribute begin buf bufif0 bufif1 case casex casez cmos deassign default defparam disable edge else end endattribute endcase endfunction endmodule endprimitive endspecify endtable endtask event for force forever fork function highz0 highz1 if ifnone initial inout input integer join medium module large localparam macromodule nand negedge nmos nor not notif0 notif1 or output parameter pmos posedge primitive pull0 pull1 pulldown pullup rcmos real realtime reg release repeat rnmos rpmos rtran rtranif0 rtranif1 scalared signed small specify specparam strength strong0 strong1 supply0 supply1 table task time tran tranif0 tranif1 tri tri0 tri1 triand trior trireg unsigned vectored wait wand weak0 weak1 while wire wor xnor xor + $readmemb $readmemh $sreadmemb $sreadmemh $display $write $strobe $monitor $fdisplay $fwrite $fstrobe $fmonitor $fopen $fclose $time $stime $realtime $scale $printtimescale $timeformat $stop $finish $save $incsave $restart $input $log $nolog $key $nokey $scope $showscopes $showscopes $showvars $showvars $countdrivers $list $monitoron $monitoroff $dumpon $dumpoff $dumpfile $dumplimit $dumpflush $dumpvars $dumpall $reset $reset $reset $reset $reset $random $getpattern $rtoi $itor $realtobits $bitstoreal $setup $hold $setuphold $period $width $skew $recovery + + + + access after alias all architecture array assert attribute begin block body buffer bus case component configuration constant disconnect downto else elsif end entity exit file for function generate generic group guarded if impure in inertial inout is label library linkage literal loop map new next null of on open others out package port postponed procedure process pure range record register reject report return select severity shared signal subtype then to transport type unaffected units until use variable wait when while with + abs and mod nand nor not or rem rol ror sla sll sra srl xnor xor + left right low high ascending image value pos val succ pred leftof rightof base range reverse_range length delayed stable quiet transaction event active last_event last_active last_value driving driving_value simple_name path_name instance_name + now readline read writeline write endfile resolved to_bit to_bitvector to_stdulogic to_stdlogicvector to_stdulogicvector to_x01 to_x01z to_UX01 rising_edge falling_edge is_x shift_left shift_right rotate_left rotate_right resize to_integer to_unsigned to_signed std_match to_01 + 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 + + + + + + + + + + + + + diff --git a/PowerEditor/src/lastRecentFileList.cpp b/PowerEditor/src/lastRecentFileList.cpp new file mode 100644 index 00000000..65a83afd --- /dev/null +++ b/PowerEditor/src/lastRecentFileList.cpp @@ -0,0 +1,209 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "lastRecentFileList.h" +#include "menuCmdID.h" + + +void LastRecentFileList::initMenu(HMENU hMenu, int idBase, int posBase) { + _hMenu = hMenu; + _idBase = idBase; + _posBase = posBase; + + for (int i = 0 ; i < sizeof(_idFreeArray) ; i++) + _idFreeArray[i] = true; +}; + +void LastRecentFileList::updateMenu() { + if (!_hasSeparators && _size > 0) { //add separators + const char * nativeLangOpenAllFiles = (NppParameters::getInstance())->getNativeLangMenuStringA(IDM_OPEN_ALL_RECENT_FILE); + const char * nativeLangCleanFilesList = (NppParameters::getInstance())->getNativeLangMenuStringA(IDM_CLEAN_RECENT_FILE_LIST); + + const char * openAllFileStr = nativeLangOpenAllFiles?nativeLangOpenAllFiles:"Open All Recent Files"; + const char * cleanFileListStr = nativeLangCleanFilesList?nativeLangCleanFilesList:"Clean Recent Files List"; + ::InsertMenu(_hMenu, _posBase + 0, MF_BYPOSITION, UINT(-1), 0); +#ifdef UNICODE + WcharMbcsConvertor *wmc = WcharMbcsConvertor::getInstance(); + const wchar_t * openAllFileStrW = wmc->char2wchar(openAllFileStr, CP_ANSI_LATIN_1); + ::InsertMenu(_hMenu, _posBase + 1, MF_BYPOSITION, IDM_OPEN_ALL_RECENT_FILE, openAllFileStrW); + const wchar_t * cleanFileListStrW = wmc->char2wchar(cleanFileListStr, CP_ANSI_LATIN_1); + ::InsertMenu(_hMenu, _posBase + 2, MF_BYPOSITION, IDM_CLEAN_RECENT_FILE_LIST, cleanFileListStrW); +#else + ::InsertMenu(_hMenu, _posBase + 1, MF_BYPOSITION, IDM_OPEN_ALL_RECENT_FILE, openAllFileStr); + ::InsertMenu(_hMenu, _posBase + 2, MF_BYPOSITION, IDM_CLEAN_RECENT_FILE_LIST, cleanFileListStr); +#endif + ::InsertMenu(_hMenu, _posBase + 3, MF_BYPOSITION, UINT(-1), 0); + _hasSeparators = true; + + } + else if (_hasSeparators && _size == 0) //remove separators + { + ::RemoveMenu(_hMenu, _posBase + 3, MF_BYPOSITION); + ::RemoveMenu(_hMenu, IDM_CLEAN_RECENT_FILE_LIST, MF_BYCOMMAND); + ::RemoveMenu(_hMenu, IDM_OPEN_ALL_RECENT_FILE, MF_BYCOMMAND); + ::RemoveMenu(_hMenu, _posBase + 0, MF_BYPOSITION); + _hasSeparators = false; + + } + + //Remove all menu items + for(int i = 0; i < _size; i++) { + ::RemoveMenu(_hMenu, _lrfl.at(i)._id, MF_BYCOMMAND); + } + //Then readd them, so everything stays in sync + TCHAR indexBuffer[4]; + for(int j = 0; j < _size; j++) { + std::generic_string menuString = TEXT(""); + if (j < 9) { //first 9 have accelerator (0 unused) + menuString += TEXT("&"); + } + wsprintf(indexBuffer, TEXT("%d"), j+1);//one based numbering + menuString += indexBuffer; + menuString += TEXT(" "); + menuString += _lrfl.at(j)._name; + ::InsertMenu(_hMenu, _posBase + j, MF_BYPOSITION, _lrfl.at(j)._id, menuString.c_str()); + } +} + +void LastRecentFileList::add(const TCHAR *fn) { + if (_userMax == 0 || _locked) + return; + + RecentItem itemToAdd(fn); + + int index = find(fn); + if (index != -1) { //already in list, bump upwards + remove(index); + } + + if (_size == _userMax) { + itemToAdd._id = _lrfl.back()._id; + _lrfl.pop_back(); //remove oldest + } else { + itemToAdd._id = popFirstAvailableID(); + _size++; + } + _lrfl.push_front(itemToAdd); + updateMenu(); +}; + +void LastRecentFileList::remove(const TCHAR *fn) { + int index = find(fn); + if (index != -1) + remove(index); +}; + +void LastRecentFileList::remove(int index) { + if (_size == 0 || _locked) + return; + if (index > -1 && index < (int)_lrfl.size()) { + ::RemoveMenu(_hMenu, _lrfl.at(index)._id, MF_BYCOMMAND); + setAvailable(_lrfl.at(index)._id); + _lrfl.erase(_lrfl.begin() + index); + _size--; + updateMenu(); + } +}; + + +void LastRecentFileList::clear() { + if (_size == 0) + return; + + for(int i = (_size-1); i >= 0; i--) { + ::RemoveMenu(_hMenu, _lrfl.at(i)._id, MF_BYCOMMAND); + setAvailable(_lrfl.at(i)._id); + _lrfl.erase(_lrfl.begin() + i); + } + _size = 0; + updateMenu(); +} + + +std::generic_string & LastRecentFileList::getItem(int id) { + int i = 0; + for(; i < _size; i++) { + if (_lrfl.at(i)._id == id) + break; + } + if (i == _size) + i = 0; + return _lrfl.at(i)._name; //if not found, return first +}; + +std::generic_string & LastRecentFileList::getIndex(int index) { + return _lrfl.at(index)._name; //if not found, return first +}; + + +void LastRecentFileList::setUserMaxNbLRF(int size) { + _userMax = size; + if (_size > _userMax) { //start popping items + int toPop = _size-_userMax; + while(toPop > 0) { + ::RemoveMenu(_hMenu, _lrfl.back()._id, MF_BYCOMMAND); + setAvailable(_lrfl.back()._id); + _lrfl.pop_back(); + toPop--; + _size--; + } + updateMenu(); + _size = _userMax; + } +}; + + + +void LastRecentFileList::saveLRFL() { + NppParameters *pNppParams = NppParameters::getInstance(); + if (pNppParams->writeNbHistoryFile(_userMax)) + { + for(int i = _size - 1; i >= 0; i--) //reverse order: so loading goes in correct order + { + pNppParams->writeHistory(_lrfl.at(i)._name.c_str()); + } + } +}; + + + +int LastRecentFileList::find(const TCHAR *fn) { + int i = 0; + for(int i = 0; i < _size; i++) { + if (!lstrcmpi(_lrfl.at(i)._name.c_str(), fn)) { + return i; + } + } + return -1; +}; + +int LastRecentFileList::popFirstAvailableID() { + for (int i = 0 ; i < NB_MAX_LRF_FILE ; i++) + { + if (_idFreeArray[i]) + { + _idFreeArray[i] = false; + return i + _idBase; + } + } + return 0; +}; + +void LastRecentFileList::setAvailable(int id) { + int index = id - _idBase; + _idFreeArray[index] = true; +}; diff --git a/PowerEditor/src/lastRecentFileList.h b/PowerEditor/src/lastRecentFileList.h new file mode 100644 index 00000000..8f1c039a --- /dev/null +++ b/PowerEditor/src/lastRecentFileList.h @@ -0,0 +1,74 @@ +#ifndef LASTRECENTFILELIST_H +#define LASTRECENTFILELIST_H + +#include +#include +#include "windows.h" +#include "Parameters.h" + +struct RecentItem { + int _id; + std::generic_string _name; + RecentItem(const TCHAR * name) : _name(name) {}; +}; + +typedef std::deque recentList; + +class LastRecentFileList +{ +public : + LastRecentFileList() : _hasSeparators(false), _size(0), _locked(false) { + _userMax = (NppParameters::getInstance())->getNbMaxFile(); + }; + + void initMenu(HMENU hMenu, int idBase, int posBase); + + void updateMenu(); + + void add(const TCHAR *fn); + void remove(const TCHAR *fn); + void remove(int index); + void clear(); + + int getSize() { + return _size; + }; + + int getMaxNbLRF() const { + return NB_MAX_LRF_FILE; + }; + + int getUserMaxNbLRF() const { + return _userMax; + }; + + std::generic_string & getItem(int id); //use menu id + std::generic_string & getIndex(int index); //use menu id + + void setUserMaxNbLRF(int size); + + void saveLRFL(); + + void setLock(bool lock) { + _locked = lock; + }; +private: + recentList _lrfl; + int _userMax; + int _size; + + // For the menu + HMENU _hMenu; + int _posBase; + int _idBase; + bool _idFreeArray[NB_MAX_LRF_FILE]; + bool _hasSeparators; + bool _locked; + + int find(const TCHAR *fn); + + int popFirstAvailableID(); + void setAvailable(int id); +}; + +#endif //LASTRECENTFILELIST_H diff --git a/PowerEditor/src/lesDlgs.h b/PowerEditor/src/lesDlgs.h new file mode 100644 index 00000000..8eb4d933 --- /dev/null +++ b/PowerEditor/src/lesDlgs.h @@ -0,0 +1,131 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO < donho@altern.org > +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef SIZE_DLG_H +#define SIZE_DLG_H + +#include "StaticDialog.h" +const int DEFAULT_NB_NUMBER = 2; +class ValueDlg : public StaticDialog +{ +public : + ValueDlg() : StaticDialog(), _nbNumber(DEFAULT_NB_NUMBER) {}; + void init(HINSTANCE hInst, HWND parent, int valueToSet, const TCHAR *text) { + Window::init(hInst, parent); + _defaultValue = valueToSet; + lstrcpy(_name, text); + }; + + int doDialog(POINT p, bool isRTL = false) { + _p = p; + if (isRTL) + { + DLGTEMPLATE *pMyDlgTemplate = NULL; + HGLOBAL hMyDlgTemplate = makeRTLResource(IDD_VALUE_DLG, &pMyDlgTemplate); + int result = ::DialogBoxIndirectParam(_hInst, pMyDlgTemplate, _hParent, (DLGPROC)dlgProc, (LPARAM)this); + ::GlobalFree(hMyDlgTemplate); + return result; + } + return ::DialogBoxParam(_hInst, MAKEINTRESOURCE(IDD_VALUE_DLG), _hParent, (DLGPROC)dlgProc, (LPARAM)this); + }; + + void setNBNumber(int nbNumber) { + if (nbNumber > 0) + _nbNumber = nbNumber; + }; + + int reSizeValueBox() + { + if (_nbNumber == DEFAULT_NB_NUMBER) return 0; + RECT rect; + POINT p; + + HWND hEdit = ::GetDlgItem(_hSelf, IDC_VALUE_EDIT); + + //get screen coordonnees (x,y) + ::GetWindowRect(hEdit, &rect); + int w = rect.right - rect.left; + int h = rect.bottom - rect.top; + + p.x = rect.left; + p.y = rect.top; + + // convert screen coordonnees to client coordonnees + ::ScreenToClient(_hSelf, &p); + + int unit = w / (DEFAULT_NB_NUMBER + 2); + int extraSize = (_nbNumber-DEFAULT_NB_NUMBER)*unit; + ::MoveWindow(hEdit, p.x, p.y, w + extraSize, h, FALSE); + + return extraSize; + }; + + virtual void destroy() {}; + +protected : + BOOL CALLBACK run_dlgProc(UINT Message, WPARAM wParam, LPARAM lParam) { + + switch (Message) + { + case WM_INITDIALOG : + { + ::SetDlgItemText(_hSelf, IDC_VALUE_STATIC, _name); + ::SetDlgItemInt(_hSelf, IDC_VALUE_EDIT, _defaultValue, FALSE); + + RECT rc; + ::GetClientRect(_hSelf, &rc); + int size = reSizeValueBox(); + ::MoveWindow(_hSelf, _p.x, _p.y, rc.right - rc.left + size, rc.bottom - rc.top + 30, TRUE); + + return TRUE; + } + + case WM_COMMAND : + { + switch (wParam) + { + case IDOK : + { + int i = ::GetDlgItemInt(_hSelf, IDC_VALUE_EDIT, NULL, FALSE); + ::EndDialog(_hSelf, i); + return TRUE; + } + + case IDCANCEL : + ::EndDialog(_hSelf, -1); + return TRUE; + + default: + return FALSE; + } + } + default : + return FALSE; + } + + return FALSE; + }; + +private : + int _nbNumber; + int _defaultValue; + TCHAR _name[32]; + POINT _p; + +}; + +#endif //TABSIZE_DLG_H diff --git a/PowerEditor/src/localizationString.h b/PowerEditor/src/localizationString.h new file mode 100644 index 0000000000000000000000000000000000000000..45c21bec9284fbe0c64d22035599567b44aa3cdc GIT binary patch literal 6106 zcmbVQ&u{m8!Ptv9}&tiK;);1ENB$=&ARr?f1=iF@fjqBU;(J``)~H-^_e7@4fx^ zp96A0)@4}|=}II^xHl!nlfAd4DjoDkvWC7$TDY&HpY3&d3D*vcKOjZ4w`CKui8P>% zBgW9WPY%fhuEThrf=mndb25wn*D#*%%lMy!wx;Uspk*8_9cVe#*KIS*Kf>5X?;83$ z7_|ybDe?|*5qTHAOVGBV*kd_?woSD4aIc|_7${rUk?VL)WD&izi`s~tQgzrxBsTvl zo;hL(x>Bj0O2v?gFlt%HQ%eW9=uPuk+A}R>SwQPFBw8v(t0TFHxfk)209_;{y;GtK z8JoMR+S-rgx;j@K(u;~Fo#8BIHXl@U?tu>?Ig1v1&k8PfEeWo!*kiN4cgRs3p@W!-s_q1!=hIGB^njRth4 zQ8eD974h-v!&tK>q?M7mumNisedF62TC(%g=62;MHJ%5a8vMoQSLCQ1!F>kyceO4Q z)FbRGqHPs5f%Dg4L98QYlmQdS%p7dg_#FxzOY|Hu-2%vwzT-@-ku5tY8rYg*wtavaw%*(t@#x#?}I zXsj%5%_iNIx8xllJ&E6KSnwSF=fVBU_#czqcw*#EH2BtuCEQnjehuGGdaY@#XUSapB#&AGtJ9gGGa@ho7$ZZdYcrbyc7@ ztytV8uxe%NfBT2kPe1#{rF{i)VpX7Tvh_TO_cuQNz@_IJG;lXU2Kw1dCa@}Z)!#0i z%p9)ae%Q`H6A}Cci;M|Ra>n|}Q?e@C+VenXxj_VLPR@|?1DR}{7uDbEu)KlaLm+Wk z-rgeR>(Qrmb7w-{a~Hw=WP&%h9VT~6K6<||lH zUD#@<)v;%l;`-Ep9-bdux|ZQLR#Nu+`fd)sS(W=3mm6{EB*!dkeKpR@-|)j4*e zWWKQ9H**W&-tb^}IQ%wr;agH`$(8KL?g8f}gNfi$a1#70;cddnzaG#r(`+5|i}L-^ z???X_{dx4^s0$^}G0e&sYjHNtGGfdc)luHK^l`^Oknqv?|JvBQ0dx&--pqotHApiP zTFy9g&oGe4#yGX}#htr%x~%11kI~51aaOrywaTT5yMhEVtOkB@-5XAYbK$YD3=WpV zvG79pM!3((L}pzTQRbO58)*e7m|50EqxgG63x~pD(ol@KARhJLy+Uv_E?!Nd9Ck8)b?7@0Y zoiTRRsT99lv8wy|_YPJ>t|{arvymrJW&=^W(09?!6ECY1NBGUME4UDx2o9shPxf~k zF5UbR(R{`=^E42!A`zFJB<;H!*Lk9I%|i}tmGar6Ps=sn<6L%%zYhKU>f)M#EMJ5q ztA?M4&cW|DAj^F_*W(DY#n_J|Ls(RU{F=)9&hQ}rUH)GF$NX>kU-CcYBe|RZ6)i6G zJRfis@?U|@z%y1w$UB!#dZR1XA?I^$BkKoe4t@(E8lFwbx#1PSPD++rS9Mf&_1_g7 z0XNA^?uEGznGNv$HaHa=8nP$hw=}M6wm0_me^Dlb*Zb^` +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef MENUCMDID_H +#define MENUCMDID_H + +#define IDM 40000 + +#define IDM_FILE (IDM + 1000) + #define IDM_FILE_NEW (IDM_FILE + 1) + #define IDM_FILE_OPEN (IDM_FILE + 2) + #define IDM_FILE_CLOSE (IDM_FILE + 3) + #define IDM_FILE_CLOSEALL (IDM_FILE + 4) + #define IDM_FILE_CLOSEALL_BUT_CURRENT (IDM_FILE + 5) + #define IDM_FILE_SAVE (IDM_FILE + 6) + #define IDM_FILE_SAVEALL (IDM_FILE + 7) + #define IDM_FILE_SAVEAS (IDM_FILE + 8) + #define IDM_FILE_ASIAN_LANG (IDM_FILE + 9) + #define IDM_FILE_PRINT (IDM_FILE + 10) + #define IDM_FILE_PRINTNOW 1001 + #define IDM_FILE_EXIT (IDM_FILE + 11) + #define IDM_FILE_LOADSESSION (IDM_FILE + 12) + #define IDM_FILE_SAVESESSION (IDM_FILE + 13) + #define IDM_FILE_RELOAD (IDM_FILE + 14) + #define IDM_FILE_SAVECOPYAS (IDM_FILE + 15) + #define IDM_FILE_DELETE (IDM_FILE + 16) + #define IDM_FILE_RENAME (IDM_FILE + 17) + + // A mettre à jour si on ajoute nouveau menu item dans le menu "File" + #define IDM_FILEMENU_LASTONE IDM_FILE_RENAME + +#define IDM_EDIT (IDM + 2000) + #define IDM_EDIT_CUT (IDM_EDIT + 1) + #define IDM_EDIT_COPY (IDM_EDIT + 2) + #define IDM_EDIT_UNDO (IDM_EDIT + 3) + #define IDM_EDIT_REDO (IDM_EDIT + 4) + #define IDM_EDIT_PASTE (IDM_EDIT + 5) + #define IDM_EDIT_DELETE (IDM_EDIT + 6) + #define IDM_EDIT_SELECTALL (IDM_EDIT + 7) + + #define IDM_EDIT_INS_TAB (IDM_EDIT + 8) + #define IDM_EDIT_RMV_TAB (IDM_EDIT + 9) + #define IDM_EDIT_DUP_LINE (IDM_EDIT + 10) + #define IDM_EDIT_TRANSPOSE_LINE (IDM_EDIT + 11) + #define IDM_EDIT_SPLIT_LINES (IDM_EDIT + 12) + #define IDM_EDIT_JOIN_LINES (IDM_EDIT + 13) + #define IDM_EDIT_LINE_UP (IDM_EDIT + 14) + #define IDM_EDIT_LINE_DOWN (IDM_EDIT + 15) + #define IDM_EDIT_UPPERCASE (IDM_EDIT + 16) + #define IDM_EDIT_LOWERCASE (IDM_EDIT + 17) + + #define IDM_EDIT_BLOCK_COMMENT (IDM_EDIT + 22) + #define IDM_EDIT_STREAM_COMMENT (IDM_EDIT + 23) + #define IDM_EDIT_TRIMTRAILING (IDM_EDIT + 24) + + #define IDM_EDIT_RTL (IDM_EDIT+26) + #define IDM_EDIT_LTR (IDM_EDIT+27) + #define IDM_EDIT_SETREADONLY (IDM_EDIT+28) + #define IDM_EDIT_FULLPATHTOCLIP (IDM_EDIT+29) + #define IDM_EDIT_FILENAMETOCLIP (IDM_EDIT+30) + #define IDM_EDIT_CURRENTDIRTOCLIP (IDM_EDIT+31) + + #define IDM_EDIT_CLEARREADONLY (IDM_EDIT+33) + #define IDM_EDIT_COLUMNMODE (IDM_EDIT+34) + #define IDM_EDIT_BLOCK_COMMENT_SET (IDM_EDIT+35) + #define IDM_EDIT_BLOCK_UNCOMMENT (IDM_EDIT+36) + + #define IDM_EDIT_AUTOCOMPLETE (50000+0) + #define IDM_EDIT_AUTOCOMPLETE_CURRENTFILE (50000+1) + #define IDM_EDIT_FUNCCALLTIP (50000+2) + + //Belong to MENU FILE + #define IDM_OPEN_ALL_RECENT_FILE (IDM_EDIT + 40) + #define IDM_CLEAN_RECENT_FILE_LIST (IDM_EDIT + 41) + +#define IDM_SEARCH (IDM + 3000) + + #define IDM_SEARCH_FIND (IDM_SEARCH + 1) + #define IDM_SEARCH_FINDNEXT (IDM_SEARCH + 2) + #define IDM_SEARCH_REPLACE (IDM_SEARCH + 3) + #define IDM_SEARCH_GOTOLINE (IDM_SEARCH + 4) + #define IDM_SEARCH_TOGGLE_BOOKMARK (IDM_SEARCH + 5) + #define IDM_SEARCH_NEXT_BOOKMARK (IDM_SEARCH + 6) + #define IDM_SEARCH_PREV_BOOKMARK (IDM_SEARCH + 7) + #define IDM_SEARCH_CLEAR_BOOKMARKS (IDM_SEARCH + 8) + #define IDM_SEARCH_GOTOMATCHINGBRACE (IDM_SEARCH + 9) + #define IDM_SEARCH_FINDPREV (IDM_SEARCH + 10) + #define IDM_SEARCH_FINDINCREMENT (IDM_SEARCH + 11) + #define IDM_SEARCH_FINDINFILES (IDM_SEARCH + 13) + #define IDM_SEARCH_VOLATILE_FINDNEXT (IDM_SEARCH + 14) + #define IDM_SEARCH_VOLATILE_FINDPREV (IDM_SEARCH + 15) + #define IDM_SEARCH_CUTMARKEDLINES (IDM_SEARCH + 18) + #define IDM_SEARCH_COPYMARKEDLINES (IDM_SEARCH + 19) + #define IDM_SEARCH_PASTEMARKEDLINES (IDM_SEARCH + 20) + #define IDM_SEARCH_DELETEMARKEDLINES (IDM_SEARCH + 21) + #define IDM_SEARCH_MARKALLEXT1 (IDM_SEARCH + 22) + #define IDM_SEARCH_UNMARKALLEXT1 (IDM_SEARCH + 23) + #define IDM_SEARCH_MARKALLEXT2 (IDM_SEARCH + 24) + #define IDM_SEARCH_UNMARKALLEXT2 (IDM_SEARCH + 25) + #define IDM_SEARCH_MARKALLEXT3 (IDM_SEARCH + 26) + #define IDM_SEARCH_UNMARKALLEXT3 (IDM_SEARCH + 27) + #define IDM_SEARCH_MARKALLEXT4 (IDM_SEARCH + 28) + #define IDM_SEARCH_UNMARKALLEXT4 (IDM_SEARCH + 29) + #define IDM_SEARCH_MARKALLEXT5 (IDM_SEARCH + 30) + #define IDM_SEARCH_UNMARKALLEXT5 (IDM_SEARCH + 31) + #define IDM_SEARCH_CLEARALLMARKS (IDM_SEARCH + 32) + +#define IDM_VIEW (IDM + 4000) + //#define IDM_VIEW_TOOLBAR_HIDE (IDM_VIEW + 1) + #define IDM_VIEW_TOOLBAR_REDUCE (IDM_VIEW + 2) + #define IDM_VIEW_TOOLBAR_ENLARGE (IDM_VIEW + 3) + #define IDM_VIEW_TOOLBAR_STANDARD (IDM_VIEW + 4) + #define IDM_VIEW_REDUCETABBAR (IDM_VIEW + 5) + #define IDM_VIEW_LOCKTABBAR (IDM_VIEW + 6) + #define IDM_VIEW_DRAWTABBAR_TOPBAR (IDM_VIEW + 7) + #define IDM_VIEW_DRAWTABBAR_INACIVETAB (IDM_VIEW + 8) + #define IDM_VIEW_POSTIT (IDM_VIEW + 9) + #define IDM_VIEW_TOGGLE_FOLDALL (IDM_VIEW + 10) + #define IDM_VIEW_USER_DLG (IDM_VIEW + 11) + #define IDM_VIEW_LINENUMBER (IDM_VIEW + 12) + #define IDM_VIEW_SYMBOLMARGIN (IDM_VIEW + 13) + #define IDM_VIEW_FOLDERMAGIN (IDM_VIEW + 14) + #define IDM_VIEW_FOLDERMAGIN_SIMPLE (IDM_VIEW + 15) + #define IDM_VIEW_FOLDERMAGIN_ARROW (IDM_VIEW + 16) + #define IDM_VIEW_FOLDERMAGIN_CIRCLE (IDM_VIEW + 17) + #define IDM_VIEW_FOLDERMAGIN_BOX (IDM_VIEW + 18) + #define IDM_VIEW_ALL_CHARACTERS (IDM_VIEW + 19) + #define IDM_VIEW_INDENT_GUIDE (IDM_VIEW + 20) + #define IDM_VIEW_CURLINE_HILITING (IDM_VIEW + 21) + #define IDM_VIEW_WRAP (IDM_VIEW + 22) + #define IDM_VIEW_ZOOMIN (IDM_VIEW + 23) + #define IDM_VIEW_ZOOMOUT (IDM_VIEW + 24) + #define IDM_VIEW_TAB_SPACE (IDM_VIEW + 25) + #define IDM_VIEW_EOL (IDM_VIEW + 26) + #define IDM_VIEW_EDGELINE (IDM_VIEW + 27) + #define IDM_VIEW_EDGEBACKGROUND (IDM_VIEW + 28) + #define IDM_VIEW_TOGGLE_UNFOLDALL (IDM_VIEW + 29) + #define IDM_VIEW_FOLD_CURRENT (IDM_VIEW + 30) + #define IDM_VIEW_UNFOLD_CURRENT (IDM_VIEW + 31) + #define IDM_VIEW_FULLSCREENTOGGLE (IDM_VIEW + 32) + #define IDM_VIEW_ZOOMRESTORE (IDM_VIEW + 33) + #define IDM_VIEW_ALWAYSONTOP (IDM_VIEW + 34) + #define IDM_VIEW_SYNSCROLLV (IDM_VIEW + 35) + #define IDM_VIEW_SYNSCROLLH (IDM_VIEW + 36) + #define IDM_VIEW_EDGENONE (IDM_VIEW + 37) + #define IDM_VIEW_DRAWTABBAR_CLOSEBOTTUN (IDM_VIEW + 38) + #define IDM_VIEW_DRAWTABBAR_DBCLK2CLOSE (IDM_VIEW + 39) + #define IDM_VIEW_REFRESHTABAR (IDM_VIEW + 40) + #define IDM_VIEW_WRAP_SYMBOL (IDM_VIEW + 41) + #define IDM_VIEW_HIDELINES (IDM_VIEW + 42) + #define IDM_VIEW_DRAWTABBAR_VERTICAL (IDM_VIEW + 43) + #define IDM_VIEW_DRAWTABBAR_MULTILINE (IDM_VIEW + 44) + #define IDM_VIEW_DOCCHANGEMARGIN (IDM_VIEW + 45) + + + #define IDM_VIEW_FOLD (IDM_VIEW + 50) + #define IDM_VIEW_FOLD_1 (IDM_VIEW_FOLD + 1) + #define IDM_VIEW_FOLD_2 (IDM_VIEW_FOLD + 2) + #define IDM_VIEW_FOLD_3 (IDM_VIEW_FOLD + 3) + #define IDM_VIEW_FOLD_4 (IDM_VIEW_FOLD + 4) + #define IDM_VIEW_FOLD_5 (IDM_VIEW_FOLD + 5) + #define IDM_VIEW_FOLD_6 (IDM_VIEW_FOLD + 6) + #define IDM_VIEW_FOLD_7 (IDM_VIEW_FOLD + 7) + #define IDM_VIEW_FOLD_8 (IDM_VIEW_FOLD + 8) + + #define IDM_VIEW_UNFOLD (IDM_VIEW + 60) + #define IDM_VIEW_UNFOLD_1 (IDM_VIEW_UNFOLD + 1) + #define IDM_VIEW_UNFOLD_2 (IDM_VIEW_UNFOLD + 2) + #define IDM_VIEW_UNFOLD_3 (IDM_VIEW_UNFOLD + 3) + #define IDM_VIEW_UNFOLD_4 (IDM_VIEW_UNFOLD + 4) + #define IDM_VIEW_UNFOLD_5 (IDM_VIEW_UNFOLD + 5) + #define IDM_VIEW_UNFOLD_6 (IDM_VIEW_UNFOLD + 6) + #define IDM_VIEW_UNFOLD_7 (IDM_VIEW_UNFOLD + 7) + #define IDM_VIEW_UNFOLD_8 (IDM_VIEW_UNFOLD + 8) + + + #define IDM_VIEW_GOTO_ANOTHER_VIEW 10001 + #define IDM_VIEW_CLONE_TO_ANOTHER_VIEW 10002 + #define IDM_VIEW_GOTO_NEW_INSTANCE 10003 + #define IDM_VIEW_LOAD_IN_NEW_INSTANCE 10004 + + #define IDM_VIEW_SWITCHTO_OTHER_VIEW (IDM_VIEW + 72) + + +#define IDM_FORMAT (IDM + 5000) + #define IDM_FORMAT_TODOS (IDM_FORMAT + 1) + #define IDM_FORMAT_TOUNIX (IDM_FORMAT + 2) + #define IDM_FORMAT_TOMAC (IDM_FORMAT + 3) + #define IDM_FORMAT_ANSI (IDM_FORMAT + 4) + #define IDM_FORMAT_UTF_8 (IDM_FORMAT + 5) + #define IDM_FORMAT_UCS_2BE (IDM_FORMAT + 6) + #define IDM_FORMAT_UCS_2LE (IDM_FORMAT + 7) + #define IDM_FORMAT_AS_UTF_8 (IDM_FORMAT + 8) + #define IDM_FORMAT_CONV2_ANSI (IDM_FORMAT + 9) + #define IDM_FORMAT_CONV2_AS_UTF_8 (IDM_FORMAT + 10) + #define IDM_FORMAT_CONV2_UTF_8 (IDM_FORMAT + 11) + #define IDM_FORMAT_CONV2_UCS_2BE (IDM_FORMAT + 12) + #define IDM_FORMAT_CONV2_UCS_2LE (IDM_FORMAT + 13) + +#define IDM_LANG (IDM + 6000) + #define IDM_LANGSTYLE_CONFIG_DLG (IDM_LANG + 1) + #define IDM_LANG_C (IDM_LANG + 2) + #define IDM_LANG_CPP (IDM_LANG + 3) + #define IDM_LANG_JAVA (IDM_LANG + 4) + #define IDM_LANG_HTML (IDM_LANG + 5) + #define IDM_LANG_XML (IDM_LANG + 6) + #define IDM_LANG_JS (IDM_LANG + 7) + #define IDM_LANG_PHP (IDM_LANG + 8) + #define IDM_LANG_ASP (IDM_LANG + 9) + #define IDM_LANG_CSS (IDM_LANG + 10) + #define IDM_LANG_PASCAL (IDM_LANG + 11) + #define IDM_LANG_PYTHON (IDM_LANG + 12) + #define IDM_LANG_PERL (IDM_LANG + 13) + #define IDM_LANG_OBJC (IDM_LANG + 14) + #define IDM_LANG_ASCII (IDM_LANG + 15) + #define IDM_LANG_TEXT (IDM_LANG + 16) + #define IDM_LANG_RC (IDM_LANG + 17) + #define IDM_LANG_MAKEFILE (IDM_LANG + 18) + #define IDM_LANG_INI (IDM_LANG + 19) + #define IDM_LANG_SQL (IDM_LANG + 20) + #define IDM_LANG_VB (IDM_LANG + 21) + #define IDM_LANG_BATCH (IDM_LANG + 22) + #define IDM_LANG_CS (IDM_LANG + 23) + #define IDM_LANG_LUA (IDM_LANG + 24) + #define IDM_LANG_TEX (IDM_LANG + 25) + #define IDM_LANG_FORTRAN (IDM_LANG + 26) + #define IDM_LANG_SH (IDM_LANG + 27) + #define IDM_LANG_FLASH (IDM_LANG + 28) + #define IDM_LANG_NSIS (IDM_LANG + 29) + #define IDM_LANG_TCL (IDM_LANG + 30) + #define IDM_LANG_LISP (IDM_LANG + 31) + #define IDM_LANG_SCHEME (IDM_LANG + 32) + #define IDM_LANG_ASM (IDM_LANG + 33) + #define IDM_LANG_DIFF (IDM_LANG + 34) + #define IDM_LANG_PROPS (IDM_LANG + 35) + #define IDM_LANG_PS (IDM_LANG + 36) + #define IDM_LANG_RUBY (IDM_LANG + 37) + #define IDM_LANG_SMALLTALK (IDM_LANG + 38) + #define IDM_LANG_VHDL (IDM_LANG + 39) + #define IDM_LANG_CAML (IDM_LANG + 40) + #define IDM_LANG_KIX (IDM_LANG + 41) + #define IDM_LANG_ADA (IDM_LANG + 42) + #define IDM_LANG_VERILOG (IDM_LANG + 43) + #define IDM_LANG_AU3 (IDM_LANG + 44) + #define IDM_LANG_MATLAB (IDM_LANG + 45) + #define IDM_LANG_HASKELL (IDM_LANG + 46) + #define IDM_LANG_INNO (IDM_LANG + 47) + #define IDM_LANG_CMAKE (IDM_LANG + 48) + #define IDM_LANG_YAML (IDM_LANG + 49) + + #define IDM_LANG_EXTERNAL (IDM_LANG + 50) + #define IDM_LANG_EXTERNAL_LIMIT (IDM_LANG + 79) + + #define IDM_LANG_USER (IDM_LANG + 80) //46080 + #define IDM_LANG_USER_LIMIT (IDM_LANG + 110) //46110 + + +#define IDM_ABOUT (IDM + 7000) + #define IDM_HOMESWEETHOME (IDM_ABOUT + 1) + #define IDM_PROJECTPAGE (IDM_ABOUT + 2) + #define IDM_ONLINEHELP (IDM_ABOUT + 3) + #define IDM_FORUM (IDM_ABOUT + 4) + #define IDM_PLUGINSHOME (IDM_ABOUT + 5) + #define IDM_UPDATE_NPP (IDM_ABOUT + 6) + #define IDM_WIKIFAQ (IDM_ABOUT + 7) + #define IDM_HELP (IDM_ABOUT + 8) + + +#define IDM_SETTING (IDM + 8000) + #define IDM_SETTING_TAB_SIZE (IDM_SETTING + 1) + #define IDM_SETTING_TAB_REPLCESPACE (IDM_SETTING + 2) + #define IDM_SETTING_HISTORY_SIZE (IDM_SETTING + 3) + #define IDM_SETTING_EDGE_SIZE (IDM_SETTING + 4) + #define IDM_SETTING_FILEASSOCIATION_DLG (IDM_SETTING + 5) + + #define IDM_SETTING_HISTORY_DONT_CHECK (IDM_SETTING + 7) + #define IDM_SETTING_TRAYICON (IDM_SETTING + 8) + #define IDM_SETTING_SHORTCUT_MAPPER (IDM_SETTING + 9) + #define IDM_SETTING_REMEMBER_LAST_SESSION (IDM_SETTING + 10) + #define IDM_SETTING_PREFERECE (IDM_SETTING + 11) + + #define IDM_SETTING_AUTOCNBCHAR (IDM_SETTING + 15) + +// Menu macro + #define IDM_MACRO_STARTRECORDINGMACRO (IDM_EDIT + 18) + #define IDM_MACRO_STOPRECORDINGMACRO (IDM_EDIT + 19) + #define IDM_MACRO_PLAYBACKRECORDEDMACRO (IDM_EDIT + 21) + #define IDM_MACRO_SAVECURRENTMACRO (IDM_EDIT + 25) + #define IDM_MACRO_RUNMULTIMACRODLG (IDM_EDIT+32) + +#define IDM_EXECUTE (IDM + 9000) + +#endif //MENUCMDID_H diff --git a/PowerEditor/src/notepad++.exe.manifest b/PowerEditor/src/notepad++.exe.manifest new file mode 100644 index 00000000..c80f5855 --- /dev/null +++ b/PowerEditor/src/notepad++.exe.manifest @@ -0,0 +1,32 @@ + + + +Notepad++ + + + + + + + + + + + + + \ No newline at end of file diff --git a/PowerEditor/src/resource.h b/PowerEditor/src/resource.h new file mode 100644 index 00000000..dac1c87d --- /dev/null +++ b/PowerEditor/src/resource.h @@ -0,0 +1,375 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#ifndef RESOURCE_H +#define RESOURCE_H + +#define NOTEPAD_PLUS_VERSION TEXT("Notepad++ v5.3.1") +#define VERSION_VALUE TEXT("5.31\0") // should be X.Y : ie. if VERSION_DIGITALVALUE == 4, 7, 1, 0 , then X = 4, Y = 71 +#define VERSION_DIGITALVALUE 5, 3, 1, 0 + +#ifdef UNICODE +#define UNICODE_ANSI_MODE TEXT("(UNICODE)") +#else +#define UNICODE_ANSI_MODE TEXT("(ANSI)") +#endif + +#ifndef IDC_STATIC +#define IDC_STATIC -1 +#endif + +#define IDI_M30ICON 100 +#define IDR_MENU1 101 +#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_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_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_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_SAVED_ICON 501 +#define IDI_UNSAVED_ICON 502 +#define IDI_READONLY_ICON 503 +#define IDI_FIND_RESULT_ICON 504 + +#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 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_CLOSETAB 1530 +#define IDR_CLOSETAB_INACT 1531 +#define IDR_CLOSETAB_HOVER 1532 +#define IDR_CLOSETAB_PUSH 1533 + +#define ID_MACRO 20000 +#define ID_MACRO_LIMIT 20200 + +#define ID_USER_CMD 21000 +#define ID_USER_CMD_LIMIT 21200 + +#define ID_PLUGINS_CMD 22000 +#define ID_PLUGINS_CMD_LIMIT 22500 + +//#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 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_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 IDR_M30_MENU 1500 + +// #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_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) + +// voir columnEditor_rc.h +//#define IDD_COLUMNEDIT 2020 + + +//#define IDD_COLOUR_POPUP 2100 + +// See WordStyleDlgRes.h +//#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 + +// see TaskListDlg_rc.h +//#define IDD_TASKLIST_DLG 2450 +#define IDD_SETTING_DLG 2500 + +//See ShortcutMapper_rc.h +//#define IDD_SHORTCUTMAPPER_DLG 2600 + +// See regExtDlg.h +//#define IDD_REGEXT 4000 + +// See shortcutRc.h +//#define IDD_SHORTCUT_DLG 5000 + +// See preference.rc +//#define IDD_PREFERENCE_BOX 6000 + +#define NOTEPADPLUS_USER_INTERNAL (WM_USER + 0000) + #define NPPM_INTERNAL_USERCMDLIST_MODIFIED (NOTEPADPLUS_USER_INTERNAL + 1) + #define NPPM_INTERNAL_CMDLIST_MODIFIED (NOTEPADPLUS_USER_INTERNAL + 2) + #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_SCINTILLAKEYMODIFIED (NOTEPADPLUS_USER_INTERNAL + 7) + #define NPPM_INTERNAL_SCINTILLAFINFERCOLLAPSE (NOTEPADPLUS_USER_INTERNAL + 8) + #define NPPM_INTERNAL_SCINTILLAFINFERUNCOLLAPSE (NOTEPADPLUS_USER_INTERNAL + 9) + //#define NPPM_INTERNAL_DOCSWITCHOFF (NOTEPADPLUS_USER_INTERNAL + 10) + //#define NPPM_INTERNAL_DOCSWITCHIN (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_SEARCH_GOTONEXTFOUND (NOTEPADPLUS_USER_INTERNAL + 28) + #define NPPM_INTERNAL_SEARCH_GOTOPREVFOUND (NOTEPADPLUS_USER_INTERNAL + 29) + #define NPPM_INTERNAL_FOCUS_ON_FOUND_RESULTS (NOTEPADPLUS_USER_INTERNAL + 30) + #define NPPM_INTERNAL_RELOADSTYLERS (NOTEPADPLUS_USER_INTERNAL + 31) + +// See Notepad_plus_msgs.h +//#define NOTEPADPLUS_USER (WM_USER + 1000) + + // + // 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 + + #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 + + #define NPPM_INTERNAL_GETCHECKDOCOPT (NPPMSG + 55) + // INT NPPM_GETCHECKDOCOPT(0, 0) + #define NPPM_INTERNAL_SETCHECKDOCOPT (NPPMSG + 56) + // INT NPPM_SETCHECKDOCOPT(OPT, 0) + + // + // 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) + +#define SCINTILLA_USER (WM_USER + 2000) + + +#define MACRO_USER (WM_USER + 4000) + #define WM_ISCURRENTMACRORECORDED (MACRO_USER + 01) + #define WM_MACRODLGRUNMACRO (MACRO_USER + 02) + + +// See Notepad_plus_msgs.h +//#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 MENUINDEX_FILE 0 +#define MENUINDEX_EDIT 1 +#define MENUINDEX_SEARCH 2 +#define MENUINDEX_VIEW 3 +#define MENUINDEX_FORMAT 4 +#define MENUINDEX_LANGUAGE 5 +#define MENUINDEX_SETTINGS 6 +#define MENUINDEX_MACRO 7 +#define MENUINDEX_RUN 8 +#define MENUINDEX_PLUGINS 9 + +#endif // RESOURCE_H + + diff --git a/PowerEditor/src/shortcuts.xml b/PowerEditor/src/shortcuts.xml new file mode 100644 index 00000000..c343f3c6 --- /dev/null +++ b/PowerEditor/src/shortcuts.xml @@ -0,0 +1,20 @@ + + + + + + + + + + firefox "$(FULL_CURRENT_PATH)" + iexplore "$(FULL_CURRENT_PATH)" + http://www.php.net/%20$(CURRENT_WORD) + http://www.google.com/search?q=$(CURRENT_WORD) + http://en.wikipedia.org/wiki/Special:Search?search=$(CURRENT_WORD) + $(NPP_DIRECTORY)\notepad++.exe $(CURRENT_WORD) + $(NPP_DIRECTORY)\notepad++.exe $(CURRENT_WORD) -nosession -multiInst + explorer $(CURRENT_DIRECTORY) + cmd /K cd $(CURRENT_DIRECTORY) + + diff --git a/PowerEditor/src/stylers.model.xml b/PowerEditor/src/stylers.model.xml new file mode 100644 index 00000000..e7dedf08 --- /dev/null +++ b/PowerEditor/src/stylers.model.xml @@ -0,0 +1,730 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PowerEditor/src/toolbarIcons.xml b/PowerEditor/src/toolbarIcons.xml new file mode 100644 index 00000000..1b3387ce --- /dev/null +++ b/PowerEditor/src/toolbarIcons.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PowerEditor/src/tools/IExplorerShell/makefile b/PowerEditor/src/tools/IExplorerShell/makefile new file mode 100644 index 00000000..109e4a77 --- /dev/null +++ b/PowerEditor/src/tools/IExplorerShell/makefile @@ -0,0 +1,2 @@ +ALL: + gcc nppIExplorerShell.cpp -o nppIExplorerShell.exe -mwindows -lshlwapi -Os -s \ No newline at end of file diff --git a/PowerEditor/src/tools/IExplorerShell/nppIExplorerShell.cpp b/PowerEditor/src/tools/IExplorerShell/nppIExplorerShell.cpp new file mode 100644 index 00000000..8823f453 --- /dev/null +++ b/PowerEditor/src/tools/IExplorerShell/nppIExplorerShell.cpp @@ -0,0 +1,40 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include +#include + +const int CMD_LEN = 512; +const int PARAM_LEN = 1024; +const char *NPP = "\\notepad++.exe"; +const char *FLAG_LEXER_HTML = "-lhtml "; + +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpszCmdLine, int nCmdShow) +{ + char cmd[CMD_LEN]; + ::GetModuleFileName(NULL, cmd, CMD_LEN); + PathRemoveFileSpec(cmd); + strcat(cmd, NPP); + + char param[PARAM_LEN] = ""; + + strcat(strcat(param, FLAG_LEXER_HTML), lpszCmdLine); + ::MessageBox(NULL, param, "", MB_OK); + HINSTANCE hInst = ::ShellExecute(NULL, "open", cmd, param, ".", SW_SHOW); + return (UINT)0; +} + diff --git a/PowerEditor/src/tools/nppCM/Makefile b/PowerEditor/src/tools/nppCM/Makefile new file mode 100644 index 00000000..2058468f --- /dev/null +++ b/PowerEditor/src/tools/nppCM/Makefile @@ -0,0 +1,24 @@ +TARGETOS = BOTH +!include + +lflags = /NODEFAULTLIB /INCREMENTAL:NO /RELEASE /NOLOGO +dlllflags = $(lflags) -entry:_DllMainCRTStartup$(DLLENTRY) -dll + +all: nppcm.dll + +nppcm.dll: nppcm.obj nppcm.res + $(implib) -machine:$(CPU) -def:nppcm.def $** -out:nppcm.lib + $(link) $(dlllflags) -base:0x1C000000 -out:$*.dll $** $(olelibsdll) shell32.lib nppcm.lib comctl32.lib nppcm.exp + +.cpp.obj: + $(cc) $(cflags) $(cvarsdll) $*.cpp + +nppcm.res: nppcm.rc + $(rc) $(rcflags) $(rcvars) nppcm.rc + +clean: + -1 del nppcm.dll nppcm.obj nppcm.exp nppcm.res + +zip: + -1 del *.zip + perl abpack.pl \ No newline at end of file diff --git a/PowerEditor/src/tools/nppCM/license.txt b/PowerEditor/src/tools/nppCM/license.txt new file mode 100644 index 00000000..16618f39 --- /dev/null +++ b/PowerEditor/src/tools/nppCM/license.txt @@ -0,0 +1,19 @@ +Copyright (c) 2003 Andre Burgaud (http://www.burgaud.com) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/PowerEditor/src/tools/nppCM/npp.bmp b/PowerEditor/src/tools/nppCM/npp.bmp new file mode 100644 index 0000000000000000000000000000000000000000..92ae60e6ccd3ab8426ae7cc6e5180b56fa180405 GIT binary patch literal 1334 zcmeIxyKmD_6bA4wG%ZmHQH6N5AR5HWp*&O-+Q`7-N<324;w7~zEzy-3q6R3{9kY7O z=+Uc3j~>0=(c>NO>d~V|^Eu@oV6UZL&OP@#j_t^Cb~ooSJ2snu#nsY34YbaJ##xzt z)@yPG2N;jXkWxZUBz)h898WQwPB94r1hp`L5NNOs96Qvl$DUu{bN^#0c(@^nx6f1a%!k99e zqzZ~6#Y!0&O0s&LL1h^-Qks=?qR~^Dxn`!BY3Q0JqhTl~ooh@IgI;P7C<7-mm{6t- zXIYKmtl_M|lFD(HLK~ z6lKZz5>;I*Rw{}Ls;oF$F{_wW$f}Cxv8U?X`ET%_@4!N{(YVlTclrOH9Vkf}ke*YXCeR*E@*2C2;>&311oqIp-zmzR^)v~(XYgb17 jwfBE6ZMOE@{cXEzUA1|`w;#`U_+5Rgd$}`v+TQiQH`M7Y literal 0 HcmV?d00001 diff --git a/PowerEditor/src/tools/nppCM/nppcm.RES b/PowerEditor/src/tools/nppCM/nppcm.RES new file mode 100644 index 0000000000000000000000000000000000000000..ab2ad2f926e5cbb35f147f8b0a228f497157e5ba GIT binary patch literal 2248 zcmeHHJ#gD(7=9eP!3`#tr{SAeTH2{7deX}gHR)eG2Bq+&n+j&RWoewqu-+!)2dp@(v%uaK$;%U|WFC^^ zfL$oo8s4aZD~$iZnB1w6^w;E_rSomnSoyf;QC}W^G4tn~r0i=a+9G}5u|kEXtJFtl zB|S?o!&(o?lRH&8T}8c~yaC`kCdj*Y(u2HN>Fjj2V#ynmnK!x1wC0$l!Htvq-cQc{ zN~YXe`jGFUG7{gTeZ`! zx?YH)AEHJ0K}arT7?K;38)C}q<3plHtoeN`gnh>Pj1m1lB4R-FBgz4}L4*Y&=tl^n zi2ewX$N^;>VJjT)+yK#FK>h%+$e5Cdq8Q#FCO2j*W-Nx!Kj4TM5b-O#n!*442F5d~ z)L15$=kGsRmz1fLpH^rC@T zL+z`YGRK8q-n)D4;?K2`QYy=Mp`b5beE4p?to929#%ZrCTz_(5dA*c1X={e2-+l1? z(}_>S&Z$XFU!ME=_K){pTmOi0r5n1gFMe}%^~nT_=9FO=rRRIQjkTv6pNXw~JiV+f zy_fsoa^=bwX4aV2w0!>UH*1C2JI&X>%sw(6ujqO0Eu9U&|LM6&<|=6UHzt$Y&b;$4 Dun%we literal 0 HcmV?d00001 diff --git a/PowerEditor/src/tools/nppCM/nppcm.cpp b/PowerEditor/src/tools/nppCM/nppcm.cpp new file mode 100644 index 00000000..b671543f --- /dev/null +++ b/PowerEditor/src/tools/nppCM/nppcm.cpp @@ -0,0 +1,481 @@ +//--------------------------------------------------------------------------- +// Copyright 2002-2003 by Andre Burgaud +// See license.txt +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// wscitecm.cpp +// Defines the entry point for the DLL application. +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// Modified by Don HO +// to meet the need of Notepad++ +//--------------------------------------------------------------------------- + + +#ifndef STRICT +#define STRICT +#endif + +#define INC_OLE2 +#define UNICODE + +#ifdef UNICODE + #define generic_strrchr wcsrchr +#else + + #define generic_strrchr strrchr + +#endif + + +#include +#include +#include + +#define GUID_SIZE 128 +#define ARRAYSIZE(a) (sizeof(a)/sizeof(a[0])) +#define MAX_FILES 10 +#define MAX_CMDSTR (MAX_PATH * MAX_FILES) +#define ResultFromShort(i) ResultFromScode(MAKE_SCODE(SEVERITY_SUCCESS, 0, (USHORT)(i))) + +#pragma data_seg(".text") +#define INITGUID +#include +#include +#include "resource.h" +#include "nppcm.h" +#pragma data_seg() + +//--------------------------------------------------------------------------- +// Global variables +//--------------------------------------------------------------------------- +UINT _cRef = 0; // COM Reference count. +HINSTANCE _hModule = NULL; // DLL Module. + +typedef struct{ + HKEY hRootKey; + LPTSTR szSubKey; + LPTSTR lpszValueName; + LPTSTR szData; +} DOREGSTRUCT, *LPDOREGSTRUCT; + +TCHAR szNppName[] = TEXT("notepad++.exe"); +TCHAR szShellExtensionTitle[] = TEXT("Notepad++"); + +BOOL RegisterServer(CLSID, LPTSTR); +BOOL UnregisterServer(CLSID, LPTSTR); +void MsgBox(LPTSTR); +void MsgBoxDebug(LPTSTR); +void MsgBoxError(LPTSTR); + +//--------------------------------------------------------------------------- +// DllMain +//--------------------------------------------------------------------------- +extern "C" int APIENTRY +DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { + if (dwReason == DLL_PROCESS_ATTACH) { + _hModule = hInstance; + } + return 1; +} + +//--------------------------------------------------------------------------- +// DllCanUnloadNow +//--------------------------------------------------------------------------- +STDAPI DllCanUnloadNow(void) { + return (_cRef == 0 ? S_OK : S_FALSE); +} + +//--------------------------------------------------------------------------- +// DllGetClassObject +//--------------------------------------------------------------------------- +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut) { + *ppvOut = NULL; + if (IsEqualIID(rclsid, CLSID_ShellExtension)) { + CShellExtClassFactory *pcf = new CShellExtClassFactory; + return pcf->QueryInterface(riid, ppvOut); + } + return CLASS_E_CLASSNOTAVAILABLE; +} + +//--------------------------------------------------------------------------- +// DllRegisterServer +//--------------------------------------------------------------------------- +STDAPI DllRegisterServer() { + return (RegisterServer(CLSID_ShellExtension, szShellExtensionTitle) ? S_OK : E_FAIL); +} + +//--------------------------------------------------------------------------- +// DllUnregisterServer +//--------------------------------------------------------------------------- +STDAPI DllUnregisterServer(void) { + return (UnregisterServer(CLSID_ShellExtension, szShellExtensionTitle) ? S_OK : E_FAIL); +} + +//--------------------------------------------------------------------------- +// CheckNpp +//--------------------------------------------------------------------------- +BOOL CheckNpp() { + TCHAR szModuleFullName[MAX_PATH]; + TCHAR szExeFullName[MAX_PATH]; + int nLenPath = 0; + TCHAR* pDest; + LPTSTR *lpFilePart = NULL; + + GetModuleFileName(_hModule, szModuleFullName, MAX_PATH); + pDest = generic_strrchr(szModuleFullName, '\\' ); + pDest++; + pDest[0] = 0; + + DWORD dw = SearchPath(szModuleFullName, szShellExtensionTitle, TEXT(".exe"), MAX_PATH, szExeFullName, lpFilePart); + + return (dw ? TRUE : FALSE); +} + +//--------------------------------------------------------------------------- +// RegisterServer +//--------------------------------------------------------------------------- +BOOL RegisterServer(CLSID clsid, LPTSTR lpszTitle) { + int i; + HKEY hKey; + LRESULT lResult; + DWORD dwDisp; + TCHAR szSubKey[MAX_PATH]; + TCHAR szCLSID[MAX_PATH]; + TCHAR szModule[MAX_PATH]; + LPWSTR pwsz; + + if (!CheckNpp()) { + MsgBoxError(TEXT("To register the Notepad++ context menu extension,\r\ninstall nppcm.dll in the same directory than Notepad++.exe.")); + return FALSE; + } + + StringFromIID(clsid, &pwsz); + if(pwsz) { +#ifdef UNICODE + lstrcpy(szCLSID, pwsz); +#else + WideCharToMultiByte(CP_ACP, 0, pwsz, -1, szCLSID, ARRAYSIZE(szCLSID), NULL, NULL); +#endif + //free the string + LPMALLOC pMalloc; + CoGetMalloc(1, &pMalloc); + pMalloc->Free(pwsz); + pMalloc->Release(); + } + + //get this app's path and file name + GetModuleFileName(_hModule, szModule, MAX_PATH); + + DOREGSTRUCT ClsidEntries[] = { + HKEY_CLASSES_ROOT, TEXT("CLSID\\%s"), NULL, lpszTitle, + HKEY_CLASSES_ROOT, TEXT("CLSID\\%s\\InprocServer32"), NULL, szModule, + HKEY_CLASSES_ROOT, TEXT("CLSID\\%s\\InprocServer32"), TEXT("ThreadingModel"), TEXT("Apartment"), + HKEY_CLASSES_ROOT, TEXT("*\\shellex\\ContextMenuHandlers\\Notepad++"), NULL, szCLSID, + NULL, NULL, NULL, NULL + }; + + // Register the CLSID entries + for(i = 0; ClsidEntries[i].hRootKey; i++) { + // Create the sub key string - for this case, insert the file extension + wsprintf(szSubKey, ClsidEntries[i].szSubKey, szCLSID); + lResult = RegCreateKeyEx(ClsidEntries[i].hRootKey, szSubKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hKey, &dwDisp); + if(NOERROR == lResult) { + TCHAR szData[MAX_PATH]; + // If necessary, create the value string + wsprintf(szData, ClsidEntries[i].szData, szModule); + lResult = RegSetValueEx(hKey, ClsidEntries[i].lpszValueName, 0, REG_SZ, (LPBYTE)szData, (lstrlen(szData) + 1) * sizeof(TCHAR)); + RegCloseKey(hKey); + } + else + return FALSE; + } + return TRUE; +} + +//--------------------------------------------------------------------------- +// UnregisterServer +//--------------------------------------------------------------------------- +BOOL UnregisterServer(CLSID clsid, LPTSTR lpszTitle) { + TCHAR szCLSID[GUID_SIZE + 1]; + TCHAR szCLSIDKey[GUID_SIZE + 32]; + TCHAR szKeyTemp[MAX_PATH + GUID_SIZE]; + LPWSTR pwsz; + + StringFromIID(clsid, &pwsz); + if(pwsz) { +#ifdef UNICODE + lstrcpy(szCLSID, pwsz); +#else + WideCharToMultiByte(CP_ACP, 0, pwsz, -1, szCLSID, ARRAYSIZE(szCLSID), NULL, NULL); +#endif + //free the string + LPMALLOC pMalloc; + CoGetMalloc(1, &pMalloc); + pMalloc->Free(pwsz); + pMalloc->Release(); + } + + lstrcpy(szCLSIDKey, TEXT("CLSID\\")); + lstrcat(szCLSIDKey, szCLSID); + + wsprintf(szKeyTemp, TEXT("*\\shellex\\ContextMenuHandlers\\%s"), lpszTitle); + RegDeleteKey(HKEY_CLASSES_ROOT, szKeyTemp); + + wsprintf(szKeyTemp, TEXT("%s\\%s"), szCLSIDKey, TEXT("InprocServer32")); + RegDeleteKey(HKEY_CLASSES_ROOT, szKeyTemp); + RegDeleteKey(HKEY_CLASSES_ROOT, szCLSIDKey); + + return TRUE; +} + +//--------------------------------------------------------------------------- +// MsgBoxDebug +//--------------------------------------------------------------------------- +void MsgBoxDebug(LPTSTR lpszMsg) { + MessageBox(NULL, + lpszMsg, + TEXT("DEBUG"), + MB_OK); +} + +//--------------------------------------------------------------------------- +// MsgBox +//--------------------------------------------------------------------------- +void MsgBox(LPTSTR lpszMsg) { + MessageBox(NULL, + lpszMsg, + TEXT("Notepad++ Extension"), + MB_OK); +} + +//--------------------------------------------------------------------------- +// MsgBoxError +//--------------------------------------------------------------------------- +void MsgBoxError(LPTSTR lpszMsg) { + MessageBox(NULL, + lpszMsg, + TEXT("Notepad++ Extension"), + MB_OK | MB_ICONSTOP); +} + +//--------------------------------------------------------------------------- +// CShellExtClassFactory +//--------------------------------------------------------------------------- +CShellExtClassFactory::CShellExtClassFactory() { + m_cRef = 0L; + _cRef++; +} + +CShellExtClassFactory::~CShellExtClassFactory() { + _cRef--; +} + +STDMETHODIMP CShellExtClassFactory::QueryInterface(REFIID riid, LPVOID FAR *ppv) { + *ppv = NULL; + if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) { + *ppv = (LPCLASSFACTORY)this; + AddRef(); + return NOERROR; + } + return E_NOINTERFACE; +} + +STDMETHODIMP_(ULONG) CShellExtClassFactory::AddRef() { + return ++m_cRef; +} + +STDMETHODIMP_(ULONG) CShellExtClassFactory::Release() +{ + if (--m_cRef) + return m_cRef; + delete this; + return 0L; +} + +STDMETHODIMP CShellExtClassFactory::CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, LPVOID *ppvObj) { + *ppvObj = NULL; + if (pUnkOuter) + return CLASS_E_NOAGGREGATION; + LPCSHELLEXT pShellExt = new CShellExt(); + if (NULL == pShellExt) + return E_OUTOFMEMORY; + return pShellExt->QueryInterface(riid, ppvObj); +} + +STDMETHODIMP CShellExtClassFactory::LockServer(BOOL fLock) { + return NOERROR; +} + +//--------------------------------------------------------------------------- +// CShellExt +//--------------------------------------------------------------------------- +CShellExt::CShellExt() { + m_cRef = 0L; + m_pDataObj = NULL; + _cRef++; + m_hNppBmp = LoadBitmap(_hModule, MAKEINTRESOURCE(IDB_NPP)); + HRESULT hr; + hr = SHGetMalloc(&m_pAlloc); + if (FAILED(hr)) + m_pAlloc = NULL; +} + +CShellExt::~CShellExt() { + if (m_pDataObj) + m_pDataObj->Release(); + _cRef--; + m_pAlloc->Release(); +} + +STDMETHODIMP CShellExt::QueryInterface(REFIID riid, LPVOID FAR *ppv) { + *ppv = NULL; + if (IsEqualIID(riid, IID_IShellExtInit) || IsEqualIID(riid, IID_IUnknown)) { + *ppv = (LPSHELLEXTINIT)this; + } + else if (IsEqualIID(riid, IID_IContextMenu)) { + *ppv = (LPCONTEXTMENU)this; + } + if (*ppv) { + AddRef(); + return NOERROR; + } + return E_NOINTERFACE; +} + +STDMETHODIMP_(ULONG) CShellExt::AddRef() { + return ++m_cRef; +} + +STDMETHODIMP_(ULONG) CShellExt::Release() { + if (--m_cRef) + return m_cRef; + delete this; + return 0L; +} + +STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder, LPDATAOBJECT pDataObj, HKEY hRegKey) { + HRESULT hres = 0; + if (m_pDataObj) + m_pDataObj->Release(); + if (pDataObj) { + m_pDataObj = pDataObj; + pDataObj->AddRef(); + } + return NOERROR; +} + +STDMETHODIMP CShellExt::QueryContextMenu(HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) { + UINT idCmd = idCmdFirst; + BOOL bAppendItems=TRUE; + TCHAR szItemNpp[] = TEXT("Edit with &Notepad++"); + + FORMATETC fmte = { + CF_HDROP, + (DVTARGETDEVICE FAR *)NULL, + DVASPECT_CONTENT, + -1, + TYMED_HGLOBAL + }; + + HRESULT hres = m_pDataObj->GetData(&fmte, &m_stgMedium); + + if (SUCCEEDED(hres)) { + if (m_stgMedium.hGlobal) + m_cbFiles = DragQueryFile((HDROP)m_stgMedium.hGlobal, (UINT)-1, 0, 0); + } + + UINT nIndex = indexMenu++; + InsertMenu(hMenu, nIndex, MF_STRING|MF_BYPOSITION, idCmd++, szItemNpp); + + if (m_hNppBmp) { + SetMenuItemBitmaps (hMenu, nIndex, MF_BYPOSITION, m_hNppBmp, m_hNppBmp); + } + + return ResultFromShort(idCmd-idCmdFirst); +} + +STDMETHODIMP CShellExt::InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi) { + HRESULT hr = E_INVALIDARG; + + if (!HIWORD(lpcmi->lpVerb)) { + UINT idCmd = LOWORD(lpcmi->lpVerb); + switch(idCmd) { + case 0: + hr = InvokeNpp(lpcmi->hwnd, lpcmi->lpDirectory, lpcmi->lpVerb, lpcmi->lpParameters, lpcmi->nShow); + break; + } + } + return hr; +} + +STDMETHODIMP CShellExt::GetCommandString(UINT idCmd, UINT uFlags, UINT FAR *reserved, LPSTR pszName, UINT cchMax) { + if (uFlags == GCS_HELPTEXT && cchMax > 35) + strcpy(pszName, "Edits the selected file(s) with Notepad++"); + return NOERROR; +} + +static void getNppName(TCHAR *name) { + TCHAR szModuleFullName[MAX_PATH]; + int nLenPath = 0; + TCHAR* pDest; + + name[0] = 0; + GetModuleFileName(_hModule, szModuleFullName, MAX_PATH); + pDest = generic_strrchr(szModuleFullName, '\\' ); + pDest++; + pDest[0] = 0; + lstrcpy(name, szModuleFullName); + lstrcat(name, szNppName); + + if (name[0] == 0) + lstrcpy(name, szNppName); +} + +STDMETHODIMP CShellExt::InvokeNpp(HWND hParent, LPCSTR pszWorkingDir, LPCSTR pszCmd, LPCSTR pszParam, int iShowCmd) { + TCHAR szFileUserClickedOn[MAX_PATH]; + LPTSTR pszCommand; + UINT i; + + FORMATETC fmte = { + CF_HDROP, + (DVTARGETDEVICE FAR *)NULL, + DVASPECT_CONTENT, + -1, + TYMED_HGLOBAL + }; + + pszCommand = (LPTSTR)m_pAlloc->Alloc(MAX_PATH * (m_cbFiles + 1) * sizeof(TCHAR)); + + if (pszCommand) + getNppName(pszCommand); + else { + MsgBoxError(TEXT("Insufficient memory available.")); + return E_FAIL; + } + + for (i = 0; i < m_cbFiles; i++) { + DragQueryFile((HDROP)m_stgMedium.hGlobal, i, szFileUserClickedOn, MAX_PATH); + lstrcat(pszCommand, TEXT(" \"")); + lstrcat(pszCommand, szFileUserClickedOn); + lstrcat(pszCommand, TEXT("\"")); + } + + STARTUPINFO si; + PROCESS_INFORMATION pi; + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + si.dwFlags = STARTF_USESHOWWINDOW; + si.wShowWindow = SW_RESTORE; + if (!CreateProcess (NULL, pszCommand, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { + MessageBox(hParent, + TEXT("Error creating process: nppcm.dll needs to be in the same directory than notepad++.exe"), + TEXT("Notepad++ Extension"), + MB_OK); + } + + m_pAlloc->Free(pszCommand); + return NOERROR; +} diff --git a/PowerEditor/src/tools/nppCM/nppcm.def b/PowerEditor/src/tools/nppCM/nppcm.def new file mode 100644 index 00000000..f60eedd3 --- /dev/null +++ b/PowerEditor/src/tools/nppCM/nppcm.def @@ -0,0 +1,10 @@ +;nppcm.def : Declares the module parameters for the DLL. + +LIBRARY nppcm +DESCRIPTION 'Notepad++ Shell Extension' + +EXPORTS + DllCanUnloadNow PRIVATE + DllGetClassObject PRIVATE + DllRegisterServer PRIVATE + DllUnregisterServer PRIVATE diff --git a/PowerEditor/src/tools/nppCM/nppcm.h b/PowerEditor/src/tools/nppCM/nppcm.h new file mode 100644 index 00000000..f3b0ed34 --- /dev/null +++ b/PowerEditor/src/tools/nppCM/nppcm.h @@ -0,0 +1,79 @@ +//--------------------------------------------------------------------------- +// Copyright 2002-2003 by Andre Burgaud +// See license.txt +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// wscitecm.h +//--------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- +// Modified by Don HO +// to meet the need of Notepad++ +//--------------------------------------------------------------------------- + +// {120b94b5-2e6a-4f13-94d0-414bcb64fa0f} +DEFINE_GUID(CLSID_ShellExtension, 0x120b94b5, 0x2e6a, 0x4f13, 0x94, 0xd0, 0x41, 0x4b, 0xcb, 0x64, 0xfa, 0x0f); + + +class CShellExtClassFactory : public IClassFactory { +protected: + ULONG m_cRef; + +public: + CShellExtClassFactory(); + ~CShellExtClassFactory(); + + STDMETHODIMP QueryInterface(REFIID, LPVOID FAR *); + STDMETHODIMP_(ULONG) AddRef(); + STDMETHODIMP_(ULONG) Release(); + STDMETHODIMP CreateInstance(LPUNKNOWN, REFIID, LPVOID FAR *); + STDMETHODIMP LockServer(BOOL); +}; +typedef CShellExtClassFactory *LPCSHELLEXTCLASSFACTORY; + +class CShellExt : public IContextMenu, IShellExtInit { +public: +protected: + ULONG m_cRef; + UINT m_cbFiles; + STGMEDIUM m_stgMedium; + LPDATAOBJECT m_pDataObj; + HBITMAP m_hNppBmp; + LPMALLOC m_pAlloc; + TCHAR m_szDllDir [MAX_PATH]; + + STDMETHODIMP InvokeNpp(HWND hParent, + LPCSTR pszWorkingDir, + LPCSTR pszCmd, + LPCSTR pszParam, + int iShowCmd); + +public: + CShellExt(); + ~CShellExt(); + + STDMETHODIMP QueryInterface(REFIID, LPVOID FAR *); + STDMETHODIMP_(ULONG) AddRef(); + STDMETHODIMP_(ULONG) Release(); + + STDMETHODIMP QueryContextMenu(HMENU hMenu, + UINT indexMenu, + UINT idCmdFirst, + UINT idCmdLast, + UINT uFlags); + + STDMETHODIMP InvokeCommand(LPCMINVOKECOMMANDINFO lpcmi); + + STDMETHODIMP GetCommandString(UINT idCmd, + UINT uFlags, + UINT FAR *reserved, + LPSTR pszName, + UINT cchMax); + + STDMETHODIMP Initialize(LPCITEMIDLIST pIDFolder, + LPDATAOBJECT pDataObj, + HKEY hKeyID); +}; + +typedef CShellExt *LPCSHELLEXT; diff --git a/PowerEditor/src/tools/nppCM/nppcm.rc b/PowerEditor/src/tools/nppCM/nppcm.rc new file mode 100644 index 00000000..62d03b71 --- /dev/null +++ b/PowerEditor/src/tools/nppCM/nppcm.rc @@ -0,0 +1,116 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 1,3,0,0 + PRODUCTVERSION 1,3,0,0 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x3L +#else + FILEFLAGS 0x2L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", "\0" + VALUE "CompanyName", "Burgaud.com\0" + VALUE "FileDescription", "Context Handler Menu for Notepad++\0" + VALUE "FileVersion", "1.3\0" + VALUE "InternalName", "\0" + VALUE "LegalCopyright", "Copyright © 2000-2003 Andre Burgaud\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "nppcm.dll\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "\0" + VALUE "ProductVersion", "1.3\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END + +#endif // !_MAC + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Bitmap +// + +IDB_NPP BITMAP DISCARDABLE "npp.bmp" +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/PowerEditor/src/tools/nppCM/readme.txt b/PowerEditor/src/tools/nppCM/readme.txt new file mode 100644 index 00000000..a2f3bdcc --- /dev/null +++ b/PowerEditor/src/tools/nppCM/readme.txt @@ -0,0 +1,62 @@ + +Overview +-------- +nppcm.dll is a shell extension component for Notepad++. +This component is modified from the MIT open source project WSciTEcm +(Context Menu Extension for SciTE), made by Andre Burgaud , +to meet the need of Notepad++. +Installing this Context Menu Handler (nppcm.dll) creates a new command +"Edit with Notepad++" in the context menu of Windows Explorer. +You can quickly open one or several selected files in Windows Explorer: +right click on the selection and click on the command "Edit with Notepad++". + +The manual installation is describe in the following sections. + + +Installation +------------ +1) Copy nppcm.dll in Notepad++ directory. +2) In Notepad++ directory installation, type the command "regsvr32 nppcm.dll". +This will register the dll. + +If everything goes well, you should have "Edit with Notepad++" +when you right click on selected file(s) in Windows Explorer. + +Uninstallation +-------------- +In Notepad++ directory installation, type the command "regsvr32 /u nppcm.dll". + + +Unload the dll +-------------- +If you try to delete or override the dll file and you get the error "Access is +denied.", the library is already loaded. +There are several options to workaround this issue: + +Solution 1: +- Close all the Windows Explorer instances open on your desktop and copy +nppcm.dll using the command line (Example : "C:/>cp nppcm.dll "). + +Solution 2: +- Reboot the computer and delete or override nppcm.dll (with the command line) +before starting Windows Explorer and using the context menu (right-click). + +Solution 3: +- Open a command line window +- Type CTRL+ALT+DEL to display the Windows Task Manager, display the Process tab +and "kill" the explorer.exe process. +- If your exlorer did not restart automatically, start it manually from the command line window +(c:/>explorer) +- Delete or override nppcm.dll before using the context menu (Example: "C:/>cp nppcm.dll "). + +Build +----- +nppcm.dll is built with Visual C++ 6.0. A Makefile is provided with the +sources: in the source directory, type "nmake". Ensure that all the +environment variables and paths are set correctly. To do so, use the command +file "VCVARS32.BAT" available in the bin directory of Visual C++ installation. + +License +------- +Copyright 2002-2003 by Andre Burgaud +See license.txt \ No newline at end of file diff --git a/PowerEditor/src/tools/nppCM/resource.h b/PowerEditor/src/tools/nppCM/resource.h new file mode 100644 index 00000000..6754d602 --- /dev/null +++ b/PowerEditor/src/tools/nppCM/resource.h @@ -0,0 +1,17 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by wscitecm.rc +// +#define IDI_SCITE 101 +#define IDB_NPP 102 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 104 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/PowerEditor/src/tools/xmlApiSorter/sorter.cpp b/PowerEditor/src/tools/xmlApiSorter/sorter.cpp new file mode 100644 index 00000000..5952bbc8 --- /dev/null +++ b/PowerEditor/src/tools/xmlApiSorter/sorter.cpp @@ -0,0 +1,176 @@ +#include +#include +#include "tinyxml.h" + +#include +#include + +using namespace std; + +struct xmlname{ + TiXmlElement * node; + const char * name; + xmlname(TiXmlElement * n, const char * na) { node = n; name = na;} +}; + +//true if x1 smaller +bool sortXMLCase(const xmlname & x1, const xmlname & x2) { + return (strcmp(x1.name, x2.name) < 0); +} + +inline bool lower(char c) { + return (c >= 'a' && c <= 'z'); +} + +inline bool match(char c1, char c2) { + if (c1 == c2) return true; + if (lower(c1)) + return ((c1-32) == c2); + if (lower(c2)) + return ((c2-32) == c1); + return false; +} + +//true if x1 smaller +bool sortXML(const xmlname & x1, const xmlname & x2) { + + const char * n1 = x1.name, * n2 = x2.name; + int i = 0; + while(match(n2[i], n1[i])) { + if (n1[i] == 0) { + return true; //equal + } + i++; + } + + int subs1 = lower(n1[i])?32:0; + int subs2 = lower(n2[i])?32:0; + + return ( (n1[i]-subs1) < (n2[i]-subs2) ); + +} + +void merge(TiXmlElement * n1, TiXmlElement * n2); + +int main(int argc, char *argv[]) +{ + const char * file = NULL; + + if (argc < 2) { + cout << "Usage: sorter.exe xmlfile.xml" << endl; + return 1; + } + file = argv[1]; + + TiXmlDocument *pXmlApi = NULL; + pXmlApi = new TiXmlDocument(file); + bool loadOkay = pXmlApi->LoadFile(); + if (!loadOkay) return 1; + + TiXmlNode *root = pXmlApi->FirstChild("NotepadPlus"); + if (!root) { + cout << "NotepadPlus node not found\n"; + return 1; + } + TiXmlElement *autoc = root->FirstChildElement("AutoComplete"); + if (!autoc) { + cout << "AutoComplete node not found\n"; + return 1; + } + const char * langName = autoc->Attribute("language"); + + TiXmlElement *envNode = autoc->FirstChildElement("Environment"); + bool ignoreCase = false; + if (envNode) { + cout << "Found environment settings\n"; + const char * ignoreCaseText = envNode->Attribute("ignoreCase"); + if (ignoreCaseText) { + ignoreCase = (strcmp(ignoreCaseText, "yes") == 0); + if (ignoreCase) { + cout << "Sorting case insensitive\n"; + } else { + cout << "Sorting case sensitive\n"; + } + } else { + cout <<"Cannot find attribute \"ignoreCase\", defaulting to case sensitive sort\nConsider adding the node\n"; + } + } else { + cout << "No environment settings found, defaulting to case sensitive sort\nConsider adding the node\n"; + } + + vector words; + for (TiXmlElement *childNode = autoc->FirstChildElement("KeyWord"); + childNode ; + childNode = childNode->NextSiblingElement("KeyWord") ) + { + const char * name = childNode->Attribute("name"); + if (!name) { + cout << "Warning: KeyWord without name!, skipping...\n"; + continue; + } else { + int i = 0; + while(name[i] != 0) { + if (!isalnum(name[i]) && name[i] != '_') { + cout << "Warning, keyword " << name << " contains unsupported characters!\n"; + break; + } + i++; + } + words.push_back(xmlname(childNode, name)); + } + } + + if (ignoreCase) + sort(words.begin(), words.end(), sortXML); + else + sort(words.begin(), words.end(), sortXMLCase); + + for(size_t i = 1; i < words.size(); i++) { + //merge duplicates + if (!strcmp(words[i].name, words[i-1].name)) { + merge(words[i-1].node, words[i].node); + words.erase(words.begin() + i); + } + } + + TiXmlDocument doc; + TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "Windows-1252", "" ); + doc.LinkEndChild( decl ); + TiXmlElement * element = new TiXmlElement( "NotepadPlus" ); + doc.LinkEndChild( element ); + TiXmlElement * element2 = new TiXmlElement( "AutoComplete" ); + element->LinkEndChild( element2 ); + + if (langName) + element2->SetAttribute("language", langName); + + if (envNode) + element2->LinkEndChild(envNode); + + for(size_t i = 0; i < words.size(); i++) { + element2->LinkEndChild(words[i].node); + } + + doc.SaveFile( file ); + + return 0; +} + +void merge(TiXmlElement * n1, TiXmlElement * n2) { + const char * funcAttr = NULL; + funcAttr = n2->Attribute("func"); + if (!funcAttr || !strcmp(funcAttr, "yes")) { + return; + } + + n1->SetAttribute("func", "yes"); + + for (TiXmlElement *childNode = n2->FirstChildElement("Overload"); + childNode ; + childNode = childNode->NextSiblingElement("Overload") ) + { + n1->LinkEndChild(childNode); + } + + return; +} diff --git a/PowerEditor/src/tools/xmlApiSorter/sorter.vcproj b/PowerEditor/src/tools/xmlApiSorter/sorter.vcproj new file mode 100644 index 00000000..45dcfb16 --- /dev/null +++ b/PowerEditor/src/tools/xmlApiSorter/sorter.vcproj @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PowerEditor/src/tools/xmlUpdater/configModel.xml b/PowerEditor/src/tools/xmlUpdater/configModel.xml new file mode 100644 index 00000000..bcef6f65 --- /dev/null +++ b/PowerEditor/src/tools/xmlUpdater/configModel.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/PowerEditor/src/tools/xmlUpdater/langsModel.xml b/PowerEditor/src/tools/xmlUpdater/langsModel.xml new file mode 100644 index 00000000..ba690cfa --- /dev/null +++ b/PowerEditor/src/tools/xmlUpdater/langsModel.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/PowerEditor/src/tools/xmlUpdater/makefile b/PowerEditor/src/tools/xmlUpdater/makefile new file mode 100644 index 00000000..19af6758 --- /dev/null +++ b/PowerEditor/src/tools/xmlUpdater/makefile @@ -0,0 +1,56 @@ +# this file is part of notepad++ +# Copyright (C)2003 Don HO ( donho@altern.org ) +# +# 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. +# +# This program is distributed in the hope that it will be useful, +# 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. + +.SUFFIXES: .cpp +CPP = g++ +CFLAGS = -Wall -Os -DNDEBUG + +MAINOBJS = xmlUpdater.o +TINYXMLOBJS = tinystr.o tinyxml.o tinyxmlerror.o tinyxmlparser.o + +TINYXMLDIR = ../../TinyXml + +OBJS = $(MAINOBJS) $(TINYXMLOBJS) + +PROG = xmlUpdater.exe + +INCLUDEDIR = $(TINYXMLDIR) +INCLUDEFLAGS = -I$(INCLUDEDIR) +LDFLAGS = +#-mwindows -lshlwapi -Os -s + +ALL : $(PROG) + + +$(PROG) : $(OBJS) + $(CPP) -o $@ $(OBJS) $(LDFLAGS) + +xmlUpdater.o : $(INCLUDEDIR)/tinyxml.h + $(CPP) -c xmlUpdater.cpp -o $@ $(INCLUDEFLAGS) + +tinystr.o: $(TINYXMLDIR)/tinystr.h $(TINYXMLDIR)/tinyxml.h + $(CPP) $(CFLAGS) -c $(TINYXMLDIR)/tinystr.cpp -o $@ $(INCLUDEFLAGS) + +tinyxml.o: $(TINYXMLDIR)/tinyxml.h + $(CPP) $(CFLAGS) -c $(TINYXMLDIR)/tinyxml.cpp -o $@ $(INCLUDEFLAGS) + +tinyxmlerror.o: $(TINYXMLDIR)/tinyxml.h + $(CPP) $(CFLAGS) -c $(TINYXMLDIR)/tinyxmlerror.cpp -o $@ $(INCLUDEFLAGS) + +tinyxmlparser.o: $(TINYXMLDIR)/tinyxml.h + $(CPP) $(CFLAGS) -c $(TINYXMLDIR)/tinyxmlparser.cpp -o $@ $(INCLUDEFLAGS) + diff --git a/PowerEditor/src/tools/xmlUpdater/stylers_remove.xml b/PowerEditor/src/tools/xmlUpdater/stylers_remove.xml new file mode 100644 index 00000000..041502ca --- /dev/null +++ b/PowerEditor/src/tools/xmlUpdater/stylers_remove.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/PowerEditor/src/tools/xmlUpdater/stylesModel.xml b/PowerEditor/src/tools/xmlUpdater/stylesModel.xml new file mode 100644 index 00000000..16bf01a0 --- /dev/null +++ b/PowerEditor/src/tools/xmlUpdater/stylesModel.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/PowerEditor/src/tools/xmlUpdater/xmlUpdater.cpp b/PowerEditor/src/tools/xmlUpdater/xmlUpdater.cpp new file mode 100644 index 00000000..e0231981 --- /dev/null +++ b/PowerEditor/src/tools/xmlUpdater/xmlUpdater.cpp @@ -0,0 +1,337 @@ +/* +this file is part of notepad++ +Copyright (C)2003 Don HO ( donho@altern.org ) + +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. + +This program is distributed in the hope that it will be useful, +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. +*/ + +#include +#include "tinyxml.h" +#define MODEL_INVALID 1 +#define SRC_INVALID 2 +#define DEST_INVALID 3 + +static bool isInList(const char *token2Find, char *list2Clean) { + char word[1024]; + bool isFileNamePart = false; + + for (int i = 0, j = 0 ; i <= int(strlen(list2Clean)) ; i++) + { + if ((list2Clean[i] == ' ') || (list2Clean[i] == '\0')) + { + if ((j) && (!isFileNamePart)) + { + word[j] = '\0'; + j = 0; + bool bingo = !strcmp(token2Find, word); + + if (bingo) + { + int wordLen = int(strlen(word)); + int prevPos = i - wordLen; + + for (i = i + 1 ; i <= int(strlen(list2Clean)) ; i++, prevPos++) + list2Clean[prevPos] = list2Clean[i]; + + list2Clean[prevPos] = '\0'; + + return true; + } + } + } + else if (list2Clean[i] == '"') + { + isFileNamePart = !isFileNamePart; + } + else + { + word[j++] = list2Clean[i]; + } + } + return false; +}; + + +void update(TiXmlNode *modelNode, TiXmlNode *srcNode, TiXmlNode *destNode) { + TiXmlNode *srcChildNode = NULL; + TiXmlNode *destChildNode = NULL; + TiXmlNode *modelChildNode = modelNode->FirstChild("Node"); + + if (!srcNode) return; + + for (modelChildNode = modelNode->FirstChild("Node"); + modelChildNode; + modelChildNode = modelChildNode->NextSibling("Node")) + { + const char *nodeName = (modelChildNode->ToElement())->Attribute("nodeName"); + const char *name = (modelChildNode->ToElement())->Attribute("name"); + if (nodeName) + { + srcChildNode = srcNode->FirstChild(nodeName); + if (!srcChildNode) continue; + + destChildNode = destNode->FirstChild(nodeName); + if (!destChildNode) + { + //Insertion + destNode->InsertEndChild(*srcChildNode); + continue; + } + if (name && name[0]) + { + srcChildNode = srcNode->FirstChild(nodeName); + while (srcChildNode) + { + const char *attrib = (srcChildNode->ToElement())->Attribute(name); + if (attrib) + { + const char *action = (srcChildNode->ToElement())->Attribute("action"); + bool remove = false; + bool found = false; + + if (action && !strcmp(action, "remove")) + remove = true; + + destChildNode = destNode->FirstChild(nodeName); + while (destChildNode) + { + const char *attribDest = (destChildNode->ToElement())->Attribute(name); + if ((attribDest) && (!strcmp(attrib, attribDest))) + { + found = true; + break; + } + destChildNode = destChildNode->NextSibling(nodeName); + } + if (remove) + { + if (found) destNode->RemoveChild(destChildNode); + } + else + { + if (found) + update(modelChildNode, srcChildNode, destChildNode); + else + destNode->InsertEndChild(*srcChildNode); + } + } + srcChildNode = srcChildNode->NextSibling(nodeName); + } // while srcChildNode + } + } + update(modelChildNode, srcChildNode, destChildNode); + } +}; + + +int main(int argc, char *argv[]) +{ + if (argc != 4) + { + printf("Syntax : xmlUpdater model.xml src.xml dest.xml"); + return -1; + } + + char *xmlModelPath = argv[1]; + char *xmlSrcPath = argv[2]; + char *xmlDestPath = argv[3]; + + //printf("%s\n", xmlModelPath); + //printf("%s\n", xmlSrcPath); + //printf("%s\n", xmlDestPath); + + TiXmlDocument *pXmlModel = NULL; + TiXmlDocument *pXmlSrc = NULL; + TiXmlDocument *pXmlDest = NULL; + + try { + pXmlModel = new TiXmlDocument(xmlModelPath); + bool loadOkay = pXmlModel->LoadFile(); + if (!loadOkay) throw int(MODEL_INVALID); + + pXmlSrc = new TiXmlDocument(xmlSrcPath); + loadOkay = pXmlSrc->LoadFile(); + if (!loadOkay) throw int(SRC_INVALID); + + pXmlDest = new TiXmlDocument(xmlDestPath); + loadOkay = pXmlDest->LoadFile(); + if (!loadOkay) throw int(DEST_INVALID); + + TiXmlNode *root = pXmlModel->FirstChild("Node"); + const char *nodeRootName = (root->ToElement())->Attribute("nodeName"); + if (nodeRootName) + { + TiXmlNode *srcRoot = pXmlSrc->FirstChild(nodeRootName); + if (!srcRoot) throw int(4); + TiXmlNode *destRoot = pXmlDest->FirstChild(nodeRootName); + if (!destRoot) + { + throw int(DEST_INVALID); + } + else + { + update(root, srcRoot, destRoot); + } + } + } catch (int errMsg) { + char *msg; + if (errMsg == MODEL_INVALID) + msg = "Model file is invalidated"; + if (errMsg == SRC_INVALID) + msg = "Source file is invalidated"; + if (errMsg == DEST_INVALID) + msg = "File to update is invalidated"; + + if (pXmlModel) delete pXmlModel; + if (pXmlSrc) delete pXmlSrc; + if (pXmlDest) delete pXmlDest; + + printf("Update Failure"); + return -1; + } + + pXmlDest->SaveFile(); + + delete pXmlModel; + delete pXmlSrc; + delete pXmlDest; + printf("Update successful"); + + return 0; +} + +/* +const char FLAG_SILENT[] = "-silent"; + +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR lpszCmdLine, int nCmdShow) +//int main(int argc, char *argv[]) +{ + bool isSilentMode = isInList(FLAG_SILENT, lpszCmdLine); + + int argc=0; + LPSTR argv[10]; + LPSTR p, q; + + argv[argc] = "xmlUpdater.exe"; + // Parse command line handling quotes. + p = lpszCmdLine; + while (*p) + { + // for each argument + while ((*p) && (*p == ' ')) + p++; // skip over leading spaces + if (*p == '\042') + { + p++; // skip " + q = p; + // scan to end of argument + // doesn't handle embedded quotes + while ((*p) && (*p != '\042')) + p++; + argv[++argc] = q; + if (*p) + *p++ = '\0'; + } + else if (*p) + { + // delimited by spaces + q = p; + while ((*p) && (*p != ' ')) + p++; + argv[++argc] = q; + if (*p) + *p++ = '\0'; + } + } + argv[++argc] = (LPSTR)NULL; + + if (argc < 4) + { + //printf(); + if (!isSilentMode) + MessageBox(NULL, "xmlUpdater model.xml src.xml dest.xml", "Syntax", MB_OK); + return -1; + } + + char *xmlModelPath = argv[1]; + char *xmlSrcPath = argv[2]; + char *xmlDestPath = argv[3]; + + //printf("%s\n", xmlModelPath); + //printf("%s\n", xmlSrcPath); + //printf("%s\n", xmlDestPath); + + TiXmlDocument *pXmlModel = NULL; + TiXmlDocument *pXmlSrc = NULL; + TiXmlDocument *pXmlDest = NULL; + + try { + pXmlModel = new TiXmlDocument(xmlModelPath); + bool loadOkay = pXmlModel->LoadFile(); + if (!loadOkay) throw int(MODEL_INVALID); + + pXmlSrc = new TiXmlDocument(xmlSrcPath); + loadOkay = pXmlSrc->LoadFile(); + if (!loadOkay) throw int(SRC_INVALID); + + pXmlDest = new TiXmlDocument(xmlDestPath); + loadOkay = pXmlDest->LoadFile(); + if (!loadOkay) throw int(DEST_INVALID); + + TiXmlNode *root = pXmlModel->FirstChild("Node"); + const char *nodeRootName = (root->ToElement())->Attribute("nodeName"); + if (nodeRootName) + { + TiXmlNode *srcRoot = pXmlSrc->FirstChild(nodeRootName); + if (!srcRoot) throw int(4); + TiXmlNode *destRoot = pXmlDest->FirstChild(nodeRootName); + if (!destRoot) + { + throw int(DEST_INVALID); + } + else + { + update(root, srcRoot, destRoot); + } + } + } catch (int errMsg) { + char *msg; + if (errMsg == MODEL_INVALID) + msg = "Model file is invalidated"; + if (errMsg == SRC_INVALID) + msg = "Source file is invalidated"; + if (errMsg == DEST_INVALID) + msg = "File to update is invalidated"; + + if (pXmlModel) delete pXmlModel; + if (pXmlSrc) delete pXmlSrc; + if (pXmlDest) delete pXmlDest; + + if (!isSilentMode) + MessageBox(NULL, msg, "Update Failure", MB_OK); + return -1; + } + + pXmlDest->SaveFile(); + + delete pXmlModel; + delete pXmlSrc; + delete pXmlDest; + if (!isSilentMode) + MessageBox(NULL, "Update successful", "Update status", MB_OK); + + return 0; +} +*/ diff --git a/PowerEditor/src/tools/xmlUpdater/xmlUpdater.vcproj b/PowerEditor/src/tools/xmlUpdater/xmlUpdater.vcproj new file mode 100644 index 00000000..ad38fa48 --- /dev/null +++ b/PowerEditor/src/tools/xmlUpdater/xmlUpdater.vcproj @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PowerEditor/src/userDefineLang.xml b/PowerEditor/src/userDefineLang.xml new file mode 100644 index 00000000..d9dbac64 --- /dev/null +++ b/PowerEditor/src/userDefineLang.xml @@ -0,0 +1,62 @@ + + + + + + + + + BEGIN + END + , + 0// 1/* 0REM 2*/ + STYLE FONT DIALOGEX + COMBOBOX LTEXT CONTROL EDITTEXT + + + + + + + + + + + + + + + + + + + + + + + + + function procedure switch when forEach for while + endFunc endProc endSwitch endWhen endFor endWhile + - ( ) * , . / : ? @ [ ] + = + 0; + if elseif else endIf return break + + uses type self var _Result + Nil True False and or + + + + + + + + + + + + + + + + diff --git a/PowerEditor/src/winmain.cpp b/PowerEditor/src/winmain.cpp new file mode 100644 index 00000000..829a56f3 --- /dev/null +++ b/PowerEditor/src/winmain.cpp @@ -0,0 +1,383 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +#include "Common.h" +#include "Notepad_plus.h" +#include "Process.h" + +#include //default C++ exception +#include "Win32Exception.h" //Win32 exception +#include "MiniDumper.h" //Write dump files + +typedef std::vector ParamVector; + +bool checkSingleFile(const TCHAR * commandLine) { + TCHAR fullpath[MAX_PATH]; + ::GetFullPathName(commandLine, MAX_PATH, fullpath, NULL); + if (::PathFileExists(fullpath)) { + return true; + } + + return false; +} + +//commandLine should contain path to n++ executable running +void parseCommandLine(TCHAR * commandLine, ParamVector & paramVector) { + //params.erase(params.begin()); + //remove the first element, since thats the path the the executable (GetCommandLine does that) + TCHAR stopChar = TEXT(' '); + int i = 0; + if (commandLine[0] == TEXT('\"')) { + stopChar = TEXT('\"'); + commandLine++; + } + //while this is not really DBCS compliant, space and quote are in the lower 127 ASCII range + while(commandLine[0] && commandLine[0] != stopChar) + commandLine++; + commandLine++; //advance past stopChar + //kill remaining spaces + while(commandLine[0] == TEXT(' ')) + commandLine++; + + + bool isFile = checkSingleFile(commandLine); //if the commandline specifies only a file, open it as such + if (isFile) { + paramVector.push_back(commandLine); + return; + } + bool isInFile = false; + bool isInWhiteSpace = true; + paramVector.clear(); + size_t commandLength = lstrlen(commandLine); + for(size_t i = 0; i < commandLength; i++) { + switch(commandLine[i]) { + case '\"': { //quoted filename, ignore any following whitespace + if (!isInFile) { //" will always be treated as start or end of param, in case the user forgot to add an space + paramVector.push_back(commandLine+i+1); //add next param(since zero terminated generic_string original, no overflow of +1) + } + isInFile = !isInFile; + isInWhiteSpace = false; + //because we dont want to leave in any quotes in the filename, remove them now (with zero terminator) + commandLine[i] = 0; + break; } + case '\t': //also treat tab as whitespace + case ' ': { + isInWhiteSpace = true; + if (!isInFile) + commandLine[i] = 0; //zap spaces into zero terminators, unless its part of a filename + break; } + default: { //default TCHAR, if beginning of word, add it + if (!isInFile && isInWhiteSpace) { + paramVector.push_back(commandLine+i); //add next param + isInWhiteSpace = false; + } + break; } + } + } + //the commandline generic_string is now a list of zero terminated strings concatenated, and the vector contains all the substrings +} + +bool isInList(const TCHAR *token2Find, ParamVector & params) { + int nrItems = params.size(); + + for (int i = 0; i < nrItems; i++) + { + if (!lstrcmp(token2Find, params.at(i))) { + params.erase(params.begin() + i); + return true; + } + } + return false; +}; + +bool getParamVal(TCHAR c, ParamVector & params, generic_string & value) { + value = TEXT(""); + int nrItems = params.size(); + + for (int i = 0; i < nrItems; i++) + { + const TCHAR * token = params.at(i); + if (token[0] == '-' && lstrlen(token) >= 2 && token[1] == c) { //dash, and enough chars + value = (token+2); + params.erase(params.begin() + i); + return true; + } + } + return false; +} + +LangType getLangTypeFromParam(ParamVector & params) { + generic_string langStr; + if (!getParamVal('l', params, langStr)) + return L_EXTERNAL; + return NppParameters::getLangIDFromStr(langStr.c_str()); +}; + +int getNumberFromParam(char paramName, ParamVector & params, bool & isParamePresent) { + generic_string numStr; + if (!getParamVal(paramName, params, numStr)) + { + isParamePresent = false; + return -1; + } + isParamePresent = true; + return generic_atoi(numStr.c_str()); +}; +/* +int getLn2GoFromParam(ParamVector & params) { + generic_string lineNumStr; + if (!getParamVal('n', params, lineNumStr)) + return -1; + return generic_atoi(lineNumStr.c_str()); +}; + +int getPointXFromParam(ParamVector & params) { + generic_string pointXStr; + if (!getParamVal('x', params, pointXStr)) + return -1; + return generic_atoi(pointXStr.c_str()); +}; +*/ + +const TCHAR FLAG_MULTI_INSTANCE[] = TEXT("-multiInst"); +const TCHAR FLAG_NO_PLUGIN[] = TEXT("-noPlugin"); +const TCHAR FLAG_READONLY[] = TEXT("-ro"); +const TCHAR FLAG_NOSESSION[] = TEXT("-nosession"); +const TCHAR FLAG_NOTABBAR[] = TEXT("-notabbar"); + +void doException(Notepad_plus & notepad_plus_plus); + +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR cmdLineAnsi, int nCmdShow) +{ + LPTSTR cmdLine = ::GetCommandLine(); + ParamVector params; + parseCommandLine(cmdLine, params); + + MiniDumper mdump; //for debugging purposes. + + bool TheFirstOne = true; + ::SetLastError(NO_ERROR); + ::CreateMutex(NULL, false, TEXT("nppInstance")); + if (::GetLastError() == ERROR_ALREADY_EXISTS) + TheFirstOne = false; + + bool isParamePresent; + CmdLineParams cmdLineParams; + bool isMultiInst = isInList(FLAG_MULTI_INSTANCE, params); + cmdLineParams._isNoTab = isInList(FLAG_NOTABBAR, params); + cmdLineParams._isNoPlugin = isInList(FLAG_NO_PLUGIN, params); + cmdLineParams._isReadOnly = isInList(FLAG_READONLY, params); + cmdLineParams._isNoSession = isInList(FLAG_NOSESSION, params); + cmdLineParams._langType = getLangTypeFromParam(params); + cmdLineParams._line2go = getNumberFromParam('n', params, isParamePresent); + cmdLineParams._column2go = getNumberFromParam('c', params, isParamePresent); + cmdLineParams._point.x = getNumberFromParam('x', params, cmdLineParams._isPointXValid); + cmdLineParams._point.y = getNumberFromParam('y', params, cmdLineParams._isPointYValid); + + NppParameters *pNppParameters = NppParameters::getInstance(); + // override the settings if notepad style is present + if (pNppParameters->asNotepadStyle()) + { + isMultiInst = true; + cmdLineParams._isNoTab = true; + cmdLineParams._isNoSession = true; + } + + generic_string quotFileName = TEXT(""); + // tell the running instance the FULL path to the new files to load + size_t nrFilesToOpen = params.size(); + const TCHAR * currentFile; + TCHAR fullFileName[MAX_PATH]; + + for(size_t i = 0; i < nrFilesToOpen; i++) + { + currentFile = params.at(i); + //check if relative or full path. Relative paths dont have a colon for driveletter + BOOL isRelative = ::PathIsRelative(currentFile); + quotFileName += TEXT("\""); + if (isRelative) + { + ::GetFullPathName(currentFile, MAX_PATH, fullFileName, NULL); + quotFileName += fullFileName; + } + else + { + quotFileName += currentFile; + } + quotFileName += TEXT("\" "); + } + + //Only after loading all the file paths set the working directory + ::SetCurrentDirectory(NppParameters::getInstance()->getNppPath()); //force working directory to path of module, preventing lock + + if ((!isMultiInst) && (!TheFirstOne)) + { + HWND hNotepad_plus = ::FindWindow(Notepad_plus::getClassName(), NULL); + for (int i = 0 ;!(hNotepad_plus = ::FindWindow(Notepad_plus::getClassName(), NULL)) && i < 5 ; i++) + Sleep(100); + + if (hNotepad_plus) + { + // First of all, destroy static object NppParameters + pNppParameters->destroyInstance(); + MainFileManager->destroyInstance(); + + int sw; + + if (::IsZoomed(hNotepad_plus)) + sw = SW_MAXIMIZE; + else if (::IsIconic(hNotepad_plus)) + sw = SW_RESTORE; + else + sw = SW_SHOW; + + // IMPORTANT !!! + ::ShowWindow(hNotepad_plus, sw); + + ::SetForegroundWindow(hNotepad_plus); + + if (params.size() > 0) //if there are files to open, use the WM_COPYDATA system + { + COPYDATASTRUCT paramData; + paramData.dwData = COPYDATA_PARAMS; + paramData.lpData = &cmdLineParams; + paramData.cbData = sizeof(cmdLineParams); + + COPYDATASTRUCT fileNamesData; + fileNamesData.dwData = COPYDATA_FILENAMES; + fileNamesData.lpData = (void *)quotFileName.c_str(); + fileNamesData.cbData = long(quotFileName.length() + 1)*(sizeof(TCHAR)); + + ::SendMessage(hNotepad_plus, WM_COPYDATA, (WPARAM)hInstance, (LPARAM)¶mData); + ::SendMessage(hNotepad_plus, WM_COPYDATA, (WPARAM)hInstance, (LPARAM)&fileNamesData); + } + return 0; + } + } + + pNppParameters->load(); + Notepad_plus 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; + + winVer curWinVer = notepad_plus_plus.getWinVersion(); + + bool isUpExist = nppGui._doesExistUpdater = (::PathFileExists(updaterFullPath.c_str()) == TRUE); + bool doUpdate = !nppGui._neverUpdate; + bool winSupported = (curWinVer >= WV_W2K); + + // Vista UAC de mes couilles!!! + bool isVista = (curWinVer == WV_VISTA); + + if (!winSupported) + nppGui._doesExistUpdater = false; + + if (TheFirstOne && isUpExist && doUpdate && winSupported && !isVista) + { + Process updater(updaterFullPath.c_str(), version.c_str(), updaterDir.c_str()); + updater.run(); + } + + MSG msg; + msg.wParam = 0; + Win32Exception::installHandler(); + try { + notepad_plus_plus.init(hInstance, NULL, quotFileName.c_str(), &cmdLineParams); + bool unicodeSupported = notepad_plus_plus.getWinVersion() >= WV_NT; + bool going = true; + while (going) + { + going = (unicodeSupported?(::GetMessageW(&msg, NULL, 0, 0)):(::GetMessageA(&msg, NULL, 0, 0))) != 0; + if (going) + { + // if the message doesn't belong to the notepad_plus_plus's dialog + if (!notepad_plus_plus.isDlgsMsg(&msg, unicodeSupported)) + { + if (::TranslateAccelerator(notepad_plus_plus.getHSelf(), notepad_plus_plus.getAccTable(), &msg) == 0) + { + ::TranslateMessage(&msg); + if (unicodeSupported) + ::DispatchMessageW(&msg); + else + ::DispatchMessage(&msg); + } + } + } + } + } catch(int i) { + if (i == 106901) + ::MessageBox(NULL, TEXT("Scintilla.init is failed!"), TEXT("Notepad++ Exception: 106901"), MB_OK); + else { + TCHAR str[50] = TEXT("God Damned Exception : "); + TCHAR code[10]; + wsprintf(code, TEXT("%d"), i); + ::MessageBox(Notepad_plus::gNppHWND, lstrcat(str, code), TEXT("Notepad++ Exception"), MB_OK); + doException(notepad_plus_plus); + } + } 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") +#ifdef UNICODE + TEXT("Code:\t0x%08X\r\nType:\t%S\r\nException address: 0x%08X"), +#else + TEXT("Code:\t0x%08X\r\nType:\t%s\r\nException address: 0x%08X"), +#endif + ex.code(), ex.what(), ex.where()); + ::MessageBox(Notepad_plus::gNppHWND, message, TEXT("Win32Exception"), MB_OK | MB_ICONERROR); + mdump.writeDump(ex.info()); + doException(notepad_plus_plus); + } catch(std::exception ex) { +#ifdef UNICODE + const wchar_t * text = WcharMbcsConvertor::getInstance()->char2wchar(ex.what(), CP_ACP); + ::MessageBox(Notepad_plus::gNppHWND, text, TEXT("C++ Exception"), MB_OK); +#else + ::MessageBox(Notepad_plus::gNppHWND, ex.what(), TEXT("C++ Exception"), MB_OK); +#endif + doException(notepad_plus_plus); + } catch(...) { //this shouldnt ever have to happen + doException(notepad_plus_plus); + } + + return (UINT)msg.wParam; +} + +void doException(Notepad_plus & notepad_plus_plus) { + Win32Exception::removeHandler(); //disable exception handler after excpetion, we dont want corrupt data structurs to crash the exception handler + ::MessageBox(Notepad_plus::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::gNppHWND, displayText.c_str(), TEXT("Recovery success"), MB_OK | MB_ICONINFORMATION); + } else { + ::MessageBox(Notepad_plus::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); + } +} diff --git a/PowerEditor/src/xpm_icons.h b/PowerEditor/src/xpm_icons.h new file mode 100644 index 00000000..f9a8352b --- /dev/null +++ b/PowerEditor/src/xpm_icons.h @@ -0,0 +1,287 @@ +//this file is part of notepad++ +//Copyright (C)2003 Don HO ( donho@altern.org ) +// +//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. +// +//This program is distributed in the hope that it will be useful, +//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. + +static char * acTop_xpm[] = { +"12 12 56 1", +" c #FFFFFF", +". c #8AB2E9", +"+ c #CCDCF6", +"@ c #80ABEA", +"# c #7DA9E8", +"$ c #C7DAF3", +"% c #79A7E6", +"& c #ADC8EF", +"* c #87B0E8", +"= c #BBD2F0", +"- c #6EA0E2", +"; c #A8C7EE", +"> c #A3C2ED", +", c #75A4E3", +"' c #A7C4EB", +") c #6297E1", +"! c #A1C1EC", +"~ c #92B7E8", +"{ c #99BBE9", +"] c #6197DD", +"^ c #96B9E6", +"/ c #538EDB", +"( c #99BBEA", +"_ c #80AAE3", +": c #81ABE3", +"< c #8AB1E4", +"[ c #4B88D6", +"} c #4882D1", +"| c #4384D6", +"1 c #90B5E7", +"2 c #74A3E0", +"3 c #77A4E0", +"4 c #81ABE2", +"5 c #437FD3", +"6 c #7FA2DF", +"7 c #3577D2", +"8 c #87AFE4", +"9 c #72A1DF", +"0 c #7CA9E1", +"a c #3F7AD0", +"b c #85A4DE", +"c c #FBFCFE", +"d c #236ECD", +"e c #7EA8E1", +"f c #79A6E0", +"g c #3D77D0", +"h c #87A4DC", +"i c #1A62C9", +"j c #75A3DF", +"k c #3C74CF", +"l c #8DA6DE", +"m c #1859C4", +"n c #3B71CC", +"o c #8EA5DD", +"p c #164EC0", +"q c #92A7DD", +" .+ ", +" @#$ ", +" %&*= ", +" -;>,' ", +" )!~{]^ ", +" /(_:<[} ", +" |123456 ", +" 7890abc ", +" defgh ", +" ijkl ", +" mno ", +" pq "}; + + +static char * acBottom_xpm[] = { +"12 12 54 1", +" c #FFFFFF", +". c #C4D7F3", +"+ c #72A1E3", +"@ c #C1D6F2", +"# c #6397E1", +"$ c #5990DD", +"% c #BBD2F0", +"& c #7AA6E5", +"* c #9ABDEA", +"= c #4A87D9", +"- c #B1CAEE", +"; c #75A4E3", +"> c #99BBE9", +", c #95B9E8", +"' c #3A7CD4", +") c #A9C6EC", +"! c #71A0E0", +"~ c #86AFE5", +"{ c #8DB2E6", +"] c #2A72CF", +"^ c #73A0E0", +"/ c #6B9DE0", +"( c #95B8E8", +"_ c #81ABE3", +": c #72A1DF", +"< c #83ADE3", +"[ c #1B65C9", +"} c #5F95DC", +"| c #8BB3E5", +"1 c #77A4E0", +"2 c #679ADC", +"3 c #7AA6E1", +"4 c #195CC6", +"5 c #FCFDFE", +"6 c #8DB2E4", +"7 c #4885D6", +"8 c #7CA9E1", +"9 c #6698DB", +"0 c #71A1DE", +"a c #1752C0", +"b c #88ABE0", +"c c #3D77D0", +"d c #6E9FDD", +"e c #699BDC", +"f c #1547BD", +"g c #8DA6DE", +"h c #376BC9", +"i c #6295DA", +"j c #1440B9", +"k c #8DA0DB", +"l c #315FC4", +"m c #1339B7", +"n c #909FDA", +"o c #1233B4", +" .+ ", +" @#$ ", +" %&*= L", +" -;>,' ", +" )!>~{] ", +" ^/(_:<[ ", +" (}|1234 ", +" 567890a ", +" bcdef ", +" ghij ", +" klm ", +" no "}; + +/* XPM */ +static char * bookmark_xpm[] = { +"15 15 64 1", +" c None", +". c #FE0000", +"+ c #9DD3D2", +"@ c #2DC7C9", +"# c #00A0A6", +"$ c #007A76", +"% c #50C4C6", +"& c #02C4C6", +"* c #81C6C7", +"= c #1DBCD9", +"- c #9CCFDA", +"; c #CAECF2", +"> c #8FC8C9", +", c #003236", +"' c #006A96", +") c #0092E6", +"! c #47B0E1", +"~ c #53BAE5", +"{ c #19C5C7", +"] c #003B68", +"^ c #00358E", +"/ c #0048A0", +"( c #005FA8", +"_ c #0065C4", +": c #002040", +"< c #003690", +"[ c #003F9E", +"} c #005BB0", +"| c #004BA8", +"1 c #000636", +"2 c #0040A0", +"3 c #0061C4", +"4 c #0078E8", +"5 c #008AF4", +"6 c #001656", +"7 c #0053B0", +"8 c #0081EE", +"9 c #0994FF", +"0 c #23A4FF", +"a c #1197FF", +"b c #00316E", +"c c #49B4FF", +"d c #53BCFF", +"e c #35ACFF", +"f c #59C2FF", +"g c #6BC8FD", +"h c #62C5FE", +"i c #003B78", +"j c #73D1FD", +"k c #7BD7FD", +"l c #A3D7D7", +"m c #008490", +"n c #003F80", +"o c #0983FF", +"p c #7BDAFD", +"q c #1990FF", +"r c #BEE6E8", +"s c #004A74", +"t c #0088E8", +"u c #19A0FF", +"v c #B6E4E2", +"w c #3DC7C9", +"x c #12C2C4", +"y c #64C6C5", +" +@#$#@+ ", +" %&**+**&% ", +" %&=-;;;-=&% ", +" >,')!~~~!)',> ", +" {]^/(___(/^]{ ", +" :^<[}___}|<^: ", +" 12|3455543|21 ", +" 67389000a8376 ", +" b|8a0cddea8|b ", +" '[5edfghde9[' ", +" >i4cgjkjgc8i> ", +" lmnofjpkfqnml ", +" r*@s(tut(s@*r ", +" v*w{x&x{w*v ", +" l*yyy*l "}; +/* +static char * modifUnsaved_xpm[] = { +"6 18 2 1", +"z c #FF8000", +"o c #FFC000", +"zozozo", +"ozozoz", +"zozozo", +"ozozoz", +"zozozo", +"ozozoz", +"zozozo", +"ozozoz", +"zozozo", +"ozozoz", +"zozozo", +"ozozoz", +"zozozo", +"ozozoz", +"zozozo", +"ozozoz", +"zozozo", +"ozozoz"}; + +static char * modifSaved_xpm[] = { +"6 18 2 1", +"z c #008000", +"o c #FFFFFF", +"zozozo", +"ozozoz", +"zozozo", +"ozozoz", +"zozozo", +"ozozoz", +"zozozo", +"ozozoz", +"zozozo", +"ozozoz", +"zozozo", +"ozozoz", +"zozozo", +"ozozoz", +"zozozo", +"ozozoz", +"zozozo", +"ozozoz"}; +*/ \ No newline at end of file diff --git a/PowerEditor/visual.net/no_ms_shit.vsprops b/PowerEditor/visual.net/no_ms_shit.vsprops new file mode 100644 index 00000000..32fa5ef6 --- /dev/null +++ b/PowerEditor/visual.net/no_ms_shit.vsprops @@ -0,0 +1,11 @@ + + + + diff --git a/PowerEditor/visual.net/notepadPlus.vc.7.0.vcproj b/PowerEditor/visual.net/notepadPlus.vc.7.0.vcproj new file mode 100644 index 00000000..f5b75359 --- /dev/null +++ b/PowerEditor/visual.net/notepadPlus.vc.7.0.vcproj @@ -0,0 +1,1091 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/PowerEditor/visual.net/notepadPlus.vcproj b/PowerEditor/visual.net/notepadPlus.vcproj new file mode 100644 index 00000000..425489dd --- /dev/null +++ b/PowerEditor/visual.net/notepadPlus.vcproj @@ -0,0 +1,1344 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

    WK?oSvD7^j(uf>%` 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%0DZ=-?^#Y{Bn7cyK^FXGKOR7n-NHFxG*c0kGNjFb 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

    %CTcCp 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